[Zend Framework] Zend_Mail: 本文や添付CSVファイルをテンプレートから作成する
Zend_View を使って、メールの本文や添付CSVファイルをテンプレートから作成する方法を調べました。
ZendFrameworkのバージョンは、1.12.3です。
メールの送信設定に関しては「Zend_Mail – 設定を application.ini にまとめる | deadwood」を利用しています。
また、CSVファイルのテンプレートは「Zend_Controller – ContextSwitch アクションヘルパーを利用して、ひとつのコントローラー/アクションでhtml, xml, json, csv出力に対応する | deadwood」を使い回せるようにしてみました。
参考サイトはこちら。
用意したソース
メール送信を行う下記のActionに手を加えていきます。
CSVファイルを作成する元データとして配列を用意しています。
sendmailAction
public function sendmailAction() {
function mbCnv($string) {
return mb_convert_encoding($string, 'ISO-2022-JP', 'UTF-8');
}
function mbMime($string) {
return mb_encode_mimeheader(mbCnv($string), 'ISO-2022-JP', 'B');
}
$results = array(
array('title' => '路傍の石', 'author' => '山本有三', 'pub' => '1937'),
array('title' => '羅生門', 'author' => '芥川龍之介', 'pub' => '1915'),
array('title' => '城の崎にて', 'author' => '志賀直哉', 'pub' => '1917')
);
// メール本文をテンプレートから生成する
$bodyText = '';
// mail object を作成する
$mail = new Zend_Mail('ISO-2022-JP');
$mail->addTo('to@test.com');
$mail->setSubject('Welcome to exsample.com');
// 本文をメールに代入する
$mail->setBodyText(mbCnv($bodyText), null, Zend_Mime::ENCODING_7BIT);
// CSVをテンプレートから生成する
$atFile = '';
// CSVをメールに添付する
$at = new Zend_Mime_Part($atFile);
$at->type = 'text/csv';
$at->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$at->encoding = Zend_Mime::ENCODING_BASE64;
$at->filename = time() . '.csv';
$mail->addAttachment($at);
// メールを送信する
$mail->send();
}
メール本文のテンプレートとして /application/views/scripts/emails/template.phtml に下記の内容で作成しました。
宛名とサイト名を本文に埋め込むようなイメージです。
<?=$this->name; ?> さま
メロスは激怒した。必ず、かの邪智暴虐じゃちぼうぎゃくの王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此このシラクスの市にやって来た。メロスには父も、母も無い。女房も無い。十六の、内気な妹と二人暮しだ。この妹は、村の或る律気な一牧人を、近々、花婿はなむことして迎える事になっていた。結婚式も間近かなのである。メロスは、それゆえ、花嫁の衣裳やら祝宴の御馳走やらを買いに、はるばる市にやって来たのだ。先ず、その品々を買い集め、それから都の大路をぶらぶら歩いた。メロスには竹馬の友があった。セリヌンティウスである。今は此のシラクスの市で、石工をしている。その友を、これから訪ねてみるつもりなのだ。久しく逢わなかったのだから、訪ねて行くのが楽しみである。歩いているうちにメロスは、まちの様子を怪しく思った。ひっそりしている。もう既に日も落ちて、まちの暗いのは当りまえだが、けれども、なんだか、夜のせいばかりでは無く、市全体が、やけに寂しい。のんきなメロスも、だんだん不安になって来た。路で逢った若い衆をつかまえて、何かあったのか、二年まえに此の市に来たときは、夜でも皆が歌をうたって、まちは賑やかであった筈はずだが、と質問した。若い衆は、首を振って答えなかった。しばらく歩いて老爺ろうやに逢い、こんどはもっと、語勢を強くして質問した。老爺は答えなかった。メロスは両手で老爺のからだをゆすぶって質問を重ねた。老爺は、あたりをはばかる低声で、わずか答えた。
----
<?=$this->site; ?>
CSVファイルのテンプレートとして /application/views/scripts/getdata/cs.csv.phtml に下記の内容で作成しました。
<?php
foreach($this->results as $row) {
$data = $this->escape($row['title']) . ','
.$this->escape($row['author']) . ','
.$this->escape($row['pub']) . PHP_EOL;
echo mb_convert_encoding($data, "SJIS", "UTF-8");
}
メール本文
本文に差し込みたい値は assign すれば渡せるようです。
テンプレートの場所を教えて render する流れ。
sendmailAction
// メール本文の view object を作成する
$view = new Zend_View();
// メール本文に挿入する値を assign する
$view->assign('name', '太宰治');
$view->assign('site', 'exsample.com');
// メール本文をテンプレートから生成する
$view->setScriptPath(APPLICATION_PATH . '/views/scripts/emails/');
$bodyText = $view->render('template.phtml');
添付CSV
元のテンプレートにはダウンロード用のヘッダーを書き込んでいたのですが、使い回すためには別の場所で指定する必要がありました。
結果、シンプルに同じ流れで実現できました。
sendmailAction
// 添付CSVファイルの view object を作成する
$csvFile = new Zend_View();
// CSVに挿入する値を assign する
$csvFile->assign('results',$results);
// CSVをテンプレートから生成する
$csvFile->setScriptPath(APPLICATION_PATH . '/views/scripts/getdata/');
$atFile = $csvFile->render('cs.csv.phtml');