为什么我的在线联系表格在使用我的主持人的中继发送后会产生警告和致命错误,而不是谷歌的?

时间:2015-12-19 22:07:15

标签: php email smtp swiftmailer

我最近使用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提供的设置。

我到目前为止尝试了以下内容:

  • 更改2525,25,587和465之间的端口但未成功;
  • 在TLS和SSL之间切换但没有成功;
  • 在没有特殊情况下尝试各种组合更改了我的密码 字符没有成功;
  • 尝试在谷歌搜索“Swiftmailer Siteground SMTP等”的所有排列。但没有出现任何事情。
  • 将Swiftmailer更新到最新版本的服务器端但没有成功;

我已经提出了更多的门票,他们已经为我更新了PHP服务器端。现在这不显示错误,只是数字零(即' 0')。此外,还没有发送电子邮件,但现在这是一个单独的问题。

2 个答案:

答案 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);

更多信息:

http://php.net/manual/en/context.ssl.php

https://github.com/swiftmailer/swiftmailer/issues/571

答案 1 :(得分:0)

答案由我的主人提供。他们对PHP服务器端做了一些改动。起初没有成功,但等了一个小时后,这就解决了问题。

好吧,也许不是在理想的意义上排序,但至少作为一种解决方法。