気になるあの子とHerokuでメールの送受信


こんにちは。 Blogを書こう!と宣言してから数ヶ月。
ネタを温めては冷まし、温めては冷ましを繰り返し、1度も投稿していなかった増田です。
この投稿を期にBlogグセをつけるべく、シリーズ物で行こうと決心しました。

テーマはHerokuで提供されている気になるアドオンをチェック!
手を動かしたり、本家のドキュメントを和訳したりしなから、ホットなアドオンを紹介していきたいと思います。
アドオンはHerokuに依存しているという訳ではなく、SaaSで提供されているアプリケーションだったり、データベースだったり、アプリケーションと組み合わせることで、旨みを引き出せるトレンディーな技術がラインナップされています。

以下が一例です。

  • Mailgun メールの送受信を担うSaaSであるMailgunと連携するアドオン
  • Pusher お手軽にWebSocketを始めるアドオン
  • Redis To Go KVSであるRedisを使うためのアドオン
  • Websolr Apache Solrを使った全文検索アドオン
  • CloudAMQP メッセージのキューイングサービスであるRabbitMQを利用するアドオン
  • etc...

今回は、同僚のMさんにPaaS上でメールの送受信ってどうするんでしょうね?
というひょんな質問から、メール送受信用のアドオンであるMailgunについて調べてみたいと思います。

あ。。 いきなりPaaSやら、Herokuやら言い出したので混乱しますよね。
Herokuについてざっとおさらいをしておきましょう。

Herokuってなに?

Herokuは元々Ruby on Railsを対象とした、Amazon Web Services(AWS)のIaaS上に構築されたPaaSで、
Webアプリケーションの開発から公開まで非常に簡単にできる優れたプラットフォームです。

現在ではRuby以外にもJava、Python、JavaScript(node.js)、Scala、Clojureにも対応したマルチ言語なプラットフォームとなっています。

また、HerokuにはWebアプリケーションを開発する上で必要なアドオンが多数提供されています。
サーバーにログインし、コマンドを実行したり、ソフトをインストールできない環境にとって、アドオンは切っても切れない存在なのです。

料金に関してはDBの容量とHTTPのプロセス数、そしてジョブキューの処理ワーカー数、チョイスしたアドオンによって決まりますがご安心ください。 Herokuは開発で実行する範囲は無料でサービスが提供されています。 無料範囲を超えて高機能な部分を使う場合や、無料範囲には含まれないアドオンを使う場合に料金が発生します。 うまいですねー!

Herokuについてざっくりとわかったところで、今度はMailgunのご説明。

Mailgunってなに?

Mailgunは他のクラウドメールサービスと異なり、メールの送受信、保存、追跡するための完全なWebサービスを提供しています。 SMTP, POP3およびHTTP APIに加えて、標準的な電子メールのプロトコルスイートを利用することができます。

さて、ここからは本家のマニュアルに沿って、実際にMailgunのアドオンをご紹介したいと思います。

Herokuへのデプロイ

Heroku上でMailgunを利用するには、Mailgunのアドオンのインストールと利用プランを選択してください。 プランはこちら。 Starterプランですと、1日300通までは無料で使えます。 開発ならこれで十分ですね!

$ Heroku addons: add mailgun: <PLAN>

SMTP経由でメールを送信

ActionMailerを利用した設定例は以下のようになります 。

ActionMailer::Base.smtp_settings = {
  :port           => ENV['MAILGUN_SMTP_PORT'],
  :address        => ENV['MAILGUN_SMTP_SERVER'],
  :user_name      => ENV['MAILGUN_SMTP_LOGIN'],
  :password       => ENV['MAILGUN_SMTP_PASSWORD'],
  :domain         => 'yourapp.heroku.com',
  :authentication => :plain,
}
ActionMailer::Base.delivery_method = :smtp

環境変数から設定が取れるんですね。 ステキ。

HTTP経由でメールを送信

SMTPは電子メールを送る上でとても良い仕事をしますが、このプロトコルはMIMEフォーマットで文章を組み立てる必要があります。 MIMEフォーマットの詳細を学ぶことは面白くないですよね。

Mailgun はHTTPベースの送信APIを、とても簡単な代替手段として提供しています。 MIMEライブラリの代わりに、HTTP経由でパラメータをPOSTしてください。 さて、どんなパラメータでしょう。 期待するものとして: "From", "To", "Cc", "Bcc", "Subject" などがあります。

HTTPリクエストを実行するために、rest_clientを使った例を見てみましょう。

require 'rest_client'

API_KEY = ENV['MAILGUN_API_KEY']
DOMAIN = "example.com" #Mailgunの管理画面に表示されているDomainを指定する.
API_URL = "https://api:#{API_KEY}@api.mailgun.net/v2/#{DOMAIN}"

RestClient.post API_URL+"/messages",
    :from => "ev@example.com",
    :to => "ev@mailgun.net",
    :subject => "This is subject",
    :text => "Text body",
    :html => "<strong>HTML</strong> version of the body!"

上記の例は、とても基本的なものです。 HTTP APIは、ファイルアップロードやテスト送信など多くの機能をサポートしています。 詳しくはMailgunのAPIドキュメントを参照してください。

HTTP経由でメッセージを受信する

Mailgunは受信メールの柔軟なセットを定義することができます。 一般的なオプションは、着信メッセージをパースし、HTTPを経由してアプリケーションにそれらをPOSTする感じです。受信についての詳細はこちら

基本的なメールのパースに加え、Mailgunはオプションで以下のことを行ってくれます。

  • スパムフィルタリング
  • メール本文の引用部分と本文の分離
  • シグネチャの検出

Mailgunで受信したメールをアプリケーションに転送するにはMailgunの設定画面からRoutesの設定を行います。
Create routeボタンを押して以下のような設定を追加してください。

Filter Expression: match_recipient("xxx@sample.mailgun.org") # 受け付けるメールアドレス
Actions: forward("http://xxxxx.heroku.com/email/post") #受信メールの転送先

この設定によりxxx@sample.mailgun.orgで受信したメールが --> http://xxxxx.heroku.com/email/post にポストされます。

Mailgun経由でメールを受信するRailsのアクションは以下のようになります。
転送されたメールを以下のアクションで受け取るわけですね。

class EmailsController < ApplicationController
   skip_before_filter :verify_authenticity_token

   def post
     # process various message parameters:
     sender  = params['from']
     subject = params['subject']

     # get the "stripped" body of the message, i.e. without
     # the quoted part
     actual_body = params["stripped-text"]

     # process all attachments:
     count = params['attachment-count'].to_i
     count.times do |i|
       stream = params["attachment-#{i+1}"]
       filename = stream.original_filename
       data = stream.read()
     end
     render :text => "OK"
   end
end

この仕組みを使えば、空メールを使ったキャンペーンなんかもできます。

Mailgunによってメールの内容がパースされ、アプリケーションにポストされます。
ポスト時のパラメータについてはこちらを参照してください。

メールボックス

Mailgunのコントロールパネル、またはAPIを使っていくつかのメールボックスを作成し、POP3またはIMAPを使ってアクセスできます。

更に詳しく知りたい方はMailgunのマニュアルをご覧ください。

はい、今回はここまで。
Blogって書き始めるまでは大変でしたが、書き始めると楽しいものですね。
次回はまだ未定ですが今後ともよろしくお願いいたします。


About 増田 茂樹

Ruby, Scala, JavaScript, アジャイル開発, Herokuがお好きなプログラマー。
This entry was posted in PaaS, 技術 and tagged , , . Bookmark the permalink.