Ошибка «SMTP connect ()» настаивала, даже если я использовал TLS, включил SMTPAuth и SMTPAutoTLS, а также оба порта 25 и 465. Я использую HotsGator

#php #email #ssl #smtp #phpmailer

#php #Адрес электронной почты #ssl #smtp #phpmailer

Вопрос:

Раньше это работало раньше, до сегодняшнего дня, когда клиент связался со мной, что все еще существует ошибка сбоя SMTP.

Я исследовал ошибки, используя SMTPDebug как с 1, так и с 2, и прочитал Вики по устранению неполадок PHPMailer, но это не помогло:

 2020-11-24 00:20:42 SMTP ERROR: Failed to connect to server: (0) 2020-11-24 00:20:42 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
 

Это хорошо известно при переполнении стека. Я перепробовал много способов, следуя ответам на несколько вопросов, связанных с этим.

После переключения на TLS on [NameOfPage]Controller.php ошибка отличается:

 2020-11-24 00:17:14 SERVER -> CLIENT: 2020-11-24 00:17:14 CLIENT -> SERVER: EHLO localhost 2020-11-24 00:17:15 SERVER -> CLIENT: 2020-11-24 00:17:15 SMTP ERROR: EHLO command failed: 2020-11-24 00:17:15 SMTP NOTICE: EOF caught while checking if connected 2020-11-24 00:17:15 SMTP Error: Could not connect to SMTP host. 2020-11-24 00:17:15 SMTP Error: Could not connect to SMTP host. SMTP Error: Could not connect to SMTP host.
 
  • Я использую HostGator;
  • Это MVC PHPMailer в среде;
  • PHPMailer устанавливается через Composer;

Все тесты, которые я выполнил для обоих файлов Mail.php и MailController.php (также OrcamentoController.php ):

  • Я попытался включить и отключить SMTPAuth и SMTPAutoTLS , используя TLS и порт 25;
  • Я попытался включить и отключить SMTPAuth и SMTPAutoTLS , используя TLS и порт 465;
  • Я попытался включить и отключить SMTPAuth и SMTPAutoTLS , используя SSL и порт 25;
  • Я попытался включить и отключить SMTPAuth и SMTPAutoTLS , используя SSL и порт 465;
  • Я обновил Composer и его пакеты и попробовал все эти тесты выше и те же ошибки;
  • Я переключился с почтового хоста на mail.thproducoes.com br726.hostgator.com.br , как предложил HostGator, выполнил все описанные выше тесты и те же ошибки.

Я покажу только три файла.

Полный Mail.php файл:

 <?php
namespace AppHelpers;

use PHPMailerPHPMailerPHPMailer;
use AppContractsIMail;
use PHPMailerPHPMailerSMTP;
use Exception;
use stdClass;

class Mail
{
    private PHPMailer $mail;
    private stdClass $data;
    private Exception $error;

    public function __construct(string $lang = "br")
    {
        $this->mail = new PHPMailer(true);
        $this->data = new stdClass();

        $this->mail->isSMTP();
        $this->mail->SMTPAuth = true;
        $this->mail->SMTPAutoTLS = true;
        $this->mail->SMTPSecure = "tls";
        $this->mail->Host = $_ENV['MAIL_HOST'];
        $this->mail->Port = $_ENV['MAIL_PORT'];
        $this->mail->Username = $_ENV['MAIL_USER'];
        $this->mail->Password = $_ENV['MAIL_PASSWORD'];
        
        
        $this->mail->isHTML(true);
        $this->mail->CharSet = "utf-8";
        $this->mail->setLanguage($lang);
        
        $this->mail->SMTPDebug = 2;
    }

    public function setCredentials($username, $password): self
    {
        $this->mail->Username = $username;
        $this->mail->Password = $password;

        return $this;
    }

    public function setSMTPSecure(string $secure): self
    {
        $this->data->SMTPSecure = $secure;
        return $this;
    }

    public function add(
        string $subject,
        string $body,
        string $recipientName,
        string $recipientEmail
    ): self 
    {
        $this->data->subject = $subject;
        $this->data->body = $body;
        $this->data->recipientName = $recipientName;
        $this->data->recipientEmail = $recipientEmail;

        return $this;
    }

    public function attach(string $path, string $filename): self
    {
        $this->data->attach[$path] = $filename;
        return $this;
    }

    public function send(string $fromName = "", string $fromEmail = ""): bool
    {
        $fromName = $fromName !== "" ? $fromName : $_ENV['MAIL_FROM_NAME'];
        $fromEmail = $fromEmail !== "" ? $fromEmail : $_ENV['MAIL_FROM_EMAIL'];

        try 
        {
            $this->mail->SMTPSecure = $this->data->SMTPSecure;
            $this->mail->Subject = $this->data->subject;
            $this->mail->msgHTML($this->data->body);
            $this->mail->addAddress($this->data->recipientEmail,$this->data->recipientName);

            $this->mail->setFrom($fromEmail, $fromName);

            if (!empty($this->data->attach)) 
            {
                foreach ($this->data->attach as $path => $name) 
                {
                    $this->mail->addAttachment($path, $name);
                }
            }

            $this->mail->send();
            return true;
        } 
        
        catch (Exception $exception) 
        {
            $this->error = $exception;
            return false;
        }
    }

    public function getError(): ?Exception
    {
        return $this->error;
    }
}
 

Файл .env :

 MAIL_HOST="mail.thproducoes.com"
MAIL_PORT=465
MAIL_USER="sac@thproducoes.com"
MAIL_PASSWORD="secret"
MAIL_FROM_NAME="Thiago Silva"
MAIL_FROM_EMAIL="sac@thproducoes.com"
 

Полный [NameOfPage]Controller.php :

 <?php

namespace AppControllers;

use AppHelpersMail;
use CoreController;

class MailController extends Controller
{
    public function index()
    {
        return view("contacto.php", 
        [
            "lang" => "pt-br",
            "name" => "Thiago Silva",
        ]);
    }

    public function send()
    {
        $mail = new Mail("en");

        $orcamento = "orcamento@thproducoes.com";
        $sac = "sac@thproducoes.com";

        $nome = $_POST['nome'];
        $email = $_POST['email'];
        $telefone = $_POST['telefone'];
        $mensagem = $_POST['mensagem'];

        $isMailSent = $mail
            ->setSMTPSecure("tls")
            ->add("...", $sac)
            ->send($nome, $email);

        if (!$isMailSent) 
        {
            echo $mail->getError()->getMessage();
            return;
        }

        echo "...";
    }
}
 

Я подозреваю, что HostGator не поддерживает его, как я только что прочитал https://github.com/PHPMailer/PHPMailer/issues/1327 .

Стоит ли переходить с HostGator на Hostinger, который предлагает дешевый выделенный сервер Linux, поддерживающий Composer?

Комментарии:

1. Электронная почта не работает по миллиону и одной причине, и добавьте туда TLS, и у вас будет еще миллион. Во-первых, вы должны только предположить, что у вас есть возможность отправлять электронную почту с учетной записи, которую явно предоставил ИТ-специалист. Если вы не можете войти в систему, у вас нет разрешения. Иногда это основано на IP, с заблокированными плохими IP-адресами. Во-вторых, если задействован TLS, знайте, что сертификат HTTP не совпадает с сертификатом SMTP, поэтому вам нужно отладить это. Как только вы сможете подключиться, тот, от кого вы отправляете, может вызвать сбой, если это невозможно из-за списков блокировок, SPF, DKIM и т. Д.

2. Это выглядит как простая блокировка SMTP вашим хостинг-провайдером. Что произошло, когда вы попробовали тесты командной строки telnet и openssl, описанные в руководстве по устранению неполадок? Все хосты могут поддерживать composer; если вы не можете запустить его на сервере, вы всегда можете запустить его локально и загрузить все файлы, которые он генерирует, вместе с другими вашими скриптами, но помимо этого, я бы рекомендовал уточнить у вашего хоста, какова их политика в отношении электронной почты, требуют ли они от вас использованияих серверы и могут ли они снять блокировку.

3. @ChrisHaas, ты это имеешь в виду ->send($email) ? Если я $email заменю собственным e-mail?

4. @Synchro, я только что протестировал порт 465 и хост br726.hostgator.com.br : Trying 108.179.193.150... Connected to br726.hostgator.com.br. Escape character is '^]'. кажется, все в порядке.

5. Хорошо, это хороший результат с telnet, но вам нужно будет использовать openssl, чтобы увидеть, что он говорит на порту 465.