Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rackアプリケーションで受信メールを処理する「Incoming!」の使い方

クライアントから突然電話が…

クライアントは、自分のアプリで受信メールを処理したいと言っています。まるでBasecampのように。

「問題ないよ」と思うでしょう。多くのサービスがPOSTリクエスト経由でメールをアプリに送信してくれるのだから、簡単なはずです。本当に?

実は、そう甘くありません。

各サービスは独自のフォーマットを採用しています。パース済みのメールを送ってくるものもあれば、生データを送るものもあります。認証署名付きのサービスもあれば、そうでないものもあります。

この面倒な工程を丸ごとスキップして、標準的(よく知られた)なRubyオブジェクトとして直接扱えたら素敵だと思いませんか?

ベンダーを乗り換えても、コードを書き直さずに済んだらどうでしょう?

Incoming!を使えば、それが可能になります。

要約(TL;DR)

Incoming!はRack::Requestを受け取り、Mail::Messageを返してくれるgemです。

対応サービス

Incomingは以下の主要なサービスに対応しています。

  1. SendGrid

  2. Mailgun

  3. Postmark

  4. CloudMailin

  5. 自前で運用している実際のメールサーバー(なんと)

さらに嬉しいことに、拡張も非常に簡単です。つまり、まだ存在しないサービスとも事実上互換性を持てるということです!(半分冗談ですが、ある意味本当です)

そもそも受信メール機能になぜ価値があるのか?

「メールを送るだけ」でアクションを完了できる選択肢をユーザーに提供すると、実際に行動してもらえる確率は大きく上がります。

私たちは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!には際立った強みがあります。それは以下の通りです。

  1. 複数のメールサービスに対応している

  2. Railsに限らず、あらゆるRackアプリケーションで動作する

  3. 標準的なMail::Messageオブジェクトを渡してくれる

  4. 利用者のユースケースについて勝手に決めつけない設計である

ミーム画像はありますか?

もちろん、ありますとも。

Rackアプリケーションで受信メールを処理する「Incoming!」の使い方

  1. EmailJSでVue.jsアプリケーションからメールを送信する方法【初心者向けガイド】

    数日前、シンプルなVueプロジェクトに取り組んでいた際、作成したばかりのコンタクトフォームからメールを送信する必要がありました。誰かがフォームに入力するたびに、自動的に通知メールを受け取りたかったのです。 いろいろ調べていく中でEmailJSに出会いました。公式ドキュメントが充実していて、とても使いやすかったため、この記事としてまとめることにしました。この記事がどなたかの参考になれば幸いです :) はじめよう! この記事では、EmailJSを使ってVue.jsアプリケーションからメールを送信する手順を解説します。 先に進む前に、お使いの環境にVue CLIがインストールされていることを前提と

  2. iPhone・Androidの写真に「深度効果(背景ぼかし)」を加える方法

    iPhone 7以降のポートレートモードは、被写体をくっきりと際立たせ、背景を美しくぼかした写真を撮影できる機能です。こうした被写界深度(Depth of Field)効果を得るには、対応するiPhoneやデジタル一眼カメラが必要だと思われがちですが、実はサードパーティ製アプリを使えば、スマートフォンで撮った普通の写真にもこの効果を簡単に加えられます。 被写界深度(深度効果)とは? 被写界深度とは、写真において手前の被写体はシャープに映り、背景がぼやけて表現される効果のことです。下の画像を見ると、その違いがひと目でわかります。 どんなスマートフォンで撮った写真でも、背景をぼかして印象的な仕上