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

Я хочу отправить электронные письма с помощью PHP в Windows через внешний SMTP-сервер. Для этой цели я должен использовать SwiftMailer .

Я могу отправлять электронные письма через внешний SMTP-сервер, используя функцию PHP (например, PHP) и Fake Sendmail для Windows , но я не могу заставить SwiftMailer работать.

Рабочая настройка с использованием функции PHP ()

Вот код PHP, который я использую для успешной отправки почты с помощью функции native 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, насколько мог, и обнаружил, что я не мог видеть вывод из операторов echo после строки if ($ err = stream_get_contents ($ pipes [2])) {"ниже. Если я вырезаю и вставляю «эхо». Хорошо, пока. »И« умрете »; строки после состояния «если», внутри или снаружи фигурных скобок, следующих за «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]; } 

Вещи, которые я уже пробовал

  • Я попытался использовать -bs вместо -t в команде / usr / lib / sendmail, переданной Swift_SendmailTransport :: newInstance (). Я пробовал пропустить параметр (т. Е. Ни -bbs, ни -t).
  • Я попытался передать параметр «from» так же, как и в вызове функции native 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, будут очень благодарны.

Вам нужно использовать правильный транспорт:

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

UPDATE Используйте эту строку:

 $transport = Swift_MailTransport::newInstance(); 

Предполагая, что вы установили поддельный 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= MAIL_FROM_ADDRESS=myemail@example.com MAIL_FROM_NAME="My Name"