前言
写脚本的时候,里面需要用到CloudFlare电子邮件路由,因为是想实现“临时邮箱”的功能,所以总不可能去一个一个输入。
于是去翻了CloudFlare的官方API文档,不幸的是,在官方的API文档中并没有关于电子邮件路由的介绍。?
于是将目标改向了CloudFlare的仪表盘。通过简单的抓包,找到了仪表盘的请求url:https://dash.cloudflare.com/api/v4/zones/ZONE_ID/
。发现它和CloudFlare的官方API接口很像(CloudFlare官方API接口:https://api.cloudflare.com/client/v4/zones/ZONE_ID/
)。
如果能够直接请求官方的API接口,那么就可以避免复杂的登录操作。很幸运的是,我成功了,看起来,就像上一篇文章中的“google”参数一样,即便已经可以使用了,但CloudFlare并没有更新他们API文档。
通过curl调用API
添加电子邮件路由
curl -X POST https://api.cloudflare.com/client/v4/zones/ ZONE_ID /email/routing/rules \
-H "Content-Type: application/json" \
-H "X-Auth-Key: GLOBAL_KEY " \
-H "X-Auth-Email: EMAIL " \
--data '{"actions":[{"type":"forward","value":[" 目标EMAIL "]}],"matchers":[{"type":"literal","field":"to","value":" 前缀@域名 "}]}'
获取全部的电子邮件路由
curl -X GET https://api.cloudflare.com/client/v4/zones/ ZONE_ID /email/routing/rules \
-H "Accept: */*" \
-H "X-Auth-Key: GLOBAL_KEY " \
-H "X-Auth-Email: EMAIL "
删除全部电子邮件路由
curl -X PUT https://api.cloudflare.com/client/v4/zones/ ZONE_ID /email/routing/rules \
-H "Accept: */*" \
-H "Content-Type: application/json" \
-H "X-Auth-Key: GLOBAL_KEY" \
-H "X-Auth-Email: EMAIL" \
--data '[{"matchers":[{"type":"all"}],"actions":[{"type":"forward","value":[" 目标MAIL "]}]}]'
参数解释
ZONE_ID: CloudFlare区域ID
GLOBAL_KEY: CloudFlare的Global API Key
MAIL: CloudFlare绑定的电子邮件
目标MAIL: 电子邮件路由中已验证的目标地址
前缀@域名: 需要的电子邮件地址
为什么是删除全部电子邮件路由?
首先,我们注意到,在创建电子邮件路由的时候,发送的json中包含着两个参数matchers和actions。
其中matchers参数用来指定需要路由的电子邮件,actions参数用来指向目标电子邮件。
在删除的时候,在这里使用的并非DELETE请求而是PUT请求,所以所谓的删除,其实是编辑。对于每一个电子邮件路由,都有一个类似于{"matchers":[],"actions":[]}的json数据。在进行编辑时,我们将每一个这样的json数据放在[]中,类似于[{"matchers":[],"actions":[]},{"matchers":[],"actions":[]}]。这时我们需要注意,在CloudFlare的电子邮件路由中含有一个matchers参数为{"type":"all"}的一组数据,也就是无论我们最后需要发送多少组json数据,他都应该像这样[{"matchers":[],"actions":[]},{"matchers":[],"actions":[]},{"matchers":{"type":"all"},"actions":[]]}。而当我们只发送含有"matchers":{"type":"all"}参数的json数据的时候,会将其他全部的数据删除掉。
通过Python调用API
import json
import requests
class CloudFlareMail:
global_key = ''
cloudflare_mail = ''
def __init__(self, zone_id):
self.zone_id = str(zone_id)
self.url = f'https://api.cloudflare.com/client/v4/zones/{self.zone_id}/email/routing/rules'
def add_mail_route(self, mail_from, mail_to): # 添加电子邮件路由
headers = {"Content-Type": "application/json", "X-Auth-Key": self.global_key,"X-Auth-Email": self.cloudflare_mail}
data = '{"enabled":true,"name":"","actions":[{"type":"forward","value":["' + str(mail_to) + '"]}],"matchers":[{"type":"literal","field":"to","value":"' + str(mail_from) + '"}]}'
response = requests.post(self.url, headers=headers, data=data)
if response.status_code == 200:
return True
else:
return False
def get_mail_route(self): # 获取全部的电子邮件路由
headers = {"Accept": "*/*", "X-Auth-Key": self.global_key, "X-Auth-Email": self.cloudflare_mail}
response = requests.get(self.url, headers=headers)
if response.status_code == 200:
return response.text
else:
return False
def del_mail_route(self, mail_from): # 删除电子邮件路由
headers = {"Accept": "*/*", "Content-Type": "application/json", "X-Auth-Key": self.global_key, "X-Auth-Email": self.cloudflare_mail}
mail_routes = json.loads(self.get_mail_route())['result']
data = '['
for mail_route in mail_routes:
if mail_route['matchers'][0]['type'] == 'all':
data = data + f'{{"matchers":{mail_route["matchers"]},"actions":{mail_route["actions"]}}},'
else:
if mail_route['matchers'][0]['value'] == str(mail_from):
pass
else:
data = data + f'{{"matchers":{mail_route["matchers"]},"actions":{mail_route["actions"]}}},'
data = data.strip(',') + ']'
data = data.replace(' ', '').replace('\'', '\"')
response = requests.put(self.url, headers=headers, data=data)
if response.status_code == 200:
return True
else:
return False
使用
更改global_key和cloudflare_mail两个参数
通过
example = CloudFlareMail("区域ID")
的方式来创建对象。
通过
example.add_mail_route("电子邮件路由")
的方式添加电子邮件路由,返回True/False。
通过
example.del_mail_route("电子邮件路由")
的方式删除电子邮件路由,返回True/False。
使用del_mail_route()时会自动更改put时请求的参数,只需要给出需要删除的电子邮件路由即可。