使用 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/")