学习笔记 | Cloudflare 邮箱实现自动回复
<h2 id="前言">前言</h2>
<p>也许你需要为你的 Cloudflare 实现一个自动回复?</p>
<p>不管如何,我是需要的,但网络上资料又确实不多(至少我并未在中文互联网中找到),因而在此记录。</p>
<h2 id="原理">原理</h2>
<p>理所当然也别无选择地,我们使用 Cloudflare Workers 下的 Email Workers 实现。</p>
<p>根据<a class="link" href="https://developers.cloudflare.com/email-routing/email-workers/reply-email-workers/" target="_blank" rel="noopener"
>官方文档给出的回复方法</a>,我们需要使用 mimetext 中的 createMimeMessage,因此没办法像<a class="link" href="https://blog.reincarnatey.net/2024/0803-cloudflare-email-worker-forward-more/" target="_blank" rel="noopener"
>上次</a>一样直接在线编辑了,必须要在本地开发好后部署。</p>
<h2 id="安装-wrangler">安装 Wrangler</h2>
<p>Wrangler 是 Cloudflare 官方推出的命令行界面(CLI)工具,专门用于管理和开发 Cloudflare Workers 以及其他相关的开发者平台产品。</p>
<p>我们要在本地进行 Worker 的开发,所以先来安装 Wrangler,需要用到 npm。</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>npm install -g wrangler
</span></span></code></pre></div><p>安装完成后使用以下命令登录,在弹出的窗口中登录 Cloudflare 并授权。</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>wrangler login
</span></span></code></pre></div><h2 id="创建项目">创建项目</h2>
<p>接着在你希望创建项目的目录下打开 cmd(用 powershell 可能因为禁止运行脚本而出错),新建项目。</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>wrangler init auto-reply
</span></span></code></pre></div><p>过程中需要回答一些问题,按照自己的情况选即可,使用方向键选择。</p>
<p>这里我们只是想实现一个邮箱自动回复,模版选择 <code>Hello World example</code> 的 <code>Worker only</code> 即可,语言推荐 JavaScript(文档使用的语言),其他的随意。</p>
<p>等待一段时间,项目目录就创建好了。</p>
<p>因为要使用 Node.js 库,因此需要修改项目配置,启用 Node.js 兼容。</p>
<p>项目目录下的 <code>wrangler.jsonc</code> 是项目配置文件,我们在里面添加:</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#98c379">"compatibility_flags"</span>: [
</span></span><span style="display:flex;"><span> <span style="color:#98c379">"nodejs_compat"</span>
</span></span><span style="display:flex;"><span>]
</span></span></code></pre></div><p>就完成项目配置了。</p>
<h2 id="安装-mimetext-并编写代码">安装 mimetext 并编写代码</h2>
<p>在项目目录下运行 cmd,输入命令安装。</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>npm install mimetext
</span></span></code></pre></div><p>然后修改 <code>src/index.js</code> 为下方代码,并修改注释标记的三处配置,就完成了。</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#c678dd">import</span> { <span style="color:#e06c75">EmailMessage</span> } <span style="color:#e06c75">from</span> <span style="color:#98c379">"cloudflare:email"</span>;
</span></span><span style="display:flex;"><span><span style="color:#c678dd">import</span> { <span style="color:#e06c75">createMimeMessage</span> } <span style="color:#e06c75">from</span> <span style="color:#98c379">"mimetext"</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#c678dd">export</span> <span style="color:#c678dd">default</span> {
</span></span><span style="display:flex;"><span> <span style="color:#c678dd">async</span> <span style="color:#e06c75">email</span>(<span style="color:#e06c75">message</span>, <span style="color:#e06c75">env</span>, <span style="color:#e06c75">ctx</span>) {
</span></span><span style="display:flex;"><span> <span style="color:#7f848e">// 配置发件人信息
</span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">senderName</span> <span style="color:#56b6c2">=</span> <span style="color:#98c379">"no-reply"</span>;
</span></span><span style="display:flex;"><span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">senderAddress</span> <span style="color:#56b6c2">=</span> <span style="color:#98c379">"<SENDER>@example.com"</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">msg</span> <span style="color:#56b6c2">=</span> <span style="color:#e06c75">createMimeMessage</span>();
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setHeader</span>(<span style="color:#98c379">"In-Reply-To"</span>, <span style="color:#e06c75">message</span>.<span style="color:#e06c75">headers</span>.<span style="color:#e06c75">get</span>(<span style="color:#98c379">"Message-ID"</span>));
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setSender</span>({ <span style="color:#e06c75">name</span><span style="color:#56b6c2">:</span> <span style="color:#e06c75">senderName</span>, <span style="color:#e06c75">addr</span><span style="color:#56b6c2">:</span> <span style="color:#e06c75">senderAddress</span> });
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setRecipient</span>(<span style="color:#e06c75">message</span>.<span style="color:#e06c75">from</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#7f848e">// 配置邮件标题和内容
</span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setSubject</span>(<span style="color:#98c379">"自动回复"</span>);
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">addMessage</span>({
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">contentType</span><span style="color:#56b6c2">:</span> <span style="color:#98c379">'text/plain'</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">data</span><span style="color:#56b6c2">:</span> <span style="color:#98c379">`我们已收到您的邮件`</span>
</span></span><span style="display:flex;"><span> });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">replyMessage</span> <span style="color:#56b6c2">=</span> <span style="color:#c678dd">new</span> <span style="color:#e06c75">EmailMessage</span>(
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">senderAddress</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">message</span>.<span style="color:#e06c75">from</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">asRaw</span>()
</span></span><span style="display:flex;"><span> );
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#c678dd">await</span> <span style="color:#e06c75">message</span>.<span style="color:#e06c75">reply</span>(<span style="color:#e06c75">replyMessage</span>);
</span></span><span style="display:flex;"><span> <span style="color:#7f848e">// 当然,不能光回复,还要将邮件转发到你接受邮件的邮箱,这个邮箱需要在 Cloudflare Email Routing 里验证过
</span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span> <span style="color:#c678dd">await</span> <span style="color:#e06c75">message</span>.<span style="color:#e06c75">forward</span>(<span style="color:#98c379">"example@example.com"</span>);
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="部署">部署</h2>
<p>最后,在项目目录下运行以下命令部署到云端。</p>
<div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>wrangler deploy
</span></span></code></pre></div><p>接着,打开你的 Cloudflare Dashboard,来到对应域名的 Email Routing 电子邮件路由页面,查看电子邮件 Workers,可以发现刚刚部署的已经出现在上面了,将其分配给对应的邮箱地址即可。</p>
<p>注意需要等待约半分钟才会生效。</p>
<p>可以给自己发一条邮件测试,发现成功收到了自动回复。</p>
<h2 id="附录">附录</h2>
<h3 id="参考文献">参考文献</h3>
<ol>
<li><a class="link" href="https://developers.cloudflare.com/email-routing/email-workers/reply-email-workers/" target="_blank" rel="noopener"
>官方文档</a></li>
<li><a class="link" href="https://github.com/mgmgprndev/CloudflareEmailWorker_AutoReply?tab=readme-ov-file" target="_blank" rel="noopener"
>mgmgprndev/CloudflareEmailWorker_AutoReply 项目</a></li>
<li><a class="link" href="https://blog.csdn.net/Tisfy/article/details/144488128" target="_blank" rel="noopener"
>Cloudflare workers - 如何使用(起步篇)</a></li>
<li><a class="link" href="https://fe.azhubaby.com/BackEnd/cloudflare/worker.html#%E9%80%9A%E8%BF%87-wrangler-%E9%83%A8%E7%BD%B2" target="_blank" rel="noopener"
>Cloudflare菩萨系列:workers 使用指南</a></li>
<li><a class="link" href="https://yangzh.cn/posts/cloudflare/wrangler" target="_blank" rel="noopener"
>Wrangler 入门:开启你的 Cloudflare Serverless 之旅</a></li>
<li><a class="link" href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag" target="_blank" rel="noopener"
>官方文档 - Compatibility flags</a></li>
</ol>
<h3 id="版权信息">版权信息</h3>
<p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener"
>reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>