PHPMailer无法发送邮件 - TLS错误?

6
我是一位有用的助手,可以将文本翻译成中文。
我有一个关于使用phpmailer发送电子邮件的问题。
发送邮件的代码如下:
$mail_User      = "site@xxxxxxx.com";
$mail_Password  = "My Password";
$mail_address   = "site@xxxxxxx.com";
$mail_Name      = "MyName";
$mail_Server    = "222.222.222.222";
$mail_Port      = 25;

    function SendHTMLMail($to, $cc, $bcc, $subject, $body)
    {
        global $mail_User, $mail_Password, $mail_address, $mail_Name, $mail_Server, $mail_Port;
        $correo = new PHPMailer;
        $correo->SMTPDebug = 3;                               // Enable verbose debug output
        $correo->SetLanguage("es", "/phpmailer/language/");
        $correo->IsSMTP();

        $correo->IsHTML(true);
        $correo->Host = $mail_Server;
        $correo->Port = $mail_Port;
        $correo->SMTPAuth =true;
        //$correo->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
        $correo->Username = $mail_User;
        $correo->Password = $mail_Password;
        $correo->From      = $mail_address;
        $correo->FromName  = $mail_Name;
        $correo->Subject = $subject;
        $correo->Body    = $body;
        $dest = explode (";", $to);
        for ($n=0; isset($dest[$n]); $n++) $correo->AddAddress($dest[$n]);
        $dest = explode (";", $cc);
        for ($n=0; isset($dest[$n]); $n++) $correo->AddCC($dest[$n]);
        $dest = explode (";", $bcc);
        for ($n=0; isset($dest[$n]); $n++) $correo->AddBCC($dest[$n]);
        if ($correo->Send())
            return "";
        else {
            AddLog("Correo no enviado: $correo->ErrorInfo");
            echo "<br>Correo no enviado: $correo->ErrorInfo<br>";
            return "Correo no enviado: $correo->ErrorInfo";
        }
    }

结果如下:

2016-02-24 04:58:17 Connection: opening to 222.222.222.222:25, timeout=300, options=array (
                                      )
2016-02-24 04:58:17 Connection: opened
2016-02-24 04:58:17 SERVER -> CLIENT: 220-srv1.abcdef.com ESMTP Exim 4.86 #2 Wed, 24 Feb 2016 14:47:17 +0100 
                                      220-We do not authorize the use of this system to transport unsolicited, 
                                      220 and/or bulk e-mail.
2016-02-24 04:58:17 CLIENT -> SERVER: EHLO www.site.com
2016-02-24 04:58:18 SERVER -> CLIENT: 250-srv1.abcdef.com Hello www.doznyk.com [181.181.181.181]
                                      250-SIZE 52428800
                                      250-8BITMIME
                                      250-PIPELINING
                                      250-AUTH PLAIN LOGIN
                                      250-STARTTLS
                                      250 HELP
2016-02-24 04:58:18 CLIENT -> SERVER: STARTTLS
2016-02-24 04:58:18 SERVER -> CLIENT: 220 TLS go ahead
2016-02-24 04:58:18 SMTP Error: Could not connect to SMTP host.
2016-02-24 04:58:18 CLIENT -> SERVER: QUIT
2016-02-24 04:58:19 SERVER -> CLIENT: 221 srv1.abcdef.com closing connection
2016-02-24 04:58:19 Connection: closed
2016-02-24 04:58:19 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

为什么phpmailer不能发送电子邮件?如果代码行是注释,为什么它要尝试使用TLS?我用虚假的敏感数据替换了服务器名称和IP地址。如果我将端口从25更改为587并取消tls行的注释,则结果几乎相同。谢谢。
新测试,相同的结果。
Synchro建议我阅读文档。我将端口从25更改为587并添加了一行$correo->SMTPAutoTLS = true;
$correo->SMTPAuth =true;
$correo->SMTPAutoTLS = true;
//$correo->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$correo->Username = $mail_User;
$correo->Password = $mail_Password;

结果如下:
2016-02-24 06:05:36 Connection: opening to 222.222.222.222:587, timeout=300, options=array (
                                      )
2016-02-24 06:05:37 Connection: opened
2016-02-24 06:05:37 SERVER -> CLIENT: 220-srv1.abcdef.com ESMTP Exim 4.86 #2 Wed, 24 Feb 2016 15:54:37 +0100 
                                      220-We do not authorize the use of this system to transport unsolicited, 
                                      220 and/or bulk e-mail.
2016-02-24 06:05:37 CLIENT -> SERVER: EHLO www.myserver.com
2016-02-24 06:05:38 SERVER -> CLIENT: 250-srv1.abcdef.com Hello www.doznyk.com [181.229.171.247]
                                      250-SIZE 52428800
                                      250-8BITMIME
                                      250-PIPELINING
                                      250-AUTH PLAIN LOGIN
                                      250-STARTTLS
                                      250 HELP
2016-02-24 06:05:38 CLIENT -> SERVER: STARTTLS
2016-02-24 06:05:38 SERVER -> CLIENT: 220 TLS go ahead
2016-02-24 06:05:39 SMTP Error: Could not connect to SMTP host.
2016-02-24 06:05:39 CLIENT -> SERVER: QUIT
2016-02-24 06:05:39 SERVER -> CLIENT: 221 srv1.abcdef.com closing connection
2016-02-24 06:05:39 Connection: closed

你需要阅读它指向的文档。文档会告诉你为什么它在使用TLS(机会主义)以及如何处理它。 - Synchro
您在邮件服务器上使用的是哪种类型的身份验证?这可能会引起问题,因为它期望建立一个安全连接... - Asur
我可以使用TLS或无加密方式。 如果我注释掉"//$correo->SMTPSecure = 'tls';"这一行,安全性就是无加密。 如果我取消注释该行,phpmailer将使用TLS。 - FOP
我在phpmailer中调试代码,发现问题似乎出现在startTLS()函数中的这一行:if (!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT))无论我是否使用TLS,都会返回false。 - FOP
确保您的服务器出站端口已打开 - Taylor Reed
是的,那些端口(25、587)是开放的。 如果它们没有开放,那么“连接已打开”就不会被记录。 谢谢。 - FOP
1个回答

19

嗯,我进行了许多测试,但是没有看到文档中提到Synchro的部分,但是Synchro是正确的。

我添加了下面的代码,现在运行良好!

$correo->SMTPOptions = array(
        'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
); 

虽然我不使用SSL,但我必须澄清,我不使用SSL是因为phpmailer验证SSL是否可用或已正确配置。

谢谢!


尽管未使用SSL,但必须使用这些行正确配置或禁用它。 - FOP
谢谢您,队长,您又挽救了一条生命。 - Aadil P.
非常感谢您 :) - Muhammed
欢迎您。 - FOP
即使使用TLS连接,它也可以正常工作..."ssl" => Array ()...:$mail->Port = 587; $mail->SMTPAutoTLS = true $mail->SMTPSecure = 'tls'; - Constantine Kurbatov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接