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