我希望通过外部SMTP服务器在Windows上使用PHP发送电子邮件。 我必须为此使用SwiftMailer 。
我可以使用PHP的本地mail()函数和假Sendmail for Windows通过外部SMTP服务器发送电子邮件,但是我无法使SwiftMailer工作。
这里是我使用本地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"
假Sendmail for Windows有自己的sendmail.ini文件,我在其中指定了我的smtp_server,smtp_port,auth_username和auth_password。
当我通过在Web浏览器中加载一个页面来运行PHP代码时,输出表明mail()函数返回true,并且电子邮件按照预期到达其预期的目的地。
试图用SwiftMailer实现相同的结果,我用上面的SwiftMailer文档中的指示replace上面的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]; }
我完全没有想法。 任何人可以提供有关如何获得SwiftMailer代码工作的任何有用的build议将不胜感激。
你需要使用正确的运输:
$transport = Swift_SendmailTransport::newInstance('C:\usr\lib\sendmail.exe');
更新使用这一行:
$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
然后使用像这样的swiftmailer SMTP传输:
$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"