我一直致力于php7升级,并且还通过composer加载了phpmailer .

我们有一个在Travis上测试的构建系统 . 我们使用grunt来运行selenium测试 . 当我在本地测试时( grunt test )所有测试都通过,但是当我推送到Travis(通过GitHub)时,有一些测试失败了 .

失败的测试返回以下消息(在将SMTPDebug设置为3后的Travis日志中):

2018-06-27 12:39:23连接:打开到smtp.sendgrid.net:587,timeout = 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连接()失败 . 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());
    }
}

please help . 我已经尝试过在Travis上设置模拟smtp服务,但这没关系 . 我审查了我们是否使用了正确的端口 . 我做了所有phpmailer wiki建议尝试进行故障排除的事情 .

我重复测试是在本地传递,所以一切正常 . 特拉维斯把我当作人质 .

更新

这可能看起来有误导性,事实证明,解决方案是不检查PHPMailer在发送邮件时是否成功 . 我们达成协议,我们不会告知用户邮件没有发送,因为它们只是提供信息,而是我们将记录异常以进行进一步分析 .

do not test mail success on travis ,它会失败 . travis不允许出站SMTP流量 .

使用PHPMailer故障排除wiki提出的策略 .

谢谢@Syncro