我一直在进行php7升级,并且也将phpmailer移至通过作曲家进行加载。
我们有一个在Travis上经过测试的构建系统。我们使用grunt进行硒测试。
当我在本地测试(grunt test
时,所有测试都通过了,但是当我(通过GitHub)推送到Travis时,有一些测试失败了。
失败的测试返回以下消息(将SMTPDebug设置为3后在Travis日志中):
2018-06-27 12:39:23连接:打开smtp.sendgrid.net:587,超时= 300,options = array() 2018-06-27 12:43:37连接失败。错误2:stream_socket_client():无法连接至smtp.sendgrid.net:587(连接超时)[/ var / www / includes / phpmailer / phpmailer / src / SMTP.php第325行] 2018-06-27 12:43:37 SMTP错误:无法连接到服务器:连接超时(110) SMTP connect()失败。 https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
奇怪的是,有些通过测试使用与失败测试相同的代码。我们在每个发送邮件的脚本中使用相同的属性实例化包装对象。
这是无法发送邮件的代码中的例外:
$mail->sendMsg($config->getOpt('site_name'),
$config->getOpt('site_email'),
$userInfo['userName'],
$userInfo['userEmail'],
Strings::strPad(_('Purchase confirmation from'),1,' ',STR_PAD_RIGHT) . $config->getOpt('site_name'),
$boostPurchaseConfirmMsg,
nl2br($boostPurchaseConfirmMsg));
这是发送邮件的代码中的例外:
$mail->sendMsg($config->getOpt('site_name'),
$config->getOpt('site_email'),
$_POST['userEmail'],
$_POST['userEmail'],
Strings::strPad(_('Welcome to')) . $config->getOpt('site_name') . '!',
$registerMsg,
nl2br($registerMsg));
这是我们包装对象中实际发送邮件的函数:
public function sendMsg($fromName, $fromEmail, $toName, $toEmail, $subject, $messageText, $messageHTML = null, $CCs = null)
{
$mail = new PHPMailer(true);
if (false === $mail) {
throw new gException('No PHPMailer object available');
}
try {
$mail->isSMTP(); // Set mailer to use SMTP
$mail->SMTPDebug = 3;
$mail->Host = $this->host; // Specify main and backup SMTP servers
$mail->Port = $this->port;
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = $this->username; // SMTP username
$mail->Password = $this->password; // SMTP password
$mail->SMTPSecure = 'tls';
$mail->From = $fromEmail;
$mail->FromName = $fromName;
$mail->addAddress($toEmail, $toName); // Add a recipient
$mail->addReplyTo($fromEmail, $fromName);
if (null !== $CCs) {
if (is_array($CCs)) {
foreach ($CCs AS $cc) {
$mail->addBCC($cc);
}
} else {
$mail->addBCC($CCs);
}
}
$mail->WordWrap = 50;
$mail->isHTML(true);
if (strlen($messageText) < 1) {
$messageText = $messageHTML;
}
if (strlen($messageHTML) < 1) {
$messageHTML = $messageText;
}
$mail->Subject = $subject;
$mail->Body = nl2br($messageHTML);
$mail->AltBody = strip_tags($messageText);
return $mail->send();
} catch (PHPMailerException $e) {
throw new gException('PHPMailer exception message : ' . $e->errorMessage());
}
}
请帮助。我已经尝试过在Travis上设置模拟smtp服务,但这并不重要。我检查了我们是否使用正确的端口。我做了phpmailer Wiki建议的所有操作,尝试进行故障排除。
我重复测试在本地通过,因此一切正常。特拉维斯(Travis)把我当作人质。
这似乎令人误解,事实证明,解决方案是不检查PHPMailer发送邮件是否成功。我们已经达成协议,我们不会通知用户未发送邮件,因为它们只是提供信息,相反,我们将记录异常以进行进一步分析。
不在travis上测试邮件成功,它将失败。 travis不允许出站SMTP通信。
使用PHPMailer故障排除Wiki提出的策略。
谢谢@Syncro