目次

Ethnaを使ってメールを送信する

| halt | 2006-11-06 17:53 | メールを送信する最短のサンプルを追加 | | psuke | 2006-12-07 09:53 | 最短のサンプルを修正してみました。 | | ichii386 | 2007-01-18 | Ethna_MailSender.php,vの1.9にあわせて修正 | | mumumu | 2009-10-18 | 「メール送信がうまくいかない場合」のセクションを追加 |

Ethnaを使ってメールを送信する

テンプレートファイルの作成

project_dirの/template/jaにmailフォルダを作成、そこにテンプレートを配置します。

テンプレートはこんな感じで書きます。

welcome.tpl

From: webmaster@example.com
Subject: 入会に成功しました。

ようこそ{$username}さん。
うんたらかんたらほげほげ。

MailSenderの実行

テンプレートを書いたら送信したい時に

$ethna_mail =& new Ethna_MailSender($this->backend);
$ethna_mail->send('send_to_mail@example.com',
    'welcome.tpl',
    array('username' => $regist_user));

とすれば送信できます。

Ethna_MailSenderを拡張する

(1) Ethna_MailSenderをextendsしたクラスの作成

PATH_TO_PROJECT_ROOT/lib/Sample_MailSender.php
テンプレートの指定は、$defメンバに定義します。(0は使われてるので1から)

<?php
// {{{ Sample_MailSender
class Sample_MailSender extends Ethna_MailSender
{
      /** @var array メールテンプレート定義 */
      var $def = array(
              '1' => 'user_resign' ,
              '2' => 'user_register'
      );

      /**
       * アプリケーション固有のマクロを設定する(なにか共通で使うのがあれば)
       */
      function _setDefaultMacro($macro)
      {
              return $macro;
      }
}
?>

app/Sample_Controller.php で include します。

+ include_once('Sample_MailSender.php');

(2) メールテンプレートの設置

テンプレートのディレクトリはデフォルトでは PATH_TO_PROJECT_ROOT/template/ja/mail になります。このディレクトリに user_resign と user_register というファイルを設置します。

メールのテンプレートもHTMLのテンプレートと同じ要領でアサインされた変数を使えます。(使える Smarty 変数は _setDefaultMacro とか後で Ethna_MailSender::send で引数で与えられます)普通のメールと同じように 最初の空行でメールヘッダとメール本文を区別します ので、入れたいヘッダがあれば以下のように記述します。

From: webmaster@example.com
Subject: ユーザが退会しました
Bcc: resign@example.com
X-Mailer: Ethna-{$smarty.const.ETHNA_VERSION}/Ethna_MailSender

{$username}さんが退会しました。
処理してください

-- example.com

(3) 送信処理

ActionClassとかで

$ethna_mail =& new Sample_MailSender($this->backend);
$ethna_mail->send('send_to_mail@example.com',
    '1',
    array('username'=>$resign_user));

とすれば、Smarty変数usernameに$resign_userがアサインされてメールが send_to_mail@example.com 宛に送信されます。

添付ファイル

send()の4つめの引数に添付ファイル(multipart)を指定することができます。

メール送信のトラブルシューティング

文字化けの対応

Ethna_MailSender は php の mail()関数を使っています。ほかのライブラリに依存しないメリットがあるものの、 Ethna のデフォルトである euc-jp 以外で運用すると文字化けしやすいかもしれません。

届いたメールの subject などが文字化けする場合、次のことを確認してください。

のようなかんじでうまいこと指定してあげてください。

送信できない、メール本体が空になる場合(2.5.0以降)

Ethna ではメール送信の処理に、内部で mail() 関数を使っています。ですので、使用するMTA(特にqmail等) によっては、メールに対する改行コードの扱いによって以下のような挙動をすることがあります。

こういった場合、[appid]-ini.php に以下の設定を行って再度メール送信を行ってみてください。この設定を行うと、mail() 関数で発生する問題の大半の原因となる 「改行コード CRLF を一律にメールに付加する動き」を回避するようになります。

ただし、これは最後の手段にしてください。というのも、この設定はRFCに違反する動きを強制するものだからです。

$config = array(
    // mail 
    'mail_func_workaround' => true,
);