Rackアプリケーションで受信メールを処理する「Incoming!」の使い方
クライアントから突然電話が…
クライアントは、自分のアプリで受信メールを処理したいと言っています。まるでBasecampのように。
「問題ないよ」と思うでしょう。多くのサービスがPOSTリクエスト経由でメールをアプリに送信してくれるのだから、簡単なはずです。本当に?
実は、そう甘くありません。
各サービスは独自のフォーマットを採用しています。パース済みのメールを送ってくるものもあれば、生データを送るものもあります。認証署名付きのサービスもあれば、そうでないものもあります。
この面倒な工程を丸ごとスキップして、標準的(よく知られた)なRubyオブジェクトとして直接扱えたら素敵だと思いませんか?
ベンダーを乗り換えても、コードを書き直さずに済んだらどうでしょう?
Incoming!を使えば、それが可能になります。
要約(TL;DR)
Incoming!はRack::Requestを受け取り、Mail::Messageを返してくれるgemです。
対応サービス
Incomingは以下の主要なサービスに対応しています。
SendGrid
Mailgun
Postmark
CloudMailin
自前で運用している実際のメールサーバー(なんと)
さらに嬉しいことに、拡張も非常に簡単です。つまり、まだ存在しないサービスとも事実上互換性を持てるということです!(半分冗談ですが、ある意味本当です)
そもそも受信メール機能になぜ価値があるのか?
「メールを送るだけ」でアクションを完了できる選択肢をユーザーに提供すると、実際に行動してもらえる確率は大きく上がります。
私たちはhoneybadger.ioのためにIncoming!を開発しました。エラーに関する議論を効率化する仕組みが必要だったのです。たとえば、エラー通知メールに返信するだけで、そのエラーにコメントを追加できます。実際、私たちのコメントの大半はこの方法で投稿されており、大きな成果だと実感しています。
執筆時点で、このgemはHoneybadgerチーム内で約6ヶ月間運用されています。
コードを見せて!
まずはCloudMailinを使ったシンプルな例から見てみましょう。
# まず、メールレシーバークラスを定義します
class EmailReceiver < Incoming::Strategies::CloudMailin
def receive(mail)
puts %(Got message from #{mail.to.first} with subject "#{mail.subject}")
end
end
# 次にRack::Requestオブジェクトを渡します。これだけで完了です。
req = Rack::Request.new(env)
result = EmailReceiver.receive(req) # => Got message from whoever@wherever.com with subject "hello world"
より詳しい情報は、Readmeを参照してください。
Railsではどう使うの?
RailsでIncoming!を使うのも同じくらい簡単です。実際にサンプルアプリを構築してみましょう。
要件: 私はSMSメッセージを打つのが苦手です。純粋な個人的な好みの問題ですが、授業中の婚約者に愛のメッセージを送りたいのです。
答えは明快。「メールからSMSへのブリッジ」を作ればいいのです!
まず、メールレシーバーをセットアップします。
# app/email_receivers/incoming.rb
class EmailToSmsReceiver < Incoming::Strategies::Postmark
def receive(mail)
send_sms([mail.subject, mail.body].join(": "))
end
private
def send_sms(message)
# ここにTwilioの処理を実装
end
end
次に、リクエストをレシーバーにつなぐコントローラーを追加します。
# app/controllers/emails_controller.rb
class EmailsController < ActionController::Base
def create
if EmailToSmsReceiver.receive(request)
render :json => { :status => 'ok' }
else
render :json => { :status => 'rejected' }, :status => 403
end
end
end
そして、ルーティングも忘れずに。
# config/routes.rb
Rails.application.routes.draw do
post '/emails' => 'emails#create'
end
これだけです。
Incoming!は他のgemと何が違うのか?
この分野には他にもgemが存在します。特に有名なのはThoughtbot製のGriddlerです。
しかし、Incoming!には際立った強みがあります。それは以下の通りです。
複数のメールサービスに対応している
Railsに限らず、あらゆるRackアプリケーションで動作する
標準的な
Mail::Messageオブジェクトを渡してくれる利用者のユースケースについて勝手に決めつけない設計である
ミーム画像はありますか?
もちろん、ありますとも。

-
EmailJSでVue.jsアプリケーションからメールを送信する方法【初心者向けガイド】
数日前、シンプルなVueプロジェクトに取り組んでいた際、作成したばかりのコンタクトフォームからメールを送信する必要がありました。誰かがフォームに入力するたびに、自動的に通知メールを受け取りたかったのです。 いろいろ調べていく中でEmailJSに出会いました。公式ドキュメントが充実していて、とても使いやすかったため、この記事としてまとめることにしました。この記事がどなたかの参考になれば幸いです :) はじめよう! この記事では、EmailJSを使ってVue.jsアプリケーションからメールを送信する手順を解説します。 先に進む前に、お使いの環境にVue CLIがインストールされていることを前提と
-
iPhone・Androidの写真に「深度効果(背景ぼかし)」を加える方法
iPhone 7以降のポートレートモードは、被写体をくっきりと際立たせ、背景を美しくぼかした写真を撮影できる機能です。こうした被写界深度(Depth of Field)効果を得るには、対応するiPhoneやデジタル一眼カメラが必要だと思われがちですが、実はサードパーティ製アプリを使えば、スマートフォンで撮った普通の写真にもこの効果を簡単に加えられます。 被写界深度(深度効果)とは? 被写界深度とは、写真において手前の被写体はシャープに映り、背景がぼやけて表現される効果のことです。下の画像を見ると、その違いがひと目でわかります。 どんなスマートフォンで撮った写真でも、背景をぼかして印象的な仕上