2011年9月10日土曜日

QdmailでHTMLメール送信の件、フレームワークはcakePHP

cakePHPを使って開発している、QdmailでHTML送信したいですが、思うように動かなかった。

HTMLのタグが無視されたり、変な「?」が表示されたり、とにかくすんなり行かない。
やっと最後はうまく行ったので、やったことをメモしとく

環境はこう:
cakePHP 1.3
centOS 5

まずは勿論Qdmailをダウンロード、http://hal456.net/qdmail/downloads#p6.1 使ったのはqdmail.1.2.5b.zip 解凍して、controllers/components/に入れます。

まずこのqdmail.phpを改造しないと行けない

まずは3821行あたり
	$content = $view->renderElement( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
この一行をこう変えます
	if( version_compare(Configure::version(), '1.3.0') < 0){
		$content = $view->renderElement( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
	}else{
		$content = $view->element( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
	}
すると、cakePHP1.3も使えるようになった。

そして前回の投稿にも紹介した、340行あたり
	'multipart/alternative'=>array(
		'html'		=>	1,
		'plain'		=>	1,
		'OMIT'		=>	true,
	),

のhtmlとplainの順番を差し替え
	'multipart/alternative'=>array(
		'plain'		=>	1,
		'html'		=>	1,
		'OMIT'		=>	true,
	),
こうするとGmailなどもHTMLのタグを正常に表示てきる。

改造終わったら、いよいよコーディング
例えば、仮登録後に本登録のメールを送信する
registers_controller.phpで
class RegistersController extends AppController {
	var $components=array('registerLogic');//送信ロジックはコントローラーで書きたくないから専用のcomponentsを作成した
	var $helpers = array('Form','Notify');
	var $name = 'Registers';

	function beforeFilter() {
		$this->Auth->allow('add');//ログインしたくでも新規登録ができる
	}

	function add() {
		$this->layout = "login";//これはただレイアウトを引用
		$params = $this->getRequestParams();//これはフォームからの変数を受け取るメソッド
		if (!empty($params)) {
			$params['session'] = $this->Session->read('Config.userAgent');//セッションIDを取得
			$deleteCondition = array('session' => $params['session']);
			$this->Register->deleteAll($deleteCondition);//セッションにが既に登録してたら、削除
			$this->Register->create();//仮登録を登録
			if ($this->Register->save($params)) {

				//下のredirectをするとこのテロップが表示されなくなるらしい、セッションレベルを「low」にしても、受け継がない、困る
				$this->Session->setFlash(__('登録しました', true));
				$this->registerLogic->sendRegisterMail($params);//専用のcomponentsを読んで、送信する
				$this->redirect(array('controller' => 'info','action' => 'warning',__REGISTER_COMPLETED__));//完了画面を表示
			}
		}
	}
}
そしてregisterLogic.php
class RegisterLogicComponent extends object {
	var $components = array('Qdmail');//ここでQdmailを引用
	function startup(& $controller) {
		$this->_controller = $controller;//コントローラーをセット

		//モデル読み込み
		App::import('Model','register');//モデルは必須ではないけど
		$this->_registerModel  = new register;

		$this->Qdmail->startup($this->_controller);//コントローラーをセット
	}
	
	function sendRegisterMail($params) {
		$content = array(
						"title"=>__REGISTER_MAIL_SUBJECT__,//登録メールの定数メッセージ、別途定義済み
						"to"=>"あなた様",//何でもいい
						"session"=>$params['session'],//メールの正文で使うセッションIDを用意
						"body"=>"ご注文ありがとうございました。");//なんでもいい

		$this->Qdmail->to($params['email'],'あなた');//送信先を定義、「あなた」は受信者名、一応ね
		$this->Qdmail->subject(__REGISTER_MAIL_SUBJECT__);//定数
		$this->Qdmail->from(__NOREPLAY_MAIL_ADDRESS__ , __NOREPLAY_MAIL_FROM__);//送信者、ここも定数

		//QdmailでcakePHPのメール要素(テンプレート)とレイアウトを引用するメソッド
		//引数1:テンプレート(メール正文)で使う変数
		//引数2:テンプレート、パスは views\elements\email\html\
		//引数3:レイアウト、パスは views\layouts\email\html\
		$this->Qdmail->cakeHtml($content,'register','karu');
		$this->Qdmail->send();
	}
}
テンプレートはこんな感じ、
<?php echo $content["to"]; ?>様
<br />
この度は 「某某某某某」 に仮登録頂き 誠にありがとうございます。
<br /><br />
<?php echo $content["body"]; ?><br />
登録を完成するには、下記リンクをクリックし、本登録を完成させる必要があります。<br />
<a href="http://某某某某.com/user/add?ssid=<?php echo $content["session"]; ?>">href="某某某某.com/user/add?ssid=<?php echo $content["session"]; ?></a><br />
注意:このリンクは48時間以内有効です、48時間を超えた場合、再度仮登録からやり直す必要があります。
<br /><br />
宜しくお願いします。<br />
【某某某某.com】事務局より

ここでポイント!

①文字コードをJISに変換してください、改行コードはLF
(じゃないと何故か変数はOKだけど、テンプレートの日本語が全部化けちゃう)

②最後のEOFを改行
(じゃないとなぜか最後の行にモジバケがつく)

レイアウトはこんな感じ、日本語ないからエンコードはどうでもいい
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
	<title><?php echo $title_for_layout;?></title>
</head>
<body style="font-size:12px;background-color:#fafafa;padding:20px;">
	<div style="border:solid 2px #b7ddf2;background:#ebf4fb;margin:20px auto;width:800px;padding:14px;">
	<h1 style="font-size:14px;font-weight:bold;margin-bottom:8px;margin-bottom:20px;border-bottom:solid 1px #b7ddf2;padding-bottom:10px;">
		<?php echo $title_for_layout;?>
	</h1>
<?php echo $content_for_layout;?>
	</div>
<p>
		<div style="text-align: center;">
			Copyright(C) xxxxxx. All Rights Reserved.
		</div>
</p>
</body>
</html>

ここでポイント!

CSSは無効!インラインstyleタグのみ、以前のブログも紹介した
まぁ、以上かな…
そうだ自宅サーバですので、プロバイダーはplalaです、OP25B対策しないと送信できない、ここをご覧plalaのOP25B対策、sendmail編

0 件のコメント:

コメントを投稿