我最近使用Google SMTP中继和Swiftmailer在XAMPP中测试后,在线迁移了一个Web表单。使用我自己的收件箱的谷歌中继绝对没有问题,但是,当尝试切换到我的托管服务提供商(Siteground)推荐的中继和说明,也使用基于域的电子邮件时,我的表格挂在发送,我收到以下内容:
Warning: stream_socket_enable_crypto(): Peer certificate CN=`*.sgcpanel.com' did not match expected CN=`uk2.siteground.eu' in /home/tho/public_html/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php on line 95
Fatal error: Uncaught exception 'Swift_TransportException' with message 'Unable to connect with TLS encryption' in /home/tho/public_html/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php:289 Stack trace: #0 /home/tho/public_html/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(118): Swift_Transport_EsmtpTransport->_doHeloCommand() #1 /home/tho/public_html/swiftmailer/lib/classes/Swift/Mailer.php(79): Swift_Transport_AbstractSmtpTransport->start() #2 /home/tho/public_html/sendmessage.php(30): Swift_Mailer->send(Object(Swift_Message)) #3 {main} thrown in /home/tho/public_html/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php on line 289
请注意,电子邮件帐户本身运作正常。它在Mac Mail中设置,发送和接收完全没有问题。
我的托管服务提供商正在尝试,但我认为他们无法理解我遇到的问题。我最终将其缩小到传输功能。请参阅以下PHP中的代码:
Google(按预期方式运作):
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')
->setUsername('foobar@googlemail.com')
->setPassword('APP GENERATED PASSWORD');
托管服务提供商(无法按预期工作):
$transport = Swift_SmtpTransport::newInstance('uk2.siteground.eu', 25, 'tls')
->setUsername('email@mydomain.com')
->setPassword('MY EMAIL PASSWORD');
代码对我来说似乎没问题,因为它只是交换了细节。这些是Siteground提供的设置。
我到目前为止尝试了以下内容:
我已经提出了更多的门票,他们已经为我更新了PHP服务器端。现在这不显示错误,只是数字零(即' 0')。此外,还没有发送电子邮件,但现在这是一个单独的问题。
答案 0 :(得分:1)
从错误消息中,服务器uk2.siteground.eu上的SSL证书似乎不包含服务器的正确主机名,而是sgcpanel.com的通配符。 587上的证书不包含uk2.siteground.eu作为服务器的有效名称。
如果您使用的是php 5.6,他们更改了默认设置以验证证书的对等和对等名称。
正确的修复方法是Siteground将正确的证书添加到服务器。您可能会在github上覆盖最新版本的SwiftMailer的检查。
9月份添加的setStreamOptions可能会解决您的问题,但是通过不检查它是否是正在与之通信的正确服务器来降低安全性。
我目前无法测试,但请尝试:
$ssl_options = array(
'ssl' => array(
'verify_peer' => false,
'verfify_peer_name' => false,
),
);
$transport->setStreamOptions($ssl_options);
或者数组可能是
$ssl_options = array(
'verify_peer' => false,
'verfify_peer_name' => false,
);
$transport->setStreamOptions($ssl_options);
更多信息:
答案 1 :(得分:0)
答案由我的主人提供。他们对PHP服务器端做了一些改动。起初没有成功,但等了一个小时后,这就解决了问题。
好吧,也许不是在理想的意义上排序,但至少作为一种解决方法。