Я хочу отправлять электронные письма с помощью PHP в Windows через внешний SMTP-сервер. Для этой цели я должен использовать SwiftMailer.
Я могу отправлять электронные письма через внешний SMTP-сервер, используя встроенную функцию PHP mail () и Fake Sendmail для Windows, но Я не могу заставить SwiftMailer работать.
Рабочая установка с использованием функции PHP mail ()
Вот код PHP, который я использую для успешной отправки почты с помощью встроенной функции mail ().
$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"
Fake Sendmail для Windows имеет собственный файл sendmail.ini, в котором я указал свои smtp_server, smtp_port, auth_username и auth_password.
Когда я запускаю над PHP-кодом, загружая страницу в моем веб-браузере, вывод показывает, что функция mail () возвращает true, и электронное письмо прибывает в предполагаемое место назначения, как и ожидалось.
Попытка установки с использованием SwiftMailer (не работает)
Пытаясь достичь того же результата с помощью SwiftMailer, я заменяю свой PHP-код, приведенный выше, следующим, как указано в документация по SwiftMailer.
$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";
Когда я пытаюсь запустить приведенный выше PHP-код, загрузив страницу в моем веб-браузере, страница просто загружается навсегда. Я проследил PHP-код в библиотеке SwiftMailer, насколько смог, и обнаружил, что не могу видеть вывод эхо-операторов после строки «if ($ err = stream_get_contents ($ pipe [2])) {» ниже. Если я вырежу и вставлю «эхо« Хорошо, пока »и« умри »; строки после условия «если», либо внутри, либо вне фигурных скобок, следующих за «если», страница просто будет загружаться вечно.
/**
* 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];
}
Вещи, которые я уже пробовал
- Я пробовал использовать -bs вместо -t в команде / usr / lib / sendmail, переданной в Swift_SendmailTransport :: newInstance (). Я также пробовал не передавать никаких параметров (т.е. ни -bs, ни -t).
- Я попытался передать параметр from так же, как и при вызове встроенной функции mail () PHP выше. Когда я это сделал, SwiftMailer пожаловался, что мой адрес отправителя не соответствует RFC 2822.
- Я пробовал (благодаря предложению Майкла Сиволобова ниже), заменив '/ usr / lib / sendmail -t' на 'C: \ usr \ lib \ sendmail -t' и на 'C: / usr / lib / sendmail -t '. В обоих случаях страница просто загружается вечно.
- Я пробовал не передавать аргументы функции Swift_SendmailTransport :: newInstance () в надежде, что Swift определит путь к моему sendmail.exe из моего файла php.ini. В результате возникла следующая ошибка: «Неперехваченное исключение« Swift_TransportException »с сообщением« Процесс не может быть запущен [система не может найти указанный путь.] »Исключение было сгенерировано из раздела кода, воспроизведенного выше. Передача «-t» и «-bs» имела тот же эффект.
У меня нет идей. Мы будем очень благодарны за любые полезные предложения о том, как заставить работать код SwiftMailer.