2013年3月26日火曜日

HerokuからISO-2022-JPエンコードのメールを送る

日本語メールを送る際、最近はUTF-8で送っても大抵の場合問題になることはあまりなくなってきたと思います。ただし多くの人にメールを送らなければならないWEBサービスなどの場合はやはりISO-2022-JPで送ったほうがトラブルは少ないと思います。

今回は、HerokuからHerokuが提供しているアドオンを使用し、ISO-2022-JPエンコードのメールを送信する方法をご紹介します。
他にもいろいろを方法があるとおもいますが、後述する"Iron Worker"を使って送るときに私自身少し悩んだので、同じ悩みの人に少しでも参考になればと思っています。

私の環境は以下のとおりです。
  • Ruby: 1.9.2p290
  • Rails : 3.1.10
  • Heroku Stack : bamboo※
  • Heroku Add-ons : SendGrid(メール送信)、Iron Worker(非同期処理)
 ※cedarでも軽く試した所動作しましたが、しっかりとした確認はしていません。

今回の対応を行うにあたり、いろいろ試したのですが結論からいうと、

mail-iso-2022-jp ※を使って対応しました。

※ こちらのgemを作られた黒田さんの会社のサイトの記事はよく参考にさせて頂いています。私も見習って質の高い情報を提供できるようにして行きたいです。

弊社のサービスでメール送る処理は
  • 同期送信
  • 非同期送信
の2つがあります。同期送信はメール送信件数が少ない(パスワード忘れ用メールなど基本的に1通だけ送る場合など)場合の処理です。この処理でISO-2022-JPメールを送る場上記mail-iso-2022-jpなどを使い、メーラークラスを
class HogeMailer < ActionMailer::Base 
  default  :charset => 'ISO-2022-JP', 'Content-Transfer-Encoding' => '7bit'  
  def sendmail 
    メール処理 
  end
のような感じで書いておき、
HogeMailer.sendmail.deliver
で問題なくISO-2022-JPエンコードされたメールが 送信できると思います。

一方、多くのアドレス宛メール一斉送信などは、同期通信をしてしまうとHerokuのリクエストタイムアウト制限(30sec)にかかってしまいますし、ユーザビリティ的にもあまりよいものではありません。
弊社サービスでは、Iron Workerというアドオンを使って非同期処理を行うことにより時間のかかる処理の対応をしています。
Iron Workerを使ってメールを送信する場合は、上記のままだと文字化けが起こると思います。その解決方法に少々悩みましたが、調べた結果Iron WorkerにキックするWorkerクラスに、
merge_gem gem名
今回の場合だと、
merge_gem 'mail-iso-2022-jp'
 をつけることで解決することが出来ました。(これを書かないと、gemの効果がIron Workerにわたらない)

因みに、すでに我々の携帯向けの対応で使っていたこともあり、jpmobileのメーラー機能(Jpmobile::Mailer::Base)をでISO-2022-JPの対応するも考えていたのですが、merge_gemでエラーが出てしまったのと、我々のサービスでは絵文字などに対応する必要がなかった為、mail-iso-2022-jpを使うことにしました。

以上が、HerokuからISO-2022-JPエンコードのメールを送る方法(の例)紹介でした。
何かのお役に立てば幸いです。

0 件のコメント:

コメントを投稿