クライアントさんのための作業(私の手書きPHP製WEBアプリをsymfonyへ移行)が一段落したので、勉強を兼ねてdjangoでいくつかアプリを作ってみています。
で、我々日本語話者にとって、海外製フレームワークを使うにあたっての重要な問題が…やはり発生fーー;
WEBサイトそのものの表示・DB接続周りは、UNICODEさんのお陰で改善されてきた今日この頃ですが、
問題はメールですよ、メール!日本語メール、文字化けせずに送れるか?が実用ベースに乗るかどうかの分かれ目と言っても過言じゃないかも…
まず、symfonyの場合。
symfony code snippetに「さこだ こうた」さんが投稿してくれたコードがあります。
sfMailを拡張するmyMailというカスタムクラスを作り、自前でmb_convert_encodingした
本文をつっこむというもの。
これだと、WEBサイトの表示用言語(かつ、DBやコード自体の文字コード)としてあまり一般的ではないiso-2022-jpに、メール送信直前にエンコード変換をすることができて、日本の一般人がちゃんと読める形式のメールを送ることができます。
※ちなみに、厳密に言うと上記snippetのコードだけでは日本語メールは送れません。
私が自作して使っているmbMailクラスを公開しますと…
/**
* class for sending japanese mail.
* @auther *MOMO*
*/
class mbMail extends sfMail
{
public function initialize()
{
parent::setCharset('iso-2022-jp');
parent::setEncoding('7bit');
mb_language("Ja");
mb_internal_encoding('UTF-8');
}
public function setBody ($body)
{
parent::setBody(mb_convert_encoding($body, 'JIS', 'UTF-8'));
}
public function setSubject ($title)
{
parent::setSubject(mb_convert_encoding($title, 'JIS', 'UTF-8'));
}
public function setFrom ($mail, $from)
{
parent::setFrom($mail, mb_encode_mimeheader(mb_convert_encoding($from,'JIS','UTF-8'),'JIS','B'));
}
}
こんな感じです。
これだと、日本語のタイトル・日本語の送信者名・日本語の本文のメールがsymfonyから送れます。
#勝手に解説(自画自賛)
#最初の段階→code snippetのコードをコピペしても動かない!焦る。
#次の段階→initializeメソッドを作らず、Body/From/Subject等どのメソッドから呼ばれてもいいように↑↑でinitializeメソッドに置いてる処理を各メソッドに重複して書く。冗長で読みづらくていやぽ。
#最終段階→初期化処理を作ればいいじゃん!私って頭よくない?と気づく。自画自賛←今ココ
但し、注意がひとつ。
symfonyでのメール送信の説明@symfony BOOK 日本語版の中盤に載っている、「メール送信に代替アクションを使う方法」ではできませんでした。
MVCが綺麗に分離するので「美しい(笑)!」んですが、
・ビュー(sendSuccess.php等)をJISで書いても、
・sendActionの中でsfMailの代わりに上記mbMailをインスタンスしても、
文字化けしました(T_T)
結局、DBにメールのテンプレをつっこんで、必要な時にテンプレを呼び出して一々セットする形で実装しました。
…
/* メールテンプレート1を使って送信する */
$temp=MailTemplatePeer::retrieveByPk(1);
$mail= new mbMail();
$mail->setSubject($temp->getSubject());
$mail->setBody($temp->getBody());
$mail->setFrom($temp->getFromMail(),$temp->getFromName());
$mail->addAddress($customer->getMail());
$mail->send();
…
※実運用してるコードには、$temp->getBody()で取得するテキストの中に埋め込んだ#name#をstr_replaceで変換する処理とか、場合分けとか、もっと色々書き込んであります。
一応この方法にはメリットもあって、「FTPってナニ?」「プログラムってナニ?」なエンドユーザ(私のクライアントさん)自身でメールのテンプレを簡単に編集できること。
美しくはないし、コードの見通しも正直言ってイマイチですが、日本語メールが実際に正常に送信できていること、クライアントさんはむしろメール雛形が編集できることを喜んでくれたため、今回はこれで良しとしました。
続き(django編)はコチラ←現在編集中
<?
echo mb_convert_encoding("メール本文です。
", 'JIS', 'UTF-8');
?>
見たいにすると送信できるみたいです。ちょっとすっきりしませんが。テンプレート読込はsfMail は介さないみたいですね。