Webサービスとかやると、ドメインごとにメールの送受信どうするかな問題が生じる。これの構成は無数に考えられるので、何が最適解かは状況によるだろうが、とりあえず「始めたばかりだしとにかく安上がりでさらっと済ませたい」という要求をかなえるため、送信はAmazon SES、受信はCloudflareのEmail Routing + Gmail(個人用)という構成を組んだ。今のところは問題なさげに動いている。
前提として、ドメインはCloudflareで管理する。
(追記 2024-05-19)この構成だと設定した独自ドメイン同士のメールでエラーが発生した。設定次第でなおせるんだろうか……
全体の構成
全体の構成を図示しておく。
「自分」と「誰かさん」の間でメールを送受信する。送信経路を実線、受信経路を破線とする。
普通にメールサービス使えばいいじゃないか説は有力というかそうすべきなんだろうなぁと思いつつ、そうは言ってもメールサービスは固定費もそこそこかかるし、システム的なメール配信まで考えるとAmazon SESは使えておきたいと思った。SES部分はResendとかでもいい。というかResendで似たようなことをやっている人がいた。
Cloudflare + Gmail + Resendで無料法人メールアドレスを作る
構成一緒だね。皆考えることは同じなのか……。
受信経路
まず先に受信から始める。構成部分は以下。
これはCloudflareのEmail RoutingとGmailを利用する。まぁつまり、CloudflareのEmail Routingの機能でメールをGmailに飛ばすというものだ。機能については公式ページは以下。
Email Routing | アドレス作成とメール転送が簡単に | Cloudflare
無料で使える。よい。
Gmailについては転送先のアドレスとして使えれば良いので別にGmailでなくても良い。良いのだが、メールサービスによってはうまくいかない可能性もあるだろう(送信のところでこれについては触れる)。
さて、この受信についてはやることはあまり多くない。Cloudflareのダッシュボードでドメインを選択し、Email Routingを始め、アドレスと転送先のアドレスを指定するだけでよい。簡単過ぎてビビる。
送信経路
送信のほうは受信と違ってやや手間がかかる。メール送信については運用する側も考えることが多い。
DKIM/SPF/DMARCを知る
具体的にはDKIM/SPF/DMARCの仕組みを定性的に理解していなくてはいけない。これについては下記に記事を書いたので詳細については参考にされたい。
ざっくり言うと、DKIMはメールが改竄されてないことを保証する仕組み、SPFは送信者が信頼できることを保証する仕組み、DMARCはDKIMとSPFをどれくらい厳格に適用し、NGだったらどう対応するのかとかを標準化したポリシーである。で、このためには送信側と受信側の両方できっちり対応している必要がある。
先の受信経路のところで、Gmailじゃなくてもいいけどちゃんと動くかはわからん、と書いたのは、メールサービスがどれくらいちゃんと対応しているかわからんからだ。今回のように転送が入るとややこしくなると思うので、サービスによってはどうなるかわからん。またGmailを使っていても送信側次第では転送落ちるとかありそうな気もする。わからん。怖い。怖いけどとりあえず今のところは使えている。
SESの設定
さて、以上を踏まえたうえで、送信経路について改めて見てみよう。
ポイントはDNSサーバである。DNSサーバに情報登録とあるが、これは何かと言うと、先に述べたDKIM/SPF/DMARCの対応である。DKIM/SPF/DMARCに必要な情報はDNSのレコードに登録するのである。登録する情報の意味については先にあげた記事を参照。
実務的には、SESに「これ登録しろ」と言われるまま、Cloudflareのダッシュボードよりレコード登録をすればいい。具体的な操作は、どうせいつか変わる操作よりも、多少面倒でもDKIM/SPF/DMARCはなんなのかをちゃんと理解するのが一番の近道だと思う。理解すれば何をどうすればいいかはわかる。
SESではDKIM対応がドメイン検証も兼ねているようだ。送信元の登録はSPF対応である。また、DMARCについても書かれているのをそのまま使えばいい。一点注意として、MXレコードの数字は優先順位である(まぁそのまんま値に入れようとしたら怒られるので察しはつくと思うが)。
登録できれば、とりあえずまずAPIで送信確認するとよい。メーラ使うにはSMTPの設定が必要なので、まずAPIで送信確認するほうが楽。SESは最初サンドボックス環境だが、サンドボックスでは認証したメールアドレスしか使えないことに注意。なので、先に受信側の対応をしたわけだ。
なおメールのサンプルコードは以下(By ChatGPT)。
import boto3
from botocore.exceptions import ClientError
# SESクライアントの作成
ses_client = boto3.client('ses', region_name='ap-northeast-1') # ご使用のリージョンに合わせて変更してください
# メールのパラメータ
sender = "sender@example.com" # 送信者のメールアドレス
recipient = "recipient@example.com" # 受信者のメールアドレス
subject = "Hello from Amazon SES"
body_text = "Hello,\r\nThis is a test email sent by Amazon SES using Boto3."
try:
# Send Email
response = ses_client.send_email(
Source=sender,
Destination={'ToAddresses': [recipient]},
Message={
'Subject': {'Data': subject},
'Body': {'Text': {'Data': body_text}}
}
)
print("Email sent! Message ID:", response['MessageId'])
except ClientError as e:
print("An error occurred:", e.response['Error']['Message'])
boto3をインストールしているPCなら、送受信のメールアドレスだけ変えればそのまんま使える。こういうサンプルコード一瞬で出力してくれるだけでも有り難い。
送信できたら、次はSMTPで送れるかを確認する。SESのコンソールにSMTP設定があるのでそこから言われるままにやる……だとアレなんだが、俺たちのクラスメソッドさんに良い記事があるのでそれを参考にどうぞ。
Amazon SES に SMTP認証設定を追加してメールクライアントから SMTPサーバとして利用してみた | DevelopersIO
設定方法はメーラによる。SMTPサーバのみ設定したアカウントを作成する必要があり(受信側がエラー出る)、やや特殊な設定となる。とりあえずMacの標準メールアプリでは設定できた。OutlookはPOPとかでやろうとしてもサインインできないと言われて登録できなかった。あんまり本意気でOutlook使ってないのでわからんが、イマドキのOutlookだとできないのかもしれない。Thunderbirdはできるんじゃないかな多分。
運用
書くほどでもないが。
注意点として、SMTPのパスワード再発行はできない。したがって、パスワード紛失時はユーザの作り直しになる(つまり削除と登録)。
登録
- Cloudflare
- 転送先の宛先の追加
- Routingで宛先に送るアカウントの追加
- SES
- SMTP認証情報の追加(IAMユーザができる)
削除
- Cloudflare
- アカウントの削除
- SES
- ユーザの削除
所感
メールサービスは地味にそこそこの固定費がかかる。多少運用が面倒になってもいいから、とにかく安上がりで自由度があってすぐできることを目標にあれこれ検討した結果こうなった。これが最適解かはわからないけれど、とりあえずいいかなという感じ。そのうちに大きくなってきたらちゃんとメールサービスを使った方がいいかなと思う。
コメント