Как я могу использовать поддельный sendmail со SwiftMailer в Windows?

Я хочу отправлять электронные письма с помощью 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.


person Tom    schedule 05.07.2013    source источник
comment
После долгого разочарования я решил отказаться от SwiftMailer и вместо этого установить PHPMailer. У меня не было проблем с настройкой PHPMailer.   -  person Tom    schedule 09.07.2013


Ответы (2)


Вам необходимо использовать правильный транспорт:

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

ОБНОВЛЕНИЕ Используйте эту строку:

$transport = Swift_MailTransport::newInstance();
person Michael Sivolobov    schedule 05.07.2013
comment
Спасибо за предложение, Майкл, но это не помогло. Я обновил раздел «Что я пробовал», включив в него ваше предложение. - person Tom; 08.07.2013
comment
@Tom, попробуй использовать $transport = Swift_MailTransport::newInstance(); - person Michael Sivolobov; 08.07.2013
comment
Еще раз спасибо и хорошие мысли, но это не решило проблему. Я снова обновил свой вопрос. - person Tom; 08.07.2013
comment
Дело не в отсутствии аргументов для конструктора транспорта. Речь идет о другом транспортном классе: Swift_MailTransport вместо Swift_SendmailTransport - person Michael Sivolobov; 08.07.2013
comment
О верно. Надеюсь, это решит проблему для кого-то другого. Я решил отказаться от SwiftMailer и вместо этого установить PHPMailer. У меня не было проблем с настройкой PHPMailer. Спасибо за все ваши предложения. - person Tom; 09.07.2013

Предположим, вы установили поддельный sendmail в локальный каталог, например:

C:\wamp64\bin\sendmail\sendmail.exe

Отредактируйте свой php.ini файл следующим образом:

sendmail_path = "C:\wamp64\bin\sendmail\sendmail.exe -t"

Отредактируйте свой sendmail.ini файл следующим образом:

smtp_server=localhost
smtp_port=25
smtp_ssl=none

затем используйте транспорт SMTP swiftmailer следующим образом:

$transport = new Swift_SmtpTransport('localhost', 25);
  • Swift_SendmailTransport предназначен только для исполняемого файла (Linux / UNIX).

Для пользователей Laravel

процесс тот же, но вам также необходимо отредактировать ваш .env файл следующим образом:

MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=25
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=
[email protected]
MAIL_FROM_NAME="My Name"
person Luca Filosofi    schedule 15.11.2017
comment
Наконец-то .. Спасибо! Ты спас мне день! - person Junaid Atari; 09.06.2018