django対symfony 日本語メール送信(その1 symfony編)

0
    クライアントさんのための作業(私の手書き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 は介さないみたいですね。
    • 2007/05/31 12:33 PM
    もう解決されてるかもしれませんが、コンストラクタでinitializeしてしまう荒技で、代替アクションを使う方法も(手元では)うまくいきました。hogeSuccess.phpはUTF-8で書いておけばOKぽいです。

    といってもこちらのページが大変参考になりました。ありがとうございます。:-)
    >mさん
    なるほど!
    action側は色々とテストしてみたつもりですが、テンプレート側はあまり弄ってみませんでした。
    次のプロジェクトでsymfony使うことがあれば、やってみますね^^;


    >u-nojiさん
    ブログのエントリー拝見しました!
    initializeメソッドの内容は1件1件文字化けメールと通常のメールのヘッダを見比べながら試行錯誤した結果ですので、お役に立ってよかったです〜^^;
    たった今、ローカルでコンストラクタでinitializeを呼ぶ方法で文字化けなしを確認しました。
    このエントリを書いたきっかけになったプロジェクトでは、最終的にクライアントさんが自分でメール雛形を編集したいということになり、そのまま納品しました。
    次回、定型文の日本語メールが必要な機会があれば、使いたいと思います。
    ありがとうございました!
    • ★もも★
    • 2007/06/03 6:33 PM
    コメントする








       
    この記事のトラックバックURL
    トラックバック
    QdmailがSymfony対応となりました。Symfonyで日本語メールbyQdmail今回、初めてSymfonyを触りましたが、ちょっとややこしや〜という感想。大規模サイトならいいのでしょうかね。でも、PHP5専用だけあって、コードはCakePHPより...
    • CPA-LABテクニカル
    • 2008/09/30 7:00 AM

    PR

    calendar

    S M T W T F S
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
    << January 2012 >>

    twitter

    selected entries

    categories

    archives

    recent comment

    • coreserverにOpenPNE3.6.0をインストール(速度はともかくxreaも同手順で可)
      kazu
    • coreserverにOpenPNE3.6.0をインストール(速度はともかくxreaも同手順で可)
      77web
    • coreserverにOpenPNE3.6.0をインストール(速度はともかくxreaも同手順で可)
      Tsukasa
    • coreserverにOpenPNE3.6.0をインストール(速度はともかくxreaも同手順で可)
      jun
    • coreserverにOpenPNE3.6.0をインストール(速度はともかくxreaも同手順で可)
      dk
    • symfony+Ajaxでhierselectを実現!
      ビギナーシンフォニアン
    • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
      momo
    • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
    • 復活^^;
      もも
    • pychart使いたいよう…(泣
      もも

    recent trackback

    • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
      常山日記
    • django対symfony 日本語メール送信(その1 symfony編)
      CPA-LABテクニカル
    • CodeIgniterでユーザー認証
      されどLAMPな日々
    • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
      常山日記
    • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
      サーバー用語集
    • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
      常山日記
    • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
      mitszoの日記
    • python多次元リストをsort(並べ替え)する方法?
      mitszoの日記
    • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
      Humming Via Kitchen
    • 日本語テキストをtruncate@django(Python全般にも??)
      常山日記

    recommend

    links

    profile

    search this site.

    others

    mobile

    qrcode

    powered

    無料ブログ作成サービス JUGEM