4

外部 SMTP サーバー経由で Wi​​ndows 上の 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 コードを機能させる方法について、誰でも提供できる有益な提案をいただければ幸いです。

4

2 に答える 2

3

正しいトランスポートを使用する必要があります:

$transport = Swift_SendmailTransport::newInstance('C:\usr\lib\sendmail.exe');

UPDATE 次の行を使用します。

$transport = Swift_MailTransport::newInstance();
于 2013-07-05T08:41:22.080 に答える