Qdmailで件名がうまく表示できなかった件

CakePHP 1.2 RC3を利用しています。
CakePHP 1.2 Finalが出たのでそろそろ乗り換えないと。。。


CakePHPでの開発時、コンソール処理も含めてメール送信はQdmailを使わせてもらってます。日本語メールでCakeから安心して使えるコンポーネントなので、助かってます。ありがとうございます。
http://hal456.net/qdmail/

今回、Qdmail 1.2.6とCakePHP1.2 RC3とpostfix-2.3.3-2.1.el5_2 on Redhat Linuxの環境で、日本語メールを送信してました。ほとんどのクライアントでは問題なかったのですが、Becky2.42のある人の環境のみ、なぜか日本語の件名が16文字目で切れてしまい、Base64エンコード文字列が件名に混ざってしまいました。ほかのバージョンのBeckyでは発生しませんでした。

色々と試した結果、下記の1文を追加したら直りました。

$this->Qdmail->lineFeed("\n");


ということで、これからは下記のようにメールを送信するステップを踏むようにしようと思います。

$this->set('data', $result['Model']);
$content = $this->render('mailsendaciton', null , null);
$this->output = '';

//半角カナを全角に変換(文字化け対策)
mb_internal_encoding("UTF-8");
$content = mb_convert_kana( $content, "K");

mb_language('ja');
$this->Qdmail->lineFeed("\n");


$this->Qdmail->to( MAIL_TO );
$this->Qdmail->from( MAIL_FROM , MAIL_FROM_NAME );
$this->Qdmail->subject( REMINDER_MAIL_SUBJECT );

$this->Qdmail -> text( $content );
$this->Qdmail -> send();

メール送信時に(Viewの)テンプレートファイルを使う方法

CakePHP 1.2.0.7125 RC1.を使ってるのですが、メール送信時にメール本文をテンプレート化してそれを読み込んで送信しようと思い、検索したところ、controllerのrenderの内容を出力するob_get_clean(); の存在を知り、いろいろやってたんですがどうもうまくいかない。メール本文の内容まで画面に出力されてしまった。

駄目だったコードはこんな感じ

 ob_start();  
 $this->render(null, 'email', 'infomail');  
 $body = ob_get_clean();

$bodyにメール本文が入り、それをメール送信関数に渡します。
このob_get_cleanで直前までのrenderの内容を出力して変数に入れることが出来ます。
その後、該当アクションのviewのファイルが呼ばれて画面にhtml出力されます。


うまくいくとこんな感じになるのですが、今回のCakeのバージョンだと$this->renderしてob_get_cleanを読んでも内容が変数に入らず、画面に表示されてしまう。



ということで、cake/libs/controller/controller.phpの中のrenderメソッドのコードを読んでみたら、下記のようになってた。

function render($action = null, $layout = null, $file = null) {

        途中省略。

	$this->autoRender = false;
	$this->output .= $View->render($action, $layout, $file);

	return $this->output;
}


renderはbooleanが返ってくるかと思ってたら、テンプレートファイルの内容をreturnしてるもよう。
そして、$this->outputがviewで呼び出されて画面に出力される。

ということで、下記のようにしてみた

	$this->set("inputdata",$data);
	$content = $this->render(null,'email', 'infomail');
	$this->output = '';


上記のコードでは、テンプレートに渡すinputdataに出力したい内容の$dataをセットし、renderメソッドのreturn値をメール本文に該当する$contentに入れる。最後に、render内で$this->outputに入ったメール本文の内容を消去。
そしてこの後に、viewで該当アクションのテンプレートが呼ばれて、$this->outputに画面表示用のhtmlがセットされて画面に出力される。


上記のコードの場合、renderの第2引数でレイアウトファイルemail.ctpを定義し、第3匹数でテンプレートファイルinfomail.ctpを定義しているので、app/view/layouts/email.ctpと、app/view/モデル名/infomail.ctpを用意しておく。

app/view/layouts/email.ctpでは、下記のような内容を定義

<?php echo $content_for_layout; ?>

-----------------------------------
xxxx@xxxxxxx.jp
シグネチャの内容
-----------------------------------

$conent_for_layoutに、下記のテンプレートの内容がセットされる

app/view/モデル名/infomail.ctpの内容

お問い合わせ頂きありがとうございます。

下記がお問い合わせ内容です。

会社名:<?php echo $inputdata['モデル名']['companyname']; ?>


名前:<?php echo $inputdata['モデル名']['username']; ?>


上記のテンプレートは、コントローラーで
$this->set("inputdata",$data);
としていて、$dataに$data['モデル名']['companyname']とセットされているのが前提です。