Я хочу отправить электронные письма с помощью PHP в Windows через внешний SMTP-сервер. Для этой цели я должен использовать SwiftMailer .
Я могу отправлять электронные письма через внешний SMTP-сервер, используя функцию PHP (например, PHP) и Fake Sendmail для Windows , но я не могу заставить SwiftMailer работать.
Вот код 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 , я заменю свой 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]; }
У меня все идеи. Любые полезные предложения, которые кто-либо может предложить о том, как получить работу 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).
процесс тот же, но вы также должны отредактировать свой .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"