Zend Framework – Zend_Mailのドキュメントの間違い

Zend_MailのSMTPによるメール送信で単一コネクションで複数のメールを送信する場合のマニュアルが間違えているので注意。確認したVersionと箇所は以下。

ZendFramework1.0.2
21.3. SMTP 接続による複数のメールの送信

「例 21.4. SMTP 雪像による複数のメールの送信」によると以下の様に書かれている。

require_once 'Zend/Mail.php';
$mail = new Zend_Mail();
// メッセージを作成します...
require_once 'Zend/Mail/Transport/Smtp.php';
$tr = new Zend_Mail_Transport_Smtp('mail.example.com');
Zend_Mail::setDefaultTransport($tr);
$tr->connect();
for ($i = 0; $i < 5; $i++) {
$mail->send();
}
$tr->disconnect();

が、上記だとZend_Mail_Transport_Smtpにconnectメソッドが無いのでエラーになる。

代わりにZend_Mail_Protocol_Smtpにあるのでそっちでコネクションを張ってZend_Mail_Transport_SmtpのsetConnectionメソッドでセットしてやる。

<?php
$connection = new Zend_Mail_Protocol_Smtp($host, $port);
$connection->connect();
$connection->helo();

$tr = new Zend_Mail_Transport_Smtp;
$tr->setConnection($connection);

// 以下ループ処理
$mail = new Zend_Mail();

上記方法で1コネクションで複数のメール送信が出来る。

Zend_Mail_Transport_Smtpのデストラクタでdisconnectメドッソが呼ばれて自動的に接続解除されるので通常は問題無い。しかしSMTP接続がネットワーク障害で切れてしまった場合、disconnectの前に呼ばれるSMTPコマンドのQUITで例外が投げられるがデストラクタの例外は拾えなくてFatal Errorになってしまうので注意。