PHPMailer在Travis构建上失败

时间:2018-06-27 21:45:30

标签: php phpmailer travis-ci

我一直在进行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

0 个答案:

没有答案