我无法使用gmail从Localhost使用SwiftMailer或PHPMailer发送邮件

Ife*_*kwo 1 email gmail localhost phpmailer swiftmailer

我最近无法通过本地主机上的php发送邮件.我使用PHPMailerSwiftMailer应用程序的不同部分.

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和其他地方经历了几个线程,并尝试了许多"修复",但错误消息保持不变.我尝试过的一些"解决方案"是:

  1. 启用OpenSSL php.ini(以前关闭)
  2. 更改smtp.gmail.comsmtp.googlemail.com
  3. 替换smtp.gmail.com为某些Gmail邮箱IP地址
  4. 替换smtp.gmail.comgethostbyname('smtp.gmail.com')
  5. 添加->setSourceIp('0.0.0.0')到上面的实例化代码,之后setUsernamesetPassword

这段代码以前工作,我不知道什么可能破坏了这个功能.作为故障排除的一部分,我刚刚确认Linux共享主机上的类似代码是令人满意的电子邮件,这表明问题是以某种方式来自我的环境.因此,我甚至尝试了不同的互联网访问来源,以防它是ISP的事情.

我怎么能破解这个坚果?

Ife*_*kwo 5

我已经能够克服这个问题,至少是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).我打算尽快尝试升级,希望对此问题有一个优雅的解决方案.