あるシステムから届くメール通知が不親切なので「メールを受信して、DB保存しそれを整形して表示させるサイト」をHeroku上で作成してました。その実装の中で、応用のききそうなメール受信とWebサイトのPush通知の方法についてメモしておきます。
使ったもの
メール連携
heroku上にデプロイするので良いのが無いかAddonを探したところ無料プランでもそこそこ使えそうな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
この下にRailsとNodeJSのサンプルがあるのでそのまま使えます。
post 'incoming_emails' => 'incoming_emails#create'
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を使っているので以下のように書き換えて投入します。
%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でなく、デスクトップ通知や自動リロードなどにする方がスマートかと思います。
サーバー側(システムからのトリガー部)
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のダッシュボードからも送信テストができます。
ぶつぶつ
mail2webhookが便利だったので、送信先フィルターのサーバー側実装とか、ユーザー名振り分けのような仕組みを含めて自分で作ってみるのも楽しそうな気がしています。