Zend Framework [2] - Mail

2007.09.21 Author: Jas

正式版がリリースされたばかりの「Zend Framework」、今回はメール機能の紹介です。
Zend_Mailはテキストメール、HTMLメール、添付ファイル付メールに対応しており、複数の宛先へのメール送信も簡単に行うことができます。また、送信・受信共に複数のプロトコルに対応しており、SMTP認証やTLS/SSLによるメール送信も可能です。

ただし、Zend_Mailで日本語のメールを取り扱う場合には、少し注意が必要です。
そこで、今回はZend_Mailを使った日本語のメールの送信方法を紹介します。

開発環境: Zend Framework 1.0.1 / PHP 5.1.6 (スクリプトの文字コード: UTF-8)

とは言っても、難しい設定は必要ありません。
日本語のメールを送信する前に、文字コードをISO-2022-JPに変換するだけです。


// ライブラリの読み込み
require_once('Zend/Mail.php');

// 文字コードをISO-2022-JPに変換
$body = "Zend_Mailで日本語を送信<br>日本語使用時は文字コードに注意";
$subject = '日本語送信テスト';
$body = mb_convert_encoding($body, 'ISO-2022-JP', 'UTF-8');
$subject = mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8');

// 文字コードを'ISO-2022-JP'でインスタンス生成
$mail = new Zend_Mail('ISO-2022-JP');

// パラメータの設定
$mail->setBodyText($body);
$mail->setFrom('送信元メールアドレス', '送信者名');
$mail->addTo('送信先メールアドレス', '受信者名');
$mail->setSubject($subject);


このように、Zend_Mailのインスタンスを生成する際に文字コードをISO-2022-JPに指定しておき、ボディとヘッダーに文字コードをISO-2022-JPに変換した文字列を設定するだけです。

もし、添付ファイルも送信したい場合は次のようにします。


// 添付ファイル()
$attach = 'バイナリ変換した添付ファイル';
$mail->createAttachment($attach, 'text/plain',
Zend_Mime::DISPOSITION_INLINE, Zend_Mime::ENCODING_8BIT);

// Boundaryの設定(独自のものを使いたい場合)
$mail->setMimeBoundary('=_' . md5(microtime(1)));


createAttachment()の第一引数にバイナリ変換した添付ファイル、第二引数で"'text/plain"や"image/gif"のようにファイルタイプを指定します。
マルチパートのBoundaryは自動で設定されますが、独自のものを使いたい場合にはsetMimeBoundary()で指定することができます。

// 送信
try {
    $mail->send();
    echo 'メールの送信に成功しました';
} catch (Zend_Exception $exception) {
    echo 'メールの送信に失敗しました';
    echo $exception;
}
送信にはsend()を使います。 エラーが起こったときのためにもtry-catchでメールの送信を行いましょう。

これで日本語メールの送信ができるはずです。
Zend_Mailはデフォルトではsendmailを用いてメールの送信を行いますが、SMTPでのメール送信も可能です。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ