2014年6月5日木曜日

fuelphpとSESを使ってメール送信をする際に、文字化けしてしまう問題的なお話

  • このエントリーをはてなブックマークに追加

fuelphpとAmazon SESを使ってメールを送信する際に、なぜか文字化けをしてしまうという問題が発生してしまった。
諸々解決策を練ってみるけど何も原因がわからんとかヤバい感じ。

けどまぁ何回目かのトライによってついに解決がしたので、どうやって問題を発見したのかなどをば。

■そもそもfuelphpでAmazon SESを使うには?

方法としては2種類あり、packageを使うかAWS SDK for PHPを使うかって感じ。
AWS SDK for PHPを使うとなると余計なクラスがあったりもそうだし、
ドライバというかクラスというかコントローラーというかそこら辺作らないといけないというめんどくさい感じだったので、
packageを使おうということでgithubで探してみたらあった。

rob-mccann/fuel-amazon-ses

これをダウンロードしてpackageに入れてうんちゃらうんちゃら。
この部分については後日また書く予定だけど、普通にSESを使うとかpackageを使ったことがあるならばわかるはず。
以下のようにやればサクッと送信できるので中々便利。

$sendmail = \Email::forge(array(
  "driver" => "ses",
  "charset" => "jis",
  "encoding" => "7bit"
))
->to("hogehoge@hogehoge.com")
->from("from@fromfrom.com","from name")
->subject("mail title")
->body("mail body")
->send();
単純にEmailクラスを使う際にドライバをsesにしてあげるだけという何とも便利なpackage。


■送る際に連続で送るのが悪い?

これかと一瞬思ったけど他のプログラム部分でも連続で送っていたりするわけで。
そもそもがデザインの作成者に対して1通送り、その後そのデザインに対していいね的なことをしている人たちに送るわけだけど、
そのデザインに対していいね的なことをしている人に送るときにだけ文字化けしていた。
いいね的なことをしている人を一人ピックアップして送ってみても文字化けをしていたので、
もしかしたら本文が悪いのかな?って考えてみた。


■メール本文がおかしい?

メール本文で文字コード的にありえない文字を入れているのか?って考えたけど、
そういう文字列はなかったのと、メール本文を作成に対して送る文と同じにしても文字化けをしてしまっていた。
なのでメール本文がおかしいという線は消えたけど余計に謎めいてしまった。


■プログラム中で変数使い回してるのがダメ?

メール文をrewriteするために、rewriteっていう配列用の変数を作ってたけど、
これを使い回してるのがダメかと思って、unsetで毎回初期化してみたけどそんなことはないわけで。
PHPだとそもそもが代入=初期化みたいなもんだし。


■タイトルがちょっと長かったのがNGだったと判明

//文字化けしないで送信出来たメールのタイトル部分
[subject:protected] => =?ISO-2022-JP?B?GyRCS1xGfCRoJGpNPUxzSE5HZCQsMys7TyQ3JF4kNyQ/ISobKEI=?=

//文字化けされた送信されたメールのタイトルぶぶん 
[subject:protected] => =?ISO-2022-JP?B?GyRCRWpJPCQ3JD8lRyU2JSQlcyROTT1Mc0hOR2QkLDMrO08kNyReGyhC?=
 =?ISO-2022-JP?B?GyRCJDckPyEqGyhC?=
という感じになってしまい、なぜか改行されてISO-2022-JPのエンコーディング?がまたされてるっぽいような感じ。
メールのタイトルに使える文字数を変更してみたところ、18文字までならば文字化けをせず、
19文字以上になると文字化けをしてしまうという感じであった。
多分fuelphpのSES用のpackageが18文字以下想定みたいな感じなんじゃないのかなと。
それかfuelphpのEmailクラス自体が18文字以下想定なのか、
jisコードで送る際は18文字までしか正常に送れないのではないかと。

とりあえず何かしろの対策を講じるのもいいけど、
タイトルは18文字以下で完結にわかりやすく見せるのがいいんじゃない?って思った感じ。

って感じで、fuelphp使おうがpackage使おうがこういうことってたまにあるわけで。
そういうときにどうしても対処しなければいけなかったらがんばるしかないし、
今回みたいに18文字以下で済ませればいいならばそういう対処でもいいと思うし。

ってことでフレームワーク使う場合も過信しすぎないように的なみたいな。

Adsense