😽

Cloudflare Email Routing の Email Workers を試す

2023/06/11に公開

前回の記事では、Cloudflare Email Routingを試しました。Email RoutingとはPOPを持たないマネージド型のMTAで、メール転送を行います。
例えば以下の設定の場合、test@harunobukameda.labrat.online宛のメールを指定したアドレスに転送します。

この際単純な転送ではなくEmail Workersを用いることで、メールを一度JavaScriptで操作した後転送させることが可能です。

さっそくやってみる

Email RoutingのEmail WorkersのタブからCreateを押します。

以下4つのテンプレートがあらかじめセットされています。

今回はAllowlist sendersを指定します。つまり、定められた送信者が送ったメールのみが転送されます。
以下のようにカスタマイズしてSave and Deployを押します。

export default {
  async email(message, env, ctx) {
    const isContained=message.headers.get("from").includes("harunobukameda@gmail.com");
    console.log(isContained);
    if (isContained==false) {
      message.setReject("Address not allowed");
    } else {
      console.log("fowarded");
      await message.forward("harunobu@cloudflare.com");
    }
  }
}

このサンプルはCloudflare documentの内容を少しカスタマイズしています。

const allowList = ["friend@example.com", "coworker@example.com"];    
    if (allowList.indexOf(message.from) == -1) {

の部分ですが正常動作しないためです。Emailの送信者情報は例えば
\"亀田治伸\" <harunobukameda@gmail.com>のような情報は入るため単純なメールアドレス一致確認では不十分なためです。また私が書き換えた上記サンプルでは例えばtestharunobukameda@gmail.com.comなどもTrueを戻してしまうため、実際に使うにはもう少し正規表現が必要です。
またmessage.fromを代わりに用いることでメールアドレスのみを抜き出すことも可能です。

その後RoutesタブのEditから以下のように転送先をWorkersに変更します。

この例では、allowList.indexOf(message.headers.get("from")に含まれているメールアドレスから送付されたメールのみがmessage.forwardの指定されたあて際に転送されます。
エラーの場合、送信者に以下のエラーが戻ります。

この際表示されているエラーメッセージは上記JavaScriptの

      message.setReject("Address not allowed");

で指定されたものです。

message オブジェクト

このスクリプトで持ちいているmessageオブジェクトの定義はここにあります。

Discussion