PHPMailer закрывает соединение - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь отправить электронное письмо с PHPMailer на мой SMTP-сервер, на котором установлен Mail-In-A-Box (использующий Postfix) на другом Ubuntu 16.04 VPS, но у меня ошибка
Почта vpsразмещен на Digital Ocean, то же самое для веб-сайта / php one
Это то, что я получаю, когда запускаю код:

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, но у меня была та же ошибка и еще одна до нее:

<code><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
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

Я пытался использовать 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

Я пытался переключить кафе на все эти файлы: файлы, которые я пробовал

Я делаю это неправильно?Файлы находятся на VPS веб-сайта, я применил сертификаты к серверу через админ-панель Mail-In-A-Box.У меня есть CloudFlare, но адрес smtp.ultracore.it не находится под защитой cloudflare, и все сертификаты создаются по адресу Mail VPS, поэтому ultracore.it создается по адресу mail.ultracore.it, а не по адресу сайта.один ...

Код

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

возвращает это

SSL loaded

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я исправил установку «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!';
        }
    }
0 голосов
/ 26 февраля 2019

Вы используете SMTPSecure = 'ssl' (неявный TLS) на порту 587, который ожидает явный TLS (STARTTLS).Это описано во всех примерах и документах.

Когда STARTTLS терпит неудачу, это, скорее всего, связано с недействительным сертификатом или недействительным сертификатом CA, и опять же, это , описанное в руководстве по устранению неполадок .

Не использовать POP-before-SMTP;это действительно древний механизм аутентификации, и его не следует использовать.

...