小規模低コストでメール配信・メールサーバまとめ(独自ドメイン, Cloudflare, Postfix, SendGrid, SPF/DKIMなど)

例え小規模サービスでも、フロントエンドエンジニアがざっくりサーバ構築している程度ではハードルが高いメール配信関連。メールサーバ構築だけでも色々面倒なのに、迷惑メールフィルタに入らないよう工夫したり考えることが沢山あります。

ということで備忘録兼ねて考えまとめます。随時更新していきます。

小規模サービスでも最低限必要なメール機能とは

私が考える上では、以下はマストに近いのではないでしょうか。(独自ドメインで)

  • noreply@〜などトランザクションメール(仮登録やお問い合わせ完了時の自動返信)
  • support@〜など営業・返信などに利用するメール(お問い合わせフォームの返信用)

なお、noreply@〜は送信だけ、supportは送受信可能が望ましい。メルマガ配信や通知メールとか考えるとカオスになってくるので、小規模サービスに最低限必要な要素のみ。

Webサーバとメールサーバは分けたい!しかし無駄なコストは掛けたくない!そんな時の対策

先に結論を書いておきます。条件次第になりますが、ざっくりまとめるとこうかな?なお、Webサーバとメールサーバを同居しても良い人(Cloudflare使わない)は、費用面だけで考えるなら、WebサーバにPostfix入れて運用するという選択肢が無難。環境構築など手間ですが、ゴニョゴニョ考えるより作ったほうが早いぜって場合も多いかと。

できるだけメールサーバにお金払いたくない場合

  • noreply@〜は、WebサーバのIPアドレスを隠蔽する場合、Webサーバ→「XREA無料もしくは有料のMail&Backupサーバ」にPOSTし、XREAからsendmailする。
  • noreply@〜の数が結構多い場合は、SendGridも併用してメール配信を最適化する。月12,000通までは無料で使えるので試しても良い(Webサーバ→XREA→SendGrid)
  • support@〜は、XREA無料もしくは有料のMail&Backupで「default@〜」メールアドレスを作成。独自ドメインは無料でも100個、有料だと無制限に作成可能。
  • ただしXREAの安定性やメール到達率など不安。重要なメールにはおすすめしない。

お金で解決する場合(月額500円〜1000円程度)

  • noreply@〜は、WebサーバのIPアドレスを隠蔽する場合、自前でメールサーバ(VPS)を構築。Webサーバ→「メールサーバ」にPOSTし、メールサーバからsendmail。
  • noreply@〜の数が結構多い場合は、SendGridも併用してメール配信を最適化する。月12,000通までは無料で使える(Webサーバ→メールサーバ→SendGrid)
  • support@〜は有料Gmail(G Suite)。セカンダリドメインがいい感じであれば600個のドメインでGmailが使えるようになり、noreply@〜も少しならGmail経由で送れる。
    ※その場合は、Webサーバ→メールサーバ→Gmail(SMTP)のような流れ。

この判断に至るまで

私が運営するサービスに限って言えば、セキュリティ的な観点からWebサーバのIPを隠蔽しておきたいという意図があります。ある程度サイトが育つと、競合などからサーバを攻撃されるケースもありますが、Cloudflare を使えば元のIPを隠蔽することが可能なので、DDOSやクラッキングされるリスクが(完全ではないにせよ)減らせるんですよね。

また、同じサーバで運営している他サービスを隠蔽することができるので、(もはや死語な気もしますが)SEOに良いと言われていたIP分散という観点でも悪くないです。

ところが、Webサーバ兼メールサーバにしてしまうと、せっかく Cloudflare などでIPアドレスを隠していても、MXレコードやメール送受信のタイミングでバレます。しかも、トランザクションメールに関しては、PHPMailerで送ろうがSendGridのAPI(Web, SMTP)を使おうが、メールヘッダ(Received)にWebサーバのIPが記載されていました。

一応Postfxの header_checks をいじったりしましたが、多分消せない気がします…。

そのため、

「送受信用のメールアドレスには有料版Gmail(G Suite)を利用し、トランザクションメールは、Webサーバから直接SMTPやSendGridを呼び出さず、一旦メール送信用サーバにデータをPOSTして、送信用サーバからsendmailもしくはSendGridのAPIを叩く。」

このような形が安全そうで、実際に隠蔽できているようです。ただ、「会員登録やお問い合わせの返信程度で、毎月無駄なお金を払いたくない」という状況の方も多いのでは?

選択肢1 [無料〜月80円程度]XREA

そこで最初に考えたのは、VALUE DOMAIN でドメインを申し込むともらえるXREAの無料サーバからメール配信するという方法。ただし、無料ではメールサーバのみの利用は禁止されていて、XREAにドメインのDNS(Aレコード)が向けられていないと使えません。

つまり Cloudflare で利用しているドメインは使えないということになります。

んじゃ有料版を使おうかってことになりますが、無料にこだわるなら、サブドメインだけXREAに向けるという手もあります。example.com は Cloudflare に向いてるけど、mail.example.com の AレコードとMXレコードをXREAに向ければ一応送受信可能でした。

a mail xxx.xxx.xxx.xxx(XREAサーバのIP)
mx mail.example.com. 10 mail
txt mail v=spf1 mx ~all

http://qiita.com/ryounagaoka/items/931081c74b5c7a9b2bff

メールアドレスは100個まで利用できるようです。見たところドメインの個数制限は無さそうで、例えば100個分のinfo@〜を作るような形でも大丈夫そうです。さすがですね。

ちなみにXREAでは、「default」と設定することで、hoge@mail.example.com でも fuga@mail.example.comでも送受信ができるようになります。XREAの管理画面より、「ドメインメール」の設定ページへ進み、以下のように設定すればOK。

default@mail.example.com

心配なのは、XREAの規約としては大丈夫なのかな?という点と、mail.example.com のようなサブドメイン込みのアドレスになってしまうことですね。そこで、有料でメールサーバを借りるという選択になりますが、XREAの「Mail&Backup」だと月額80円前後なので、例え趣味レベルのサービスでも妥協できる範囲なのかなと思います。

「さくらのメールボックス」などもありますが、独自ドメインが20個までしか使えないようです。Mail&Backupは無制限なので、コチラの方がコスパは良いと思います。

しかし、XREAだろうとさくらだろうと、格安共有サーバでメールを送っている限り、安定性や到達率は心配になります。以前はよく迷惑メール扱いされてしまったり、メールが届かないなどトラブルもありました。重要なメールにはおすすめできないですね。。

選択肢2 [従量課金]SendGrid でメール配信

「メールサーバ」ではなく、「メール配信システム」 といったキーワードで検索していると、SendGrid というクラウドサービスが良さ気で、どうやら月12,000通までなら無料で使えること、迷惑メールに入らないよう工夫されていること、小規模から大規模までいい感じに使えることがわかりました。ということで試してみました。

結論としては受信が心配です。というのも SendGrid は基本的にメールを受信/転送するという機能はなく、指定したURLにPOSTするというWebhook機能しかありません。これはこれで素敵な機能ですが、何らかのトラブルでPOST先のサーバが繋がらない場合、メールが届かないということになりますよね(うまい方法あるのかな?)。

noreplyを送る分には申し分ないと思いますが、できれば転送機能ぐらいあれば嬉しかったのですね。。まぁメール配信に特化してるサービスなので仕方ないと思います。本格的に利用するとしても、あくまでトランザクションメールのみという形になるでしょうね。

選択肢3 [月額500円〜]VPS借りてPostfixでメールサーバ構築

よって、結局VPSを借りたほうがって話になりますが、最安でも月額500円前後にはなります。まともなレベルだと1000円前後。しかも冒頭で伝えた通り、メールサーバ構築やら、迷惑メール扱いされないように工夫するなど考えることが多いです。

メールサーバ保守に工数かけるぐらいなら、サービス開発など別の業務に集中したい。しかしXREAみたいな格安サーバは心配…。ちょうどいいサービスは無いのでしょうか。

選択肢4 [月額500円〜]有料版Gmail(G Suite)

一周回って、改めてG Suiteを検討してみます。私は無料で作成できた時代のアカウントを一つ持っているので、まずはそれで試してみます。「ドメインエイリアス」という機能が今も無料で使えるので試してみました。20個までしか作成できませんが。

結論としては、ドメインエイリアスは受信には良いですが送信時にはクセが強いのでおすすめできません。このページを参考にしながら試してみましたが、メールヘッダーを見ると署名などでプライマリのメールアドレスが記載されており、プライマリのドメインをユーザーに隠しておきたい場合には不向きのように思います。
https://terakoya.site/team-dev/google-apps-domain-add/

隠すつもりじゃなくても、少し怪しいメールだと思われるでしょう。

また、変更できるのはドメイン部分だけです。例えば info@example.com というユーザーを作成した場合、ドメインエイリアスは info@alias.com のようなドメイン部分のみの変更となり、infoの部分を変えるにはユーザー追加が必要になります。少し手間ですね。

有料版では、セカンダリドメインと呼ばれる似たような機能があるようで、これならいい感じに使えるかもしれません。 ドメインも600個まで追加できるようです。

まとめ

そんな経緯で、冒頭で書いた結論になりました。私はサービスによってXREAにしたりVPSにしたりと臨機応変に対応しています。あまりまとまっていないですが参考程度に。

メール転送はWebサーバのPostfixで十分

ところで、エンジニア向けのアラートメールや、お問い合わせがあったことを知らせる通知メールに関しては、ここまで大げさに考える必要ありません。WebサーバのPostfixで十分で、適当に自分のGmail等に転送してしまえば問題ありません。

迷惑メールに入らないよう、Gmail側で除外設定などすればいいかと思います。

service postfix stop
vi /etc/sysconfig/iptables
# 環境によりますが自分は以下をApacheなど許可してる場所付近に追記したらOKだった
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
service iptables restart

vi /etc/postfix/main.cf
#下部に以下を追加
inet_interfaces = all
virtual_alias_domains = example.com,example2.com(カンマ区切りで複数追加)
virtual_alias_maps = hash:/etc/postfix/virtual

vi /etc/postfix/virtual
#下部に以下を追加。example.com, example2.com 宛のメールが example@gmail.comに届く
postmaster@example.com example@gmail.com
postmaster@example2.com example@gmail.com

postmap /etc/postfix/virtual
newaliases
service postfix start

Postfix は Maildir形式にしておいたほうが良い

このへんの知識なかったので初めて知ったのですが、Postfix デフォルトの Mailbox形式ではなく Maildir形式のほうがいろいろ良さそうなので、ついでに対応しておきます。
http://fedorasrv.com/migrate_to_maildir.shtml
http://yu-write.blogspot.jp/2013/11/centos-maildirmailbox-mail.html

迷惑メール対策(SPF/DKIM の設定について)

迷惑メールに入らないように設定するDNSについて、SPFとDKIMがあるようです。メールサーバを作るみたいな記事を色々見てましたが、SPFのことは書いていてもDKIMのことは書いていないものも多く、情報が錯綜としていましたが要するに、

  1. DNS逆引きレコード変更
  2. SPFの設定
  3. DKIMの設定

の三点をクリアしておけば、とりあえず大丈夫だってことがわかりました。

自前でPostfixでメールサーバ作った場合

結局試せていませんが、さくらVPSの場合は以下を参照。
http://nobnoob.hatenablog.com/entry/2013/04/01/093120

Gmail(G Suite) の場合はSPF設定だけでもしておく。

私はG Suite(独自ドメインGmail)を使っているドメインがありますが、DKIMの設定については知りませんでした。ググればやり方がいろいろあるようですが、そもそもDKIMの設定をわざわざせずとも、Google側で適当に対応しているので問題ない印象です。

メールサービスの安全性とセキュリティを維持するために、Google ではすべてのメールに DKIM 署名を使用しています。Google Cloud ドメインから送信された、DKIM 署名がついていないメールについては、d=*.gappssmtp.com の署名が付加されるようになりました。
https://support.google.com/a/answer/180504?hl=ja

SPFについてはサクっとできるのでやっておきます。
https://support.google.com/a/answer/178723?hl=ja&ref_topic=2759192

Macなどではdigコマンド叩いて、ちゃんと反映されているか確認しましょう。

dig example.com TXT

example.com.        120 IN  TXT "v=spf1 include:_spf.google.com ~all"