2011/02/28

Rails3 で POP 受信したメールを DB に登録する

現在作成しているアプリケーションで、メールを取り込む必要が出てきたので、学習した。
まずは、何も考えず登録するだけのコード。
サンプルでよくある $STDIN.read で取得するデータを POP3 で取得するにはどうすればいいかだけがカギかな。
class MailClient
  Net::POP3.start('mail_server', 110, 'account', 'password') do |pop|
    pop.mails.each |m|
      UserMailer.receive(m.pop)
      m.delete
    end
  end
end

ところが今回の環境では、サーバからメールを削除できないという条件があった。
(正確には別の手段で10日以上たったメールを削除している)
このため、差分受信を自前で実装しなければならない。
すでに受信したメールを判別するには、一意なキーが必要だけど候補は二つ。
Net::POPMail#unique_id か Mail#message_id でも、Mail オブジェクトを作るためには、m.pop でメールを受信しなければならない。(pop を呼び出す前までは、LIST コマンドで取得した数値だけ持っている)
というわけで、Net::POPMail#unique_id で判別したい。すなわち、unique_id を DB に登録した、
しかし、ActionMailer#receive メソッドで自動的に Mail オブジェクトにパースされると、この unique_id の値がどっかに行くようだ。
なので、引数が一つしか渡せない ActionMailer#receive では unique_id を DB に登録するのは無理だ。
というわけで、ActionMailer#receive を使うのは諦めるしかない。
結局、下記のようなコードになった。

class MailClient
  Net::POP3.start('mail_server', 110, 'account', 'password') do |pop|
    registered_unique_id_list = UserMail.select(:unique_id).all.collect { |um| um.unique_id }
    pop.mails.each |m|
      unless registered_unique_id_list.include?(m.unique_id)
        mail = Mail.new(m.pop)
        save_mail(mail, m.unique_id)
      end
    end
  end
end
とりあえずは、これで動いている。
でも、そもそも差分受信のロジックを要勉強な気がする。
どっかのメーラのソースでも読むべきかな

2011/02/16

gem をアップデートしたら redmine の表示がおかしくなった

既存サーバに新しく rails アプリを登録したときに、最新環境にしたら redmine の表示がおかしくなった。
rails のバージョンは freeze されているけど、I18n なんかはシステムの gem を利用しているので、その影響だろう。
こんな風に、I18n の変数展開がうまくいっていない。
対応自体は簡単で、RAILS_ROOT/config/locals/ja.yml のリプレースホルダの形式を変更すればいい。
{{count}} のような旧形式で定義されているので、これを %{count} の形式に変更する。
あとは passenger なり、apache なりを再起動すればok。
要するに以前の形式のサポートが打ち切られたわけですね。

2011/02/15

rails3 で div.field_with_errors を抑制する

div で囲んでくれるため、デザイン的に結構邪魔な Rails の field_with_errors。
これを出力しないには application.rb に一行足すのが一番簡単っぽい。
config.action_view.field_error_proc = proc { |input, instance| input }

2011/02/03

IS03にEdyがやってきた

Edyがスマートフォンに対応しました

ということでようやく Edy が IS03 で使えるようになったようです。
さっそくインストールしてみましょう。

スマートフォンでEdyを利用するを参考に進めてみましょう。
まあ、ココにアクセスして指示通りに行うだけですけど。
ちなみにアプリケーションの[おサイフケータイ]→[サービス紹介サイト]からもいけます。
ただ、デフォルトブラウザじゃないとできなかった。Opera や Dolphin Browser じゃプラグインの関係なのか登録までこぎ着けることができなかった。
Opera だとスマートフォン用サイトすら表示されなかったし。

必要事項を入力して登録は完了したけど、まだ利用できない。
チャージしようと思ったけど、クレジットカードは登録に二日ほどかかるということでチャージできない。
あとでコンビニからチャージしてみましょう。

で、実はここで終わりじゃなくて・・・
再びアプリケーションから[おサイフケータイ]を選ぶと[電子マネー「Edy」]という項目が増えています。
タップすると Edy のアプリケーションダウンロード画面に遷移します。
ちゃんと専用アプリも用意されているんですね。
まあ、チャージなどはアプリから仕様としても結局ブラウザ経由のようですけど。

ともあれ、これで一つ便利になった。あとは Suica だ