電子メールサーバを構築する
電子メールを送受信するためのサーバを構築する方法。 必要なサーバ
配送用SMTPサーバ(Mail Transfer Agent: MTA)
他のSMTPサーバからの電子メールを受信するためのSMTPサーバ。
自サーバ宛の電子メールを受信するために必ず必要。
TCPポート番号
25:平文の場合またはSTARTTLSで通信する場合。最初からTLSで通信することはできない。
提出用SMTPサーバ(Mail Submission Agent: MSA) 電子メールクライアントからのSMTPのコマンドを受け付けて、他のSMTPサーバに電子メールを送信するためのSMTPサーバ。
多くのISPは25番ポートへの接続を禁止しているので、電子メールクライアントからSMTPで電子メールを送信するのに事実上必要。
TCPポート番号(電子メールクライアントからSMTPのコマンドを受け付けるためのポートの番号)
自サーバ宛の電子メールを受信した後、その電子メールを電子メールクライアントで閲覧できるようにするために必要。
TCPポート番号
110:POP3平文、POP3 STARTTLS
143:IMAP平文、IMAP STARTTLS
上記の中から、自分に必要な機能の実装に必要なソフトウェアを選んで構築することになる。
例えば、別のアプリから電子メールを送信したいだけであれば、MSAだけでも十分と言えば十分である。
必要なDNSの設定
他のSMTPサーバからメールを受信するために必要。
例:email.mgn901.com宛のメールはsmtp.mgn901.comに転送せよという意味のMXレコード。
code:dns
email.mgn901.com. IN MX 5 smtp.mgn901.com.
他のSMTPサーバが、どのサーバにメールを転送すれば良いかを決めるのに使われる。
MSAを立てて他のSMTPサーバにメールを提出する場合は必要。
PTRレコード
IPアドレスがどのドメイン名と紐付けられているかを示すレコード。
MSAのIPアドレスに対応するPTRレコードが、MSAが名乗るドメイン名と一致しているかを確認するために必要。
異なる場合はMSAが名乗るドメイン名が偽物ということになる。
ドメイン名を管理しているゾーンに書くのではなく、IPアドレスの管理者側で設定する。例えばVPSを使っているならばVPSの管理画面で設定する。
SPFレコード
そのメールアドレスからの電子メールがどのIPアドレスのサーバから送信されるのかを示すレコード。
電子メールのFromヘッダに対応するSPFレコードに書かれたIPアドレスと、MSAの実際のIPアドレスが一致しているかを確認するために必要。
異なる場合は電子メールのFromヘッダが偽物ということになる。
例:email.mgn901.comからの電子メールはすべて192.0.2.1または[2001:db8::192:0:2:1]から配信される、それ以外の電子メールは破棄して良いという意味のSPFレコード。
code:dns
email.mgn901.com. IN TXT "v=spf1 ip4=192.0.2.1 ip6=2001:db8::192:0:2:1 -all"
DKIMレコード
電子メールの送信元を認証する技術であるDKIMでは、MSAが電子メールに電子署名を添付する。DKIMレコードには、その電子署名を検証するための公開鍵を書く。 電子メールのFromヘッダに対応するDKIMレコードに書かれた公開鍵で、電子メールに添付された電子署名の検証に成功するかを確認するために必要。
電子署名の検証に失敗した場合は、電子メールのFromヘッダが偽物ということになる。
例:email.mgn901.comからの電子メールの電子署名の検証に使う公開鍵を書いたDKIMレコード。
code:dns
example._domainkey.email.mgn901.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0MQu+5zId1koLDofBPPCI7rexxsr2kSlO9kMV2bSQR0ckdr8tzp621PbfuUlEC6possBZnqq+NUY/OMq3Zz3Tk1eCkj9GHLgVZwZ1FLS1QeMfW7X3d0MAb8CaEeCObRr0aArGeHrxLxXbeBf3waTHxOJYC0d1Ul+FQc1u7gRNGwIDAQAB"
DMARCレコード
SPFレコードの検証、DKIMの電子署名の検証が失敗した場合、その電子メールをどのように処理するべきかを受信者側に教えるためのレコード。
例:email.mgn901.comからの電子メールの検証に失敗した場合、その電子メールは破棄して良い、集約レポートはrua@email.mgn901.comで受け付ける、という意味のDMARCレコード。
code:dns
_dmarc.email.mgn901.com. IN TXT "v=DMARC1; p=reject; rua=mailto:rua@email.mgn901.com"
昔からあるソフトウェアにカスタマイズを施したDockerコンテナイメージ群、それらを組み合わせたDocker Composeのテンプレート。 mailcowと同種のコンテナイメージ群、テンプレート。
組み合わせられているソフトウェアの多くが、Node.jsでの実装だったり、ファイルシステムではなくMongoDBのようなデータベースにデータを保存する実装だったりして、ポータビリティの良さが魅力的。mgn901.icon Node.js上で動作するPOP3サーバ、IMAPサーバ。メールを保存するためのデータベースとしてMongoDBを採用していて、単一障害点のない構成が可能。 Node.js上で動作するSMTPサーバ。MTA、MSAとして動作させることができる。MSAとして動作させる場合、メールを提出するのにSMTPだけでなくHTTPを使用することもできる。
Node.js上で動作するSMTPサーバ。MTAとして動作させることができる(mgn901.iconは使っていないが、MSAとして動作させることも可能)。
スパムメール判定を行うサーバ。MTAがRspamdに電子メールをスキャンさせ、MTAはそのスキャン結果を基に電子メールを迷惑メールボックスに振り分けたり破棄したりすることができる。 最近のソフトウェアはIMAPSやPOP3Sを喋ることもできるが、アプリケーション側でTLSのことをあまり考えたくないこともある。そのような場合は、HAProxyのようなTLSオフロードができるTCPリバースプロキシを使う手もある。