電子メールサーバを構築する
電子メールを送受信するためのサーバを構築する方法。
必要なサーバ
配送用SMTPサーバ(Mail Transfer Agent: MTA)
他のSMTPサーバからの電子メールを受信するためのSMTPサーバ。
自サーバ宛の電子メールを受信するために必ず必要。
TCPポート番号
25:平文の場合またはSTARTTLSで通信する場合。最初からTLSで通信することはできない。
提出用SMTPサーバ(Mail Submission Agent: MSA)
電子メールクライアントからのSMTPのコマンドを受け付けて、他のSMTPサーバに電子メールを送信するためのSMTPサーバ。
多くのISPは25番ポートへの接続を禁止しているので、電子メールクライアントからSMTPで電子メールを送信するのに事実上必要。
TCPポート番号(電子メールクライアントからSMTPのコマンドを受け付けるためのポートの番号)
465:SMTPS(HTTPSのように最初からTLSで通信する場合)
587:平文の場合またはSTARTTLSで通信する場合
IMAPサーバ、POP3サーバ
自サーバ宛の電子メールを受信した後、その電子メールを電子メールクライアントで閲覧できるようにするために必要。
TCPポート番号
110:POP3平文、POP3 STARTTLS
143:IMAP平文、IMAP STARTTLS
993:IMAPS
995:POP3S
上記の中から、自分に必要な機能の実装に必要なソフトウェアを選んで構築することになる。
例えば、別のアプリから電子メールを送信したいだけであれば、MSAだけでも十分と言えば十分である。
必要なDNSの設定
MXレコード
他のSMTPサーバからメールを受信するために必要。
例:email.mgn901.com宛のメールはsmtp.mgn901.comに転送せよという意味のMXレコード。
code:dns
email.mgn901.com. IN MX 5 smtp.mgn901.com.
他のSMTPサーバが、どのサーバにメールを転送すれば良いかを決めるのに使われる。
PTRレコード、SPFレコード、DKIMレコード、DMARCレコード
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-mail-server
GitHubリポジトリ:GitHub - docker-mailserver/docker-mailserver: Production-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.
ドキュメンテーション:Home - Docker Mailserver
PostfixやDovecotといった昔からあるソフトウェアを組み合わせて一つのDockerコンテナイメージにしたもの。
mailcow
GitHubリポジトリ:GitHub - mailcow/mailcow-dockerized: mailcow: dockerized - 🐮 + 🐋 = 💕
Webサイト:mailcow: dockerized - Blog
昔からあるソフトウェアにカスタマイズを施したDockerコンテナイメージ群、それらを組み合わせたDocker Composeのテンプレート。
mailu
GitHubリポジトリ:GitHub - Mailu/Mailu: Insular email distribution - mail server as Docker images
ドキュメンテーション:Mailu — Mailu, Docker based mail server
mailcowと同種のコンテナイメージ群、テンプレート。
wildduck-dockerized
GitHubリポジトリ:GitHub - nodemailer/wildduck-dockerized: Wildduck: dockerized - 🦆+🐋=❤
Zone(エストニアの通信事業者)が公開しているソフトウェアであるWildduck Mail Server、ZoneMTAといったソフトウェアを組み合わせたDocker Composeテンプレート。
組み合わせられているソフトウェアの多くが、Node.jsでの実装だったり、ファイルシステムではなくMongoDBのようなデータベースにデータを保存する実装だったりして、ポータビリティの良さが魅力的。mgn901.icon
Wildduck Mail Server
GitHubリポジトリ:GitHub - zone-eu/wildduck: Opinionated email server
ドキュメンテーション:Wildduck Mail Server | Wildduck Mail Server
Node.js上で動作するPOP3サーバ、IMAPサーバ。メールを保存するためのデータベースとしてMongoDBを採用していて、単一障害点のない構成が可能。
ZoneMTA
GitHubリポジトリ:GitHub - zone-eu/zone-mta: 📤 Modern outbound MTA cross platform and extendable server application
Node.js上で動作するSMTPサーバ。MTA、MSAとして動作させることができる。MSAとして動作させる場合、メールを提出するのにSMTPだけでなくHTTPを使用することもできる。
プラグインのzonemta-wildduck(GitHub - zone-eu/zonemta-wildduck: Wild Duck MSA plugin for ZoneMTA)を使用すると、WildDuckのデータが入っているMongoDBデータベースを読み取って、WildDuckに登録されているユーザだけが使用できるMSAになる。
zonemta-wildduckインストール済のZoneMTAのDockerコンテナイメージも配布されている。
Haraka
GitHubリポジトリ:GitHub - haraka/Haraka: A fast, highly extensible, and event driven SMTP server
ドキュメンテーション:Haraka SMTP Email Server · Haraka
Node.js上で動作するSMTPサーバ。MTAとして動作させることができる(mgn901.iconは使っていないが、MSAとして動作させることも可能)。
プラグインのharaka-plugin-wildduck(GitHub - zone-eu/haraka-plugin-wildduck: Wild Duck plugin for Haraka)を使用すると、WildDuckのデータが入っているMongoDBデータベースを読み取って、WildDuckに登録されているユーザのメールボックスにメールを振り分けるMTAになる。
haraka-plugin-wildduckインストール済のHarakaのコンテナイメージも配布されている。
Rspamd
GitHubリポジトリ:GitHub - rspamd/rspamd: Rapid spam filtering system.
Webサイト:Rspamd - Open Source Email Security
スパムメール判定を行うサーバ。MTAがRspamdに電子メールをスキャンさせ、MTAはそのスキャン結果を基に電子メールを迷惑メールボックスに振り分けたり破棄したりすることができる。
最近のソフトウェアはIMAPSやPOP3Sを喋ることもできるが、アプリケーション側でTLSのことをあまり考えたくないこともある。そのような場合は、HAProxyのようなTLSオフロードができるTCPリバースプロキシを使う手もある。