外部 SMTP サーバー経由で Windows 上の PHP を使用して電子メールを送信したいと考えています。この目的にはSwiftMailerを使用する必要があります。
PHP のネイティブ mail() 関数とFake Sendmail for Windowsを使用して、外部 SMTP サーバー経由で電子メールを送信できますが、 SwiftMailerを動作させることができません。
PHP の mail() 関数を使用した作業セットアップ
これは、ネイティブの mail() 関数を使用してメールを正常に送信するために使用する PHP コードです。
$returnValue = mail
(
$params['to' ],
$params['subject'],
$params['body' ],
"From: Sender McSender <{$params['from']}>"
);
echo "mail() returned "; var_dump($returnValue);
これが私の php.ini ファイルの関連部分です。
[mail function]
sendmail_path = "C:\usr\lib\sendmail.exe"
Windows 用の偽の Sendmail には、smtp_server、smtp_port、auth_username、および auth_password を指定した独自の sendmail.ini ファイルがあります。
Web ブラウザーでページを読み込んで上記の PHP コードを実行すると、出力は mail() 関数が true を返し、電子メールが意図した宛先に期待どおりに到着することを示しています。
SwiftMailerを使用してセットアップを試みた(機能しない)
SwiftMailerを使用して同じ結果を達成しようとして、 SwiftMailer のドキュメントで指示されているように、上記の PHP コードを次のコードに置き換えます。
$transport = Swift_SendmailTransport::newInstance('/usr/lib/sendmail -t');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
->setSubject($params['subject'])
->setFrom($params['from'])
->setTo($params['to'])
->setBody($params['body']);
$nSent = $mailer->send($message);
echo "Number of emails sent: $nSent\n";
Web ブラウザーでページを読み込んで上記の PHP コードを実行しようとすると、ページが永遠に読み込まれます。SwiftMailer ライブラリの PHP コードをできる限りトレースしたところ、下の「if ($err = stream_get_contents($pipes[2])) {」行の後に echo ステートメントからの出力が表示されないことがわかりました。「エコー「今のところ大丈夫」」と「死ぬ」をカットアンドペーストすると、「if」条件の後の行、「if」に続く中括弧の内側または外側のどちらでも、ページは永久にロードされ続けます。
/**
* Opens a process for input/output.
*/
private function _establishProcessConnection()
{
echo "In StreamBuffer->_establishProcessConnection()\n";
$command = $this->_params['command'];
$descriptorSpec = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
);
$this->_stream = proc_open($command, $descriptorSpec, $pipes);
stream_set_blocking($pipes[2], 0);
echo "Okay so far.\n";
die;
if ($err = stream_get_contents($pipes[2])) {
throw new Swift_TransportException(
'Process could not be started [' . $err . ']'
);
}
$this->_in =& $pipes[0];
$this->_out =& $pipes[1];
}
私がすでに試したこと
- Swift_SendmailTransport::newInstance() に渡される /usr/lib/sendmail コマンドで、-t の代わりに -bs を使用してみました。パラメータを渡さないようにしました(つまり、-bsも-tも)。
- 上記の PHP のネイティブ mail() 関数の呼び出しと同じ方法で「from」パラメーターを渡そうとしました。私がそれを行ったとき、SwiftMailer は私の「送信元」アドレスが「RFC 2822 に準拠していない」と不平を言いました。
- '/usr/lib/sendmail -t' を 'C:\usr\lib\sendmail -t' と 'C:/usr/lib/sendmail -t' に置き換えてみました (以下の Michael Sivolobov の提案のおかげで)。 '。どちらの場合も、ページは永久にロードされ続けます。
- Swift が php.ini ファイルから sendmail.exe へのパスを見つけ出すことを期待して、Swift_SendmailTransport::newInstance() 関数に引数を渡さないようにしました。これを行うと、次のエラーが発生しました。「メッセージ「プロセスを開始できませんでした [システムが指定されたパスを見つけることができません。]」を含む例外「Swift_TransportException」がキャッチされません。「-t」と「-bs」を渡すと、同じ効果がありました。
私はすべてのアイデアがありません。SwiftMailer コードを機能させる方法について、誰でも提供できる有益な提案をいただければ幸いです。