スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    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編)はコチラ←現在編集中


      スポンサーサイト

      0

        • 2014.12.23 Tuesday
        • -
        • 12:52
        • -
        • -
        • -
        • -
        • by スポンサードリンク

        コメント
        メール送信に代替アクションを使う方法」についてですが、テンプレート側で

        <?
        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
             12
        3456789
        10111213141516
        17181920212223
        24252627282930
        << September 2017 >>

        twitter

        selected entries

        categories

        archives

        recent comment

        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
          プログラマー
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          ななうぇぶ
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • WindowsのPCで開発するphperがxhprofを使う方法
          ななうぇぶ
        • WindowsのPCで開発するphperがxhprofを使う方法
          川本
        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
          よし
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          77web
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          ktz

        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