空メール送信をしたら会員登録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/
が使えるようになる。
ただ、何もコンテンツがないRailsアプリは404しか返してくれず、ちゃんと動いてるか判別がつきにくいので、
こんな感じで https://kodamatk.herokuapp.com/inspect/ip というエンドポイントをなんとなく作った。
Herokuアプリにカスタムドメインを設定する
に従う。
$ 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)で指定する必要がある。
これだけ!
めっちゃかんたん。
暫く待つと、 http://www.kodama.tk/inspect/ip でさっきのIPアドレス表示ページにアクセスできるようになる。
SendGridにカスタムドメインを設定する
こっちはやや面倒。2つやることがある。
Whitelabelの設定
ここにある。
[Add whitelabel]をおすと、入力フォームがでてくるので
こんなかんじで。subdomainのところはなんでもいいらしい。とりあえず適当に mail
にした。
Saveすると
こんなかんじで、CNAMEを3つ設定してくれ、っぽいことが出てくるので、あらためてドメイン設定側(今回の場合はfreenom)で指定する。
しばらく待ってから、SendGrid側で「Validate」をすると、 ✘ だったのが ✔ になる。
これで、カスタムドメインでのメールが使えるようになる。
Inbound Parseを設定する
先の手順まででカスタムドメインでメールの送信はできるが、受信にはもう一手間必要。
SendGridには、Inbound Parseという、受信したメールを特定のURLにWebHookで通知してくれる超便利機能があるので、それを使う。
設定手順はわりとかんたん。 (詳しくは→ Inbound Email Parse Webhook - ドキュメント | SendGrid )
まずは、ドメイン設定側(今回の場合はfreenom)でMXレコードを追加する。
これで、 xxxxxxxx@kodama.tk
というメールアドレスにメールを送ると、SendGridの方に届くようになる。
次に、SendGridでWebhookの設定
ここから、
こんな感じで、適当に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
というかんじで、使い捨てと割り切れば無料でおためしができた。