Heroku+SendGridとfreenomで空メール送信を受け付ける何か(使い捨て)をつくる

空メール送信をしたら会員登録URLが送られてきて、それをタップするとアプリが開いて、Facebookで会員登録! みたいな流れを作りたかった。

実装にあたり、ネックとなるのは、空メールを受け付けるところ。受信可能なメールアドレスをなんとかしてお金かけずに作りたい。

ということで、なんとなくやってみた。

ドメインを無料でとる

freenom というところで12ヶ月までなら無料で使えるドメインを取ることができる。 (無料とはいえ、ドメインを持つ以上は住所とかいろいろ入れないといけないので、そのあたりは自己責任で...)

今回は、とりあえず kodama.tk という適当なドメインをとった。ネーミングに特に理由はない。(なんとなくechoを日本語にしただけ)

とりあえずHerokuで適当なプロジェクトをつくる

アプリ名は kodamatk にして、

bundle exec rails new . --api --skip-bundle --skip-test --database=postgresql

したのをGitHubに置いて、pipeline設定すると

https://kodamatk.herokuapp.com/

が使えるようになる。

f:id:YusukeIwaki:20171004111006p:plain

ただ、何もコンテンツがないRailsアプリは404しか返してくれず、ちゃんと動いてるか判別がつきにくいので、

github.com

こんな感じで https://kodamatk.herokuapp.com/inspect/ip というエンドポイントをなんとなく作った。

Herokuアプリにカスタムドメインを設定する

devcenter.heroku.com

に従う。

$ heroku domains:add www.kodama.tk
Adding www.kodama.tk to ⬢ kodamatk... done
 ▸    Configure your app's DNS provider to point to the DNS Target www.kodama.tk.herokudns.com.
 ▸    For help, see https://devcenter.heroku.com/articles/custom-domains

The domain www.kodama.tk has been enqueued for addition
 ▸    Run heroku domains:wait 'www.kodama.tk' to wait for completion
$ heroku domains
=== kodamatk Heroku Domain
kodamatk.herokuapp.com

=== kodamatk Custom Domains
Domain Name    DNS Record Type  DNS Target
─────────────  ───────────────  ───────────────────────────
www.kodama.tk  CNAME            www.kodama.tk.herokudns.com

この最後の1行がポイント。 www.kodama.tk CNAME www.kodama.tk.herokudns.comドメイン設定側(今回の場合はfreenom)で指定する必要がある。

f:id:YusukeIwaki:20171004111708p:plain

これだけ!

めっちゃかんたん。

暫く待つと、 http://www.kodama.tk/inspect/ip でさっきのIPアドレス表示ページにアクセスできるようになる。

SendGridにカスタムドメインを設定する

こっちはやや面倒。2つやることがある。

Whitelabelの設定

f:id:YusukeIwaki:20171004112049p:plain

ここにある。

[Add whitelabel]をおすと、入力フォームがでてくるので

f:id:YusukeIwaki:20171004112206p:plain

こんなかんじで。subdomainのところはなんでもいいらしい。とりあえず適当に mail にした。

Saveすると

f:id:YusukeIwaki:20171004112442p:plain

こんなかんじで、CNAMEを3つ設定してくれ、っぽいことが出てくるので、あらためてドメイン設定側(今回の場合はfreenom)で指定する。

f:id:YusukeIwaki:20171004112703p:plain

しばらく待ってから、SendGrid側で「Validate」をすると、 ✘ だったのが ✔ になる。

これで、カスタムドメインでのメールが使えるようになる。

Inbound Parseを設定する

先の手順まででカスタムドメインでメールの送信はできるが、受信にはもう一手間必要。

SendGridには、Inbound Parseという、受信したメールを特定のURLにWebHookで通知してくれる超便利機能があるので、それを使う。

設定手順はわりとかんたん。 (詳しくは→ Inbound Email Parse Webhook - ドキュメント | SendGrid )

まずは、ドメイン設定側(今回の場合はfreenom)でMXレコードを追加する。

f:id:YusukeIwaki:20171004113302p:plain

これで、 xxxxxxxx@kodama.tk というメールアドレスにメールを送ると、SendGridの方に届くようになる。

次に、SendGridでWebhookの設定

f:id:YusukeIwaki:20171004113507p:plain

ここから、

f:id:YusukeIwaki:20171004113453p:plain

こんな感じで、適当にWebHookのURLを指定する。( www.kodama.tk は証明書を取っていないのでhttps通信では使えないので、 kodamatk.herokuapp.com のほうのURLを指定している)

あとは、Railsアプリ側でWebHookをさばく処理を書くだけ!

namespace :webhook do
  post :email, to: 'email#incoming'
end
class Webhook::EmailController < ::ApplicationController
  def incoming
    mail_from = params[:from]  # 空メールを送った人のアドレス
    mail_to = params[:to] # xxxx@kodama.tk
    mail_title = params[:subject]
    mail_body = params[:text]

    # 空メールの内容が正しければ、会員登録URLをmail_fromに送る
    handle_mail(mail_from, mail_to, mail_title, mail_body)

    render plain: "ok"
  end
end

というかんじで、使い捨てと割り切れば無料でおためしができた。