Railsでメール送信システムを作るために、SMTPとかSESとかDKIMの関係の整理を試みる

昔はうまくやれてたのに、別件で雑にこなそうとしたら動かなくなってしまったので悲しい気持ちでまとめていく。
きちんとやろうとすると本当にめんどくさいのでもっと世界がいい感じになってほしい。

細かい書き方やスクショなどはおいおい追記するかもしないかも、ということで、初回公開時点ではとりあえず概念だけ整理していく。

この記事はまだ修正中だけどちょう最低限の記述ができたので公開されています。

この記事の対象読者

  • Railsサクッとメール送信機能作りたいんだけどいろんな情報の関係性がよくわからない
  • メール送信機能つくったのに届かないとか言われたりする
  • メールの送信元が本来想定しているメールアドレスと違うのなんでなん

この記事の対象じゃない読者

後で書くかもしれないけど、メールを受信したい場合にはやることが全く異なるので

  • メールをサーバーで受信して転送したりうまいことやりたい人

は対象になりません。

この記事で出てきそうなキーワード

メール送信できるようにするまでの基本的な流れ

たぶんこうだと思う。

  1. 送信元になるメールアドレスのドメインを取得しておく
  2. メール送信をするメールサーバーを用意する
  3. 送信するメールアドレスを指定し、そのメールアドレスがブラックリスト化されないようにDKIM及びSPFの設定をする
  4. メールサーバーに対してSMTPまたはHTTPの形式で通信し、送信リクエストを行う

分解していくと、関連するサービスなどの立場がわかりやすい。

送信元になるメールアドレスのドメインを取得しておく

ここでは、お名前.com、ゴンベエドメインなどのドメイン取得サービスでドメイン取得が必要になる。
基本的にドメイン取得後は、デフォルトではドメイン取得サービスが提供しているDNSドメインの取り扱いを管理しているので、
ドメイン移管などの処理をしていない場合には、ドメインに関する設定はそのサービス内で行うことになる。

メール送信をするメールサーバーを用意する

メール送信を行うにはメールサーバーが必要で、ここの設定がわからないと結構苦労することが多い。
テスト送信と実際の送信で使うサービスが異なるケースが多い。

よくやるのは、テストではgmailを使うパターン。
また、最近聞いたので割とよさそうだなと思ったのは、MailTrapというので実際にメール送信はせずに、どんなメールが送信される処理がされたか、まで確認するパターン。
mailtrap.io

実運用においては、Amazon SESやSendGridというサービスを使って、メール送信を肩代わりしてもらうものになる。
なお、よそのツールは使わないんじゃ! 自分でサーバー構築するんじゃ! という場合に出てくる単語はSendMailPostfixなどがある。
一度知識がなさすぎた頃に検索するたびに出てきてこいつが主流なのかと勘違いしてやってみたことがあるが、ドキュメントが古いものばかりな上に、バウンスの管理などがろくにできず結局ほとんど届かなかったり、yahoo.co.jpに特別な設定が必要で届かないってbizの人に怒られたり、TLSの設定とかがわけわかなくなって地獄を見るのでメールの専門家になりたい人以外にはおすすめしない。

割と有名なサービス。後述するDKIMSPFの設定とかデフォルトでいい感じに埋めてくれたりするのでかなり便利。
ドメインの所有権を持っていないと、メールアドレスの認証ができなくて送信できないので、事前にドメイン取得を済ませておき、ドメイン管理者としてメールを受け取れるようにすることが必要。
本番運用に切り替えるには、送信制限の解除などをフォームから申請する必要があるのでググってやっていくこと。
なお、日本のキャリアメール(ezweb.ne.jpとかdocomo.ne.jpとか)に届かないケースがあるらしく、公式でもそういうアドレスに送りたいならやめとけ、みたいなことが書いてある。

  • SendGrid

これまた有名なサービス。
事前に審査が必要なため、ドメインの所有権を持っていなかったり、サイトのURLが用意できてなかったり、真面目に使う気がなさそうだと審査に落ちる。
ちゃんと運用する気なら基本的には審査通るのと、無料枠が十分にあること、メールが届かないといった文句を全然言われないで済むことから、かなりおすすめのサービス。

送信するメールアドレスを指定し、そのメールアドレスがブラックリスト化されないようにDKIM及びSPFの設定をする

一番わけわかんなくてキレる人が最も多く発生する(当社調べ)手順。
一介のプログラム書いてるエンジニアが普段絶対関わることのない領域であり、かつ概念が謎な上に設定方法も謎なので切なくなることが多い。

とにかく雑にまとめると、ドメインを管理しているツールの中でDKIMSPFの設定がしてあればほぼOK、だと思う。

メールサーバーに対してSMTPまたはHTTPの形式で通信し、送信リクエストを行う

HTTPについてはよくわからないしあんまり主流じゃないと思うので省略する。
ActionMailerを継承して、UserMailerとかそういうのを作って送信するわけだが、 `config/environment/production.rb` とかで送信先SMTP情報を指定してあげないと動かない。

送信に当たって必要な情報としては、

が基本的に必須で、それに加えて、対象のメールサーバーによって送信元ドメインや暗号化通信のための通信方法の指定などのオプションを渡すことになる。