Help us understand the problem. What is going on with this article?

Railsでメール受信とブラウザー通知

More than 5 years have passed since last update.

あるシステムから届くメール通知が不親切なので「メールを受信して、DB保存しそれを整形して表示させるサイト」をHeroku上で作成してました。その実装の中で、応用のききそうなメール受信とWebサイトのPush通知の方法についてメモしておきます。

使ったもの

メール連携

heroku上にデプロイするので良いのが無いかAddonを探したところ無料プランでもそこそこ使えそうなMail2Webhookに決定。

設定

https://devcenter.heroku.com/articles/mail2webhook

1.Addonの追加

$ heroku addons:add mail2webhook

これだけで受信用メールアドレスが発行される。Configで確認する事も可能。このメールアドレスが長く、小文字Lとか数字1が混在しているので注意(これでハマった)

$ heroku config:get MAIL2WEBHOOK_EMAIL

2.WebHookURLの設定

以下のコマンドでdashboardを開き、hook用のURLを設定する必要があります。設定されていないとメールが飛んできます。またpostした時にエラーが出ると送信者に診断用情報を含んだエラーメールが返送されます。

$ heroku addons:open mail2webhook

スクリーンショット_2014-08-28_12_35_18.jpg

この下にRailsとNodeJSのサンプルがあるのでそのまま使えます。

config/routes.rb
 post 'incoming_emails' => 'incoming_emails#create'
app/controllers/incoming_emails_controller.rb
require 'mail'
require 'kconv'

class IncomingEmailsController < ApplicationController
  skip_before_filter :verify_authenticity_token, only: :create
  def create
    mail = Mail.new(params[:message])
    # ここに保存&ブラウザー通知
    render text: "OK"
  end
end

注意点

mail.bodyを日本語でgrepしようとすると、ASCIIでセットされているためエンコーディングがうまくいかず失敗します。自分のプログラムではkconvを入れ下記のようにして対応しました。

    mail.body.to_s.toutf8

また、mail.subjectはエンコードはUTF8なのですが、文字列が切れてしまうようです。この辺りは後で検証する予定。

Mail(Ruby)
https://github.com/mikel/mail

※このような部分はローカルでテストできなので辛い...

ブラウザー通知

単純な通知でよかったのでWebSocketで普通に通知機能を作ろうかとか思ったが、この機会に前から使ってみたかったPusherを使うことにしました。

トップページよりフリーアカウントを作ると、自動的にAppsとしてMainというのが登録され、CodeExampleが表示されている...なんというお手軽モード。

クライアント側(ブラウザー表示部)

hamlを使っているので以下のように書き換えて投入します。

application.html.haml
    %script{:src => "http://js.pusher.com/2.2/pusher.min.js", :type => "text/javascript"}
    :javascript
      $(document).ready(function(){
        var pusher = new Pusher(*****);
        var channel = pusher.subscribe('dashboard');
        channel.bind('new_event', function(data) {
          alert(data.message);
        });
      });

channnelとeventは好きに設定する(複数ページや機能やユーザーレベル別等)。実際はAlertでなく、デスクトップ通知や自動リロードなどにする方がスマートかと思います。

サーバー側(システムからのトリガー部)

config/initializers/pusher.rb
require 'pusher'

Pusher.url = "http://****@api.pusherapp.com/apps/****"
Pusher.logger = Rails.logger

ページには記述が無いようなきがしますが、requireするのだから当然Gemも指定しておく必要があります。

gem 'pusher'

$ bundle install

後は通知したい部分に下記のように書けばPusherにて通知されます。

  Pusher['dashboard'].trigger('new_event', {
      message: '通知内容'
    })

Pusherのダッシュボードからも送信テストができます。

Pusher__Ssalert_—_Debug_Console.jpg

ぶつぶつ

mail2webhookが便利だったので、送信先フィルターのサーバー側実装とか、ユーザー名振り分けのような仕組みを含めて自分で作ってみるのも楽しそうな気がしています。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away