使用 Swift 从您的 Cloudflare 域名发送电子邮件
自从为 Cloudflare Workers 客户推出免费电子邮件发送 API 以来,我们一直很荣幸能够提供一个简单而有效的解决方案,以最小的设置复杂度从 Workers 代码发送消息。 遗憾的是,我们很遗憾地宣布,这项免费服务将于 2024 年 6 月 30 日结束。
阅读完整公告 此处
由于无法再通过 cloudflare worker 使用 mailchannels 发送电子邮件,此软件包将无法工作。
MailChannels Send API 允许您从 Cloudflare Workers 应用程序发送电子邮件。了解有关 MailChannels 的更多信息 此处
您无需拥有 MailChannels 帐户即可开始发送电子邮件
但是,您需要拥有一个域名锁定 DNS 记录,授权您的 Worker 为您的域名发送电子邮件。
对于我们的用例,请执行以下操作
以下记录是 SPF 正常工作所必需的。
位置 | 记录类型 | 值 |
---|---|---|
example.com | TXT | v=spf1 a mx include:relay.mailchannels.net ~all |
_mailchannels.example.com | TXT | v=mc1 cfid=myapp.workers.dev |
将 example.com
替换为您的域名。
您很可能已为您的域名配置了电子邮件路由,因此,您有一个指向您域名根目录的现有 TXT 记录。
在这种情况下,请将您的记录更新为类似 v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net ~all
的内容
将 cfid=myapp.workers.dev
替换为负责电子邮件的 worker 的 cfid
(更多信息请参见第 2 节)。
您的 cfid 位于 dash.cloudflare.com > Workers & Pages > Overview。在页面右侧的“Your subdomain”下方。
在 Workers & Pages Overview 页面上,单击 Create Application。
创建并部署 Hello World 脚本。 您只能在部署后编辑 worker。
将代码替换为以下内容,然后单击保存并部署。
async function readRequestBody(request) {
const { headers } = request;
const contentType = headers.get("content-type") || "";
if (contentType.includes("application/json")) {
return JSON.stringify(await request.json());
} else {
return '{"success":false}';
}
}
async function handleRequest(request) {
let start = Date.now();
let reqBody = await readRequestBody(request);
let sendRequest = new Request("https://api.mailchannels.net/tx/v1/send", {
method: "POST",
headers: {
"content-type": "application/json",
},
body: reqBody,
});
let resp = await fetch(sendRequest);
let respText = await resp.text();
let end = Date.now();
let total = end - start;
return new Response(respText, {
headers: {
"X-MC-Status": `${resp.status}`,
"X-MC-Status-Text": resp.statusText,
"X-Response-Time": `${total}`,
},
});
}
addEventListener("fetch", (event) => {
const { request } = event;
if (request.method === "POST") {
return event.respondWith(handleRequest(request));
} else if (request.method === "GET") {
return event.respondWith(new Response(`The request was a GET`));
}
});
记下您的 worker 的域名,您将在第 3 节中需要它
首先,添加 CloudflareDomainsEmailKit 依赖项
.package(url: "https://github.com/iankoex/CloudflareDomainsEmailKit.git", from: "0.1.4")
并将其添加为目标的依赖项
.product(name: "CloudflareDomainsEmailKit", package: "CloudflareDomainsEmailKit")
创建内容。
let content = EmailContent(
personalizations: [
EmailContent.Personalization(
recipients: [
MailUser(name: "User 1", email: "username@email.com")
]
)
],
from: MailUser(name: "Support", email: "support@example.com"),
subject: "Your App Data",
content: [
EmailContent.EmailBody(type: .plainText,value: "This is the email's body")
]
)
发送电子邮件。
try await EmailClient.sendMail(content: content, using: "https://app.workers.dev/")