Rails
AWS
ActionMailer
zoho

EC2で構築したRailsアプリのメール送信をSESからZohoに移行した話

AWSの機能だけでメール受信を行うには

AWSのEC2インスタンスを借りてRailsアプリを構築していた時の話です。スモールスタートで始めたので、AWS 無料利用枠 に少し毛が生えた程度の料金プランの想定でネットワークトポロジ・インフラアーキテクチャの構築を行なっていました。
その中でも現在進行形で議論しているのがメールです。当初は、登録申請時やパスワードリセット時に飛ぶメールくらいを想定していたので送信だけできればひとまずOKかな程度で、SESによるメール送信を行なっていました。

しかし、アプリの開発が進展していく内に、やはりメール受信もしたいとのことで、一旦AWSの機能だけでメールの送受信するにはどうしたら良いか調べていました。

SESだけではメール受信はできない

受信ルールの設定 の部分を調べて見ると、S3にデータを送るルールセットを作ることでひとまず、メールを受信している状態にはなります。
しかし、これをThunderBirdのようなMUAを経由して見たいとなると、どうしてもMTAが必要になってきます。
AWSでは、Lambdaと言う、スクリプトを実行できるサービスもあり、これを利用して他ドメインのMTAに転送する、もしくは自前運用のメールサーバにメールを送り、MUAはそこにアクセスするようにする方法が一つあります。
更には、AWS WorkMail と言う、AWSが提供するMTAにアクセスできるMUAサービスもあります。
しかし、どちらにせよ無料利用枠の範囲を超えてしまうため(前者はRailsでインスタンス一つ使っているので、メールサーバ用にもう一個インスタンス作る必要あり。Gmailなどの他ドメインのメールサーバに転送する場合はLambdaも無料範囲枠だが、設定が煩雑になりそう(?)。後者のWorkMailは1ユーザーあたり月額4ドルとやや料金が高め)、他に利用できるクラウドサービスがないか調べていたところ、[Zoho Mail]が無料プランでなんとか対応できそうなので、これを採用することにしました。
メールとDNSの関係上、同一ドメインで違うサービスを使うことができないため(例えば、送信はSESに任せて、受信はGSuiteで行うなど)、メールの送受信に関してはZoho Mailを使うこととしました。

Zoho Mailへのアカウント登録

まずはアカウントを登録しましょう。
基本的には、登録時のフローと同じように設定を行なっていきます。(詳しくは参考文献へ)
なお、途中で飛ばした場合もコントロールパネルから、設定ができます。

  1. ドメイン認証

ドメイン認証についてはTXT, CNAME, Web認証などの認証方法が用意されています。今回はCNAMEレコードをRoute 53に登録することによって、認証が成功するようにします。
TXTレコードで登録すると、後々のSPFレコードの記述の際に煩雑化してしまうため、CNAMEレコードの登録によってドメイン認証が成功するようにしました。

  1. MXレコードの変更

続いて、管理しているドメイン宛に送信されたメールの受信先のメールサーバを、Zohoが運用しているメールサーバへ配送したいため、MXレコードもRoute 53で登録します。
Zohoでは以下のメールサーバを配送先として提供しています。

10 mx.zoho.com.
20 mx2.zoho.com.
50 mx3.zoho.com.

左の数字は優先度を示します。この値が小さいサーバに優先的にメールが配送されます。

  1. SPFレコードの登録

SPFレコードはメール送信の際のドメイン認証の仕組みの一つで、メールが送信が許可されているMTAから送られてきているものかどうかを識別するために有効なものです。
https://mailadmin.zoho.com/cpanel/index.do#spfにあるレコードをRoute 53に登録します。
スクリーンショット 2018-07-10 22.57.04.png

今回は、上記の設定とEIPを付与したWebサーバーから送信が許可されているようにしたいので、
ip4の値も一緒に付与しました(IPv6使っていなくてすみません、、、)

"v=spf1 include:zoho.com ip4:**.**.**.** -all"

  1. DKIMの登録

DKIMもメール送信の際のドメイン認証の仕組みの一つです。DKIMではメール送信側でメールに電子署名を付与し、受信側で電子署名を照合することで認証を行う仕組みです。
照合のために、権威DNSサーバーに公開鍵を登録し公開することにより、受信側で電子署名の照合が可能となります。
https://mailadmin.zoho.com/cpanel/index.do#dkimselector
こちらもZohoで鍵ペアを作成する機能がありますので、この内容をRoute 53に登録します。
スクリーンショット 2018-07-10 23.08.08.png

以上で、メール送受信を行うための設定は一通り完了しました。

スクリーンショット 2018-07-10 23.11.18.png

config/environments/production.rbの編集

最後にRailsアプリの設定を変更しましょう。

  • 修正前
config/environments/production.rb
 - config.action_mailer.delivery_method = :ses
  • 修正後
config/environments/production.rb
 +  config.action_mailer.smtp_settings = {
 +      :address              => "smtp.zoho.com", 
 +      :port                 => 465, 
 +      :user_name            => '*****@*****', 
 +      :password             => '*****', 
 +      :authentication       => :login, 
 +      :ssl                  => true, 
 +      :tls                  => true, 
 +      :enable_starttls_auto => true 
 +  } 

aws-sesをGemfileから削除

将来性を考えて残しておいても良いかもしれませんが、しばらくは使うことがないので一旦Gemfileから削除します。

% bundle exec gem uninstall aws-ses
Successfully uninstalled aws-ses-0.6.0
% bundle install --path=vendor/bundle

まとめ

ということでZoho Mailによるメール送受信の設定でした。本当はSPFやDKIM(その前にLambda?)をちゃんと勉強しないといけないのですが、スピードと予算のバランスで考慮しなければいけなかったので、
ざっくりとした手順方法でした。
ちなみに、送信専用のメールアカウントをZohoで作成したかったのですが、どうやら無料プランではその設定はできない模様です。

スクリーンショット 2018-07-10 23.15.16.png

参考文献

https://www.zoho.com/mail/help/adminconsole/domain-verification.html
https://sendgrid.kke.co.jp/blog/?p=2149
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/
https://mechalog.com/zohomail1