herokuでcloudmailinを使ってメールを受信する

Standard
herokuでcloudmailinを使ってメールを受信する

メールを受信したらPOSTデータに変換するっていう、GAEで言うところのincoming email serviceライクなことがherokuでもできた。「今日電車止まってるので遅れます」メールを受信して保存する何かをRails(3.0.3)で作ってみる。
 
 
準備

  • r new tik-kok -J

tik-kok/.rvmrc

if [[ -s "tikkok.gems" ]] ; then
  rvm gemset import tikkok.gems | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
fi
rvm  1.9.2@tikkok

tik-kok/Gemfile

source 'http://rubygems.org'
gem 'rails', '3.0.3'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'haml'
gem 'haml-rails'
gem 'jquery-rails'
gem 'heroku'
gem 'rails3-generators'

group :test do
  gem "rspec-rails", ">= 2.0.0.beta.13", :group => :development
  gem "rspec-integration", ">= 2.0.0.beta.13"
  gem "factory_girl", :git => 'https://github.com/thoughtbot/factory_girl.git'
  gem "cucumber", :git => 'https://github.com/aslakhellesoy/cucumber.git'
  gem "cucumber-rails"
end
  • cd tik-kok
  • bundle install
  • git init
  • git add .
  • git commit -m ‘first commit.’
  • heroku create tik-kok
  • git push heroku master

 
とりあえずheroku上にアプリを作れたことを確認したら、そのアプリで使うRubyを1.9系に変更する。メールとか間違いなくencodeでイラつくことになるので。

  • heroku stack:migrate bamboo-mri-1.9.2
  • git commit –allow-empty -m “migrating to bamboo stack”
  • git push heroku master

 
つぎにherokuのCloudMailinアドオンを追加する。cloudmailinが受信したメールをPOSTデータに変換してくれるサービス。herokuでアドオンを追加するとそのアプリ用のアカウントが作成されるので自分でcloudmailinのアカウントを作る必要はなし。ついでにherokuで使うタイムゾーンを自分とこにしとく。

  • heroku config:add TZ=Asia/Tokyo
  • heroku addons:install cloudmailin:developer
  • heroku config –long

たぶんこんなのがでる

CLOUDMAILIN_FORWARD_ADDRESS => UMAUMAUMAUMA@cloudmailin.net
CLOUDMAILIN_PASSWORD => UMAUMAUMAUMA
CLOUDMAILIN_SECRET => UMAUMAUMAUMA
CLOUDMAILIN_USERNAME => UMAUMAUMAUMA@heroku.com
DATABASE_URL =>UMAUMAUMAUMA
RACK_ENV => production
SHARED_DATABASE_URL => UMAUMAUMAUMA
TZ => Asia/Tokyo

“UMAUMAUMAUMA”のところが自分のになってるはず。で、このCLOUDMAILIN_USERNAMEとCLOUDMAILIN_PASSWORDでhttp://cloudmailin.com/にログインする。CLOUDMAILIN_FORWARD_ADDRESSが追加されてるので、それをクリック → 「Edit Target」からPOSTされたいURLを入力する。ここではhttp://tik-kok.heroku.com/tikkok/newにしとく。これで準備は完了。CLOUDMAILIN_FORWARD_ADDRESS宛にメールを送ると、http://tik-kok.heroku.com/tikkok/newにPOSTデータが飛んでくる状態になってる。
 
 
受信してDBに保存する

  • r g controller r g controller Tikkok index
  • r g model Tikkok title:string body:text from:string encoding:string

config/routes.rbに以下を追加

match 'tikkok/new' => 'tikkok#create'

app/controllers/tikkok_controller.rb

class TikkokController < ApplicationController
  require 'mail'
  skip_before_filter :verify_authenticity_token

  def create
    message = Mail.new(params[:message])

    body = ""
    encoding = ""
    has_plain_text = false;
    has_html_text = false;

    message.body.to_s.split("\n").each {|m|

      if m =~ /charset=.*/
        encoding = $&.gsub("charset=","")
      end
      unless m.index("text/plain") == nil
        has_plain_text = true
      end
      unless m.index("text/html") == nil
        has_html_text = true
      end
      #debug
      puts m

      if m.index("Content-Type") == nil
        if m.index("Content-Transfer-Encoding") == nil
          if m.index(/\-\-[0-9a-z]*/) == nil
            body += m unless has_plain_text && has_html_text
          end
        end
      end
    }
    unless body.encoding.to_s == "UTF-8"
      body = body.encode("UTF-8")
      encoding = encoding.encode("UTF-8")
    end

    begin
      tikkok = Tikkok.new(:title => message.subject,
                          #:from => message.from,
                          :body => body,
                          :encoding => encoding,
                          :created_at => Time.now.strftime("%Y-%m-%d %H:%M"))
      if tikkok.save
        render :text => "ok"
      else
        render :text => "fail to save"
      end
    rescue => e
      render :text => "some error has occurred"
    end
  end
end

 
メール本文のパースをコントローラでやったら信じられないぐらい醜くなった。。とりあえずこれでメールタイトルと本文が保存できた。メールアドレスとか保存しとくのが嫌だったのでコメントアウト。あと本文の改行も消してある。
 
保存したデータを見れるようにしたのが、https://github.com/bugcloud/tik-kok
jQuery mobileを触ってみた。ここで動いてる。jQuery mobileのリファレンス的なものはここにすごいまとまってるのがある。肝心のcloudmailinのメールアドレスはハッキングしてつきとめてください!
 
 
追記
こんなのを発見したので、cloudmailinアドオンを追加するherokuコマンドを修正。
http://twitter.com/#!/cloudmailin/status/100854842540564480

Facebook comments:

10 thoughts on “herokuでcloudmailinを使ってメールを受信する

  1. Thanks for sharing superb informations. Your web site is very cool.
    I’m impressed by the details that you¡¦ve on this blog.
    It reveals how nicely you perceive this subject.
    Bookmarked this web page, will come back for more articles.
    You, my friend, ROCK! I found just the information I already
    searched all over the place and just could not come across.
    What a great site.

  2. プリンタについているタッチパネル液晶でスキャナから指定のLAN内のパソコンを指定すれば、そこに自動的に画像を送ってくれるのだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>