PHPMailer关闭连接

时间:2019-02-26 18:18:03

标签: php email smtp phpmailer

我正在尝试将PHPMailer的电子邮件发送到另一个Ubuntu 16.04 VPS上的Mail-In-A-Box(使用Postfix)托管的SMTP服务器,但是出现错误
邮件vps托管在Digital Ocean上,与网站/ php相同。
这是我运行代码时得到的:

2019-02-26 17:54:01     CLIENT -> SERVER: EHLO mail
2019-02-26 17:54:01     SERVER -> CLIENT: 250-mail.ultracore.it
                                          250-PIPELINING
                                          250-SIZE 134217728
                                          250-VRFY
                                          250-ETRN
                                          250-STARTTLS
                                          250-ENHANCEDSTATUSCODES
                                          250-8BITMIME
                                          250-DSN
                                          250 SMTPUTF8
2019-02-26 17:54:01     CLIENT -> SERVER: STARTTLS
2019-02-26 17:54:01     SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2019-02-26 17:54:01     SMTP Error: Could not connect to SMTP host.
2019-02-26 17:54:01     CLIENT -> SERVER: QUIT
2019-02-26 17:54:01     SERVER -> CLIENT:
2019-02-26 17:54:01     SMTP ERROR: QUIT command failed:
2019-02-26 17:54:01     SMTP Error: Could not connect to SMTP host.

这是我用来发送电子邮件的代码:

function sendEmail($from, $password, $email, $subject, $messageHtml, $message)
    {
        $mail = new PHPMailer(true);
        //$pop = POP3::popBeforeSmtp('pop3.ultracore.it', 110, 1, $from, $password, 2);
        try {
            //Server settings
            $mail->SMTPDebug = 2;                                 // Enable verbose debug output
            $mail->isSMTP();                                      // Set mailer to use SMTP
            $mail->Host = 'smtp.ultracore.it';                    // Specify main and backup SMTP servers
            $mail->SMTPAuth = true;                               // Enable SMTP authentication
            $mail->Username = $from;                              // SMTP username
            $mail->Password = $password;                          // SMTP password
            $mail->SMTPSecure = 'ssl';                            // Enable TLS encryption, `ssl` also accepted
            $mail->Port = 587;                                    // TCP port to connect to

            //Recipients
            $mail->setFrom($from, $from);
            $mail->addAddress($email, 'Joe User');                // Add a recipient
            $mail->addReplyTo('support@ultracore.it', 'Support');

            //Content
            $mail->isHTML(true);                                  // Set email format to HTML
            $mail->Subject = $subject;
            $mail->Body    = $messageHtml;
            $mail->AltBody = $message;

            $mail->send();
            echo 'The message has been sent';
        } catch (Exception $e) {
            echo $mail->ErrorInfo;
        }
    }

这是修改后的PHPMailer的示例。 如您所见,我尝试使用popBeforeSMTP函数,但是我遇到了同样的错误,并且之前还有一个错误:

<pre>Connecting to the POP3 server raised a PHP warning:errno: 2 errstr: fsockopen(): unable to connect to pop3.ultracore.it:110 (Connection refused); errfile: /var/www/html/vendor/phpmailer/phpmailer/src/POP3.php; errline: 238</pre><pre>Connecting to the POP3 server raised a PHP warning:errno: 2 errstr: fsockopen(): unable to connect to pop3.ultracore.it:110 (Connection refused); errfile: /var/www/html/vendor/phpmailer/phpmailer/src/POP3.php; errline: 238Failed to connect to server pop3.ultracore.it on port 110. errno: 111; errstr: Connection refused</pre>

我尝试使用ssl而不是tls,但收到了这个消息:

2019-02-26 18:03:52     SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshootingr`

我知道其他一些用户问过这样的问题,但是我尝试过的所有解决方案都没有对我起作用。

我已通过此行通过作曲家导入了PHPMailer

"require": {
    "phpmailer/phpmailer": "~6.0"
}

更新

我将代码更改为此(仍然来自PHPMailer示例)

function sendEmail($from, $password, $to, $subject, $messageHtml)
    {

        $smtp_settings = array(

            "debug" => 2,
            "host" => "smtp.ultracore.it",
            "port" => 587,
            "auth" => true,
            "encryption" => "tls",
            "reply_address" => "support@ultracore.it",
            "peer_name" => "smtp.ultracore.it",
            "verify_peer" => true,
            "verify_depth" => 3,
            "allow_self_signed" => false,
            "cafile" => "/var/www/html/certificates/ssl_private_key.pem"

        );

        $mail = new PHPMailer;
        //Tell PHPMailer to use SMTP
        $mail->isSMTP();
        //Enable SMTP debugging
        // 0 = off (for production use)
        // 1 = client messages
        // 2 = client and server messages
        $mail->SMTPDebug = $smtp_settings['debug'];
        //Set the hostname of the mail server
        $mail->Host = $smtp_settings['host'];
        //Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
        $mail->Port = $smtp_settings['port'];
        //Set the encryption system to use - ssl (deprecated) or tls
        $mail->SMTPSecure = $smtp_settings['encryption'];
        //Custom connection options
        //Note that these settings are INSECURE
        $mail->SMTPOptions = array(
            'ssl' => [
                'verify_peer' => $smtp_settings['verify_peer'],
                'verify_depth' => $smtp_settings['verify_depth'],
                'allow_self_signed' => $smtp_settings['allow_self_signed'],
                'peer_name' => $smtp_settings['peer_name'],
                'cafile' => $smtp_settings['cafile'],
            ],
        );
        //Whether to use SMTP authentication
        $mail->SMTPAuth = $smtp_settings['auth'];
        //Username to use for SMTP authentication - use full email address for gmail
        $mail->Username = $from;
        //Password to use for SMTP authentication
        $mail->Password = $password;
        //Set who the message is to be sent from
        $mail->setFrom($from, 'First Last');
        //Set who the message is to be sent to
        $mail->addAddress($to, 'John Doe');
        //Set the subject line
        $mail->Subject = $subject;
        //Read an HTML message body from an external file, convert referenced images to embedded,
        //convert HTML into a basic plain-text alternative body
        $mail->msgHTML($messageHtml, __DIR__);
        //Send the message, check for errors
        if (!$mail->send()) {
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message sent!';
        }
    }

但是我有同样的错误

2019-02-26 21:48:23 SERVER -> CLIENT: 220 mail.ultracore.it ESMTP Hi, I'm a Mail-in-a-Box (Ubuntu/Postfix; see https://mailinabox.email/)
2019-02-26 21:48:23 CLIENT -> SERVER: EHLO ultracore.it
2019-02-26 21:48:23 SERVER -> CLIENT: 250-mail.ultracore.it250-PIPELINING250-SIZE 134217728250-VRFY250-ETRN250-STARTTLS250-ENHANCEDSTATUSCODES250-8BITMIME250-DSN250 SMTPUTF8
2019-02-26 21:48:23 CLIENT -> SERVER: STARTTLS
2019-02-26 21:48:23 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
SMTP Error: Could not connect to SMTP host.
2019-02-26 21:48:23 CLIENT -> SERVER: QUIT
2019-02-26 21:48:23 SERVER -> CLIENT: 
2019-02-26 21:48:23 SMTP ERROR: QUIT command failed: 
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

我尝试将cafile切换到所有以下文件: files I tried

我做错了吗?这些文件位于网站的VPS上,我已通过Mail-In-A-Box的管理面板将证书应用于服务器。 我有CloudFlare,但是地址smtp.ultracore.it不受cloudflare的保护,并且所有证书都在邮件VPS的地址上创建,因此ultracore.it的创建地址是mail.ultracore.it,而不是网站的地址一个...

代码

echo (extension_loaded('openssl')?'SSL loaded':'SSL not loaded')."<br>";

返回此

SSL loaded

2 个答案:

答案 0 :(得分:0)

您正在端口587上使用SMTPSecure = 'ssl'(隐式TLS),该端口需要显式TLS(STARTTLS)。所有示例和文档都对此进行了介绍。

STARTTLS失败时,很可能是由于证书无效或CA证书无效,再一次是covered in the troubleshooting guide

不要使用POP-before-SMTP;这是一种非常古老的身份验证机制,不应使用。

答案 1 :(得分:-1)

我将“ verify_peer”设置为false,现在我的代码如下:

    function sendEmail($from, $password, $to, $subject, $messageHtml)
    {

        $smtp_settings = array(

            "debug" => 2,
            "host" => "mail.ultracore.it",
            "port" => 587,
            "auth" => true,
            "encryption" => "tls",
            "reply_address" => "support@ultracore.it",
            "peer_name" => "mail.ultracore.it",
            "verify_peer" => false,
            "verify_depth" => 3,
            "allow_self_signed" => true,
            "cafile" => "/var/www/html/certificates/ssl_certificate.pem"

        );

        $mail = new PHPMailer;
        //Tell PHPMailer to use SMTP
        $mail->isSMTP();
        //Enable SMTP debugging
        // 0 = off (for production use)
        // 1 = client messages
        // 2 = client and server messages
        $mail->SMTPDebug = $smtp_settings['debug'];
        //Set the hostname of the mail server
        $mail->Host = $smtp_settings['host'];
        //Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
        $mail->Port = $smtp_settings['port'];
        //Set the encryption system to use - ssl (deprecated) or tls
        $mail->SMTPSecure = $smtp_settings['encryption'];
        //Custom connection options
        //Note that these settings are INSECURE
        $mail->SMTPOptions = array(
            'ssl' => [
                'verify_peer' => $smtp_settings['verify_peer'],
                'verify_depth' => $smtp_settings['verify_depth'],
                'allow_self_signed' => $smtp_settings['allow_self_signed'],
                'peer_name' => $smtp_settings['peer_name'],
                'cafile' => $smtp_settings['cafile'],
            ],
        );
        //Whether to use SMTP authentication
        $mail->SMTPAuth = $smtp_settings['auth'];
        //Username to use for SMTP authentication - use full email address for gmail
        $mail->Username = $from;
        //Password to use for SMTP authentication
        $mail->Password = $password;
        //Set who the message is to be sent from
        $mail->setFrom($from, 'First Last');
        //Set who the message is to be sent to
        $mail->addAddress($to, 'John Doe');
        //Set the subject line
        $mail->Subject = $subject;
        //Read an HTML message body from an external file, convert referenced images to embedded,
        //convert HTML into a basic plain-text alternative body
        $mail->msgHTML($messageHtml, __DIR__);
        //Send the message, check for errors
        if (!$mail->send()) {
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message sent!';
        }
    }