Yiiでメール周りの設定をする

Yiiでメールまわりの設定を行います。利用するのは、mailerというエクステンションです。
設定は、エクステンションをダウンロードし、protected/extensions以下に展開するだけで完了します。

使う際は、コントローラやモデル内で

$to='abc@example.com';
$from='def@exapmple.com';
$subject='件名です';

$charset='iso-2022-jp';
$encoding='7bit';
$layout='main';
$view='regist';

mb_language('Japanese');
mb_internal_encoding('UTF-8');

$mailer = Yii::createComponent('application.extensions.mailer.EMailer');
$mailer->CharSet = $charset;
$mailer->Encoding = $encoding;
$mailer->addAddress($to);
$mailer->From=$from;
$vars=array(
  'sitename'=>Yii::app()->name,
);
$mailer->getView($view,$vars,$layout);
$subject=mb_convert_encoding($subject,$charset,mb_internal_encoding());
$mailer->Subject=mb_encode_mimeheader($subject);
$mailer->Body=mb_convert_encoding($mailer->Body,$charset,mb_internal_encoding());
$mailer->send();

のように書けばよいです。なお、

$layout='main';

はメール本文で利用するレイアウトです。内容はprotected/views/email/layous/main.phpに以下のような感じに書きます。
$contentにはメール本文が置換されます。

レイアウトのヘッダ部分です。

<?php echo $content; ?>

レイアウトのフッタ部分です。

レイアウトを利用しない場合は、

$layout=null;

のようにします。

$view='regist';

はメール本文で利用するテンプレートです。内容は、protected/views/email/regist.phpに以下のような感じに書きます。

メール本文です。

サイト名: <?php echo $sitename; ?>

テンプレートで利用できる変数は

$vars=array(
  'sitename'=>Yii::app()->name,
);

の部分で設定します。

ただ、実際に使っていると

  • メールの件名についてもテンプレートファイルで管理したい。仕様としてはテンプレートファイルの1行目をメールの件名とする。2行目以降をメールの本文として扱うという感じです。
  • レイアウトについても変数を利用したい。

と思いましたので、EMailerクラスのラッパーを作成しました。
といってもgetView関数を以下のようにちょこっと修正しただけなんですが。

   public function getView($view, $vars = array(), $layout = null)
   {
      $body = Yii::app()->controller->renderPartial($this->pathViews.'.'.$view, array_merge($vars, array('content'=>$this->_myMailer)), true); 
      list($subject,$body)=explode("\n",$body,2);
      $this->_myMailer->Subject=$subject;
      if ($layout === null) {
         $this->_myMailer->Body = $body;
      }
      else {
         $this->_myMailer->Body = Yii::app()->controller->renderPartial($this->pathLayouts.'.'.$layout, array_merge($vars, array('content'=>$body)), true);
      }
   }

なお、これを使う場合、mailerエクステンションの使用方法は以下のような感じになります。

$to='abc@example.com';
$from='def@exapmple.com';

$charset='iso-2022-jp';
$encoding='7bit';
$layout='main';
$view='regist';

mb_language('Japanese');
mb_internal_encoding('UTF-8');

$mailer = Yii::createComponent('application.extensions.mailer.EMailer');
$mailer->CharSet = $charset;
$mailer->Encoding = $encoding;
$mailer->addAddress($to);
$mailer->From=$from;
$vars=array(
  'sitename'=>Yii::app()->name,
);
$mailer->getView($view,$vars,$layout);
$mailer->Subject=mb_convert_encoding($mailer->Subject,$charset,mb_internal_encoding());
$mailer->Subject=mb_encode_mimeheader($mailer->Subject);
$mailer->Body=mb_convert_encoding($mailer->Body,$charset,mb_internal_encoding());
$mailer->send();

また、protected/views/email/regist.phpの内容も以下のようにします。

件名です。
メール本文です。

サイト名: <?php echo $sitename; ?>
投稿日:
カテゴリー: php タグ:

2件のコメント

コメントは受け付けていません。