如何在Windows上使用SwiftMailer伪造sendmail?

我希望通过外部SMTP服务器在Windows上使用PHP发送电子邮件。 我必须为此使用SwiftMailer 。

我可以使用PHP的本地mail()函数和假Sendmail for Windows通过外部SMTP服务器发送电子邮件,但是我无法使SwiftMailer工作。

使用PHP的mail()函数工作安装

这里是我使用本地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实现相同的结果,我用上面的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]; } 

我已经试过了

  • 我已经尝试在传递给Swift_SendmailTransport :: newInstance()的/ usr / lib / sendmail命令中使用-bs而不是-t。 我曾尝试传递任何参数(即。既不-bs也不-t)也。
  • 我已经尝试传递'from'参数,就像我在上面调用PHP的本地mail()函数一样。 当我这样做时,SwiftMailer抱怨说,我的'从'地址'不符合RFC 2822'。
  • 我试过(感谢Michael Sivolobov的build议),用'C:\ usr \ lib \ sendmail -t'replace'/ usr / lib / sendmail -t',用'C:/ usr / lib / sendmail -t' ”。 在这两种情况下,页面只是永远加载。
  • 我试过传递没有参数的Swift_SendmailTransport :: newInstance()函数,希望Swift能从我的php.ini文件中找出我的sendmail.exe的path。 这样做导致以下错误“未捕获的exception'Swift_TransportException'消息'进程无法启动[系统找不到指定的path。]”从上面转载的代码部分抛出exception。 传递'-t'和'-bs'的效果相同。

我完全没有想法。 任何人可以提供有关如何获得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)可执行文件。

对于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"