#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)
? Если я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.