Ife*_*kwo 1 email gmail localhost phpmailer swiftmailer
我最近无法通过本地主机上的php发送邮件.我使用PHPMailer
和SwiftMailer
应用程序的不同部分.
随SwiftMailer
我得到这个:
Connection could not be established with host smtp.gmail.com [ #0]
Run Code Online (Sandbox Code Playgroud)
有了PHPMailer
,消息是:
SMTP Error: Could not connect to SMTP host.
Run Code Online (Sandbox Code Playgroud)
我在SwiftMailer上的设置如下所示:
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername(APP_GMAIL_EMAIL)
->setPassword(APP_GMAIL_PWD);
Run Code Online (Sandbox Code Playgroud)
我已经在SO和其他地方经历了几个线程,并尝试了许多"修复",但错误消息保持不变.我尝试过的一些"解决方案"是:
php.ini
(以前关闭)smtp.gmail.com
到smtp.googlemail.com
smtp.gmail.com
为某些Gmail邮箱IP地址smtp.gmail.com
为gethostbyname('smtp.gmail.com')
->setSourceIp('0.0.0.0')
到上面的实例化代码,之后setUsername
和setPassword
这段代码以前工作,我不知道什么可能破坏了这个功能.作为故障排除的一部分,我刚刚确认Linux共享主机上的类似代码是令人满意的电子邮件,这表明问题是以某种方式来自我的环境.因此,我甚至尝试了不同的互联网访问来源,以防它是ISP的事情.
我怎么能破解这个坚果?
我已经能够克服这个问题,至少是SwiftMailer
.我的PHP从5.2.5升级到5.6之后必须出现解决方案,这是我目前的版本.洞察力来自这个页面:
https://github.com/swiftmailer/swiftmailer/issues/544
如果您使用的是PHP 5.6,则会出现错误,因为swiftmailer中的流上下文使用了"SSL上下文选项".在PHP 5.6中,verify_peer和verify_peer_name默认设置为TRUE,因此PHP会检查SSL证书.目前无法使用某些选项在swiftmailer中禁用它.
您可以通过修改StreamBuffer.php中的函数"_establishSocketConnection"来禁用SSL检查.在stream_socket_client命令之前添加这些行:
$options['ssl']['verify_peer'] = FALSE;
$options['ssl']['verify_peer_name'] = FALSE;
Run Code Online (Sandbox Code Playgroud)
如果可以在不破解代码的情况下设置这些选项,那就太棒了.
感谢/sf/answers/2061411481/,他首先指出了我的帖子.
顺便说一下,路径StreamBuffer.php
是:
\lib\classes\Swift\Transport
Run Code Online (Sandbox Code Playgroud)
但是有一点警告:这个解决方案是基于攻击类中的代码,并且可能会在升级SwiftMailer
版本之后失败(在这种情况下,您需要返回并再次破解代码).
也许,更新的版本SwiftMailer
已经将它们的行为放在PHP 5.6中(我目前使用的是SwiftMailer 5.1).我打算尽快尝试升级,希望对此问题有一个优雅的解决方案.