#php #phpmailer
#php #phpmailer
Вопрос:
Здравствуйте, я пытаюсь отправлять электронные письма с помощью PHPMailer с помощью метода SMTP, он работал нормально, пока не перестал отправлять электронные письма..
Я попытался отладить, и ошибка, которую я получил, была такой
2021-01-14 14:46:47 Connection: opening to smtp.gmail.com:587, timeout=300, options=array()
2021-01-14 14:46:47 Connection: opened
2021-01-14 14:46:48 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP n16sm10096874wrj.26 - gsmtp
2021-01-14 14:46:48 CLIENT -> SERVER: EHLO localhost
2021-01-14 14:46:48 SERVER -> CLIENT: 550 Transaction failed; HELO/EHLO argument not accepted
2021-01-14 14:46:48 SMTP ERROR: EHLO command failed: 550 Transaction failed; HELO/EHLO argument not accepted
2021-01-14 14:46:48 CLIENT -> SERVER: HELO localhost
2021-01-14 14:46:48 SERVER -> CLIENT: 421 Local Error, closing transmission channel
2021-01-14 14:46:48 SMTP ERROR: HELO command failed: 421 Local Error, closing transmission channel
2021-01-14 14:46:48 CLIENT -> SERVER: STARTTLS
2021-01-14 14:46:48 SERVER -> CLIENT:
2021-01-14 14:46:48 SMTP ERROR: STARTTLS command failed:
SMTP Error: Could not connect to SMTP host.
2021-01-14 14:46:48 SMTP NOTICE: EOF caught while checking if connected
2021-01-14 14:46:48 Connection: closed
SMTP Error: Could not connect to SMTP host.
Из ошибки мне показалось, что аргумент EHLO, отправленный с локального хоста в Gmail, не был принят, но у меня нет способа или идеи исправить это
Вот мой код PHPMailer, если он может помочь.
require(ROOT_PATH . 'phpmailer/src/Exception.php');
require(ROOT_PATH . 'phpmailer/src/PHPMailer.php');
require(ROOT_PATH . 'phpmailer/src/SMTP.php');
// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);
//Server settings
$mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output
$mail->isSMTP();
$mail->SMTPDebug = 3;
$mail->Debugoutput = 'html';
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->SMTPAuth = true;
$mail->Username = "browynlouis2@gmail.com";
$mail->Password = '081';
//Recipients
$mail->setFrom('browynlouis2@gmail.com', 'Sativa');
$mail->addAddress($email); // Name is optional
$mail->addReplyTo('browynlouis2@gmail.com', 'Sativa Merchandise');
// Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Sativa Merch Newsletter';
$mail->AddEmbeddedImage('admin/assets/img/logo.jpg', 'logo');
$mail->Body = '<div style="background:whitesmoke;padding:10px"><div style="background:white;padding:5px;"><div><img src="cid:logo"><h2 style="text-align:center">Sativa Merchandise</h2></div><div style="padding:10px;padding-top:5px; text-align:center"><p style="color:grey;">You are getting the mail because you just recently subscribed to Sativa Merchandise newsletter. You can continue shopping with us below, thanks for your patronage.</p> <br><br><a href="<?php echo BASE_URL; ?>" style="background-color:black; padding:10px; color:white">Continue Shopping</a><br><br></div></div></div>';
$mail->AltBody = 'You are getting the mail because you just recently subscribed to Sativa Merchandise newsletter. You can continue shopping with us below, thanks for your patronage.';
if (!$mail->send()) {
$subscribe = "Unable to Subscribe you to our newsletter.";
} else {
$subscribe = " You have successfully subscribed to our newsletter. Thank You. ";
}
Комментарии:
1. Вы можете попробовать порт 465
2. Соединение фактически открывается, но сразу после этого закрывается, на нем написано «Закрытие соединения из-за ошибки»
Ответ №1:
Он жалуется на это:
2021-01-14 14:46:48 CLIENT -> SERVER: EHLO localhost
localhost
это не внешнее маршрутизируемое имя, поэтому они не могут выполнить поиск по нему, чтобы определить, соответствует ли он IP, с которого поступает SMTP-соединение. PHPMailer пытается автоматически вычислить это имя, но иногда это не удается. В таких случаях вы можете установить его вручную с помощью Hostname
свойства, например:
$mail->Hostname = 'my.host.example.com';
Установите это значение на любое реальное имя хоста вашего сервера. Следующее, что нужно сделать, это убедиться, что ваши DNS-преобразователи работают как вперед, так и назад, поэтому, если вы выполняете поиск по своему имени с помощью:
host my.host.example.com
вы получите обратно IP-адрес, и если вы затем сделаете:
host <ip address>
в итоге вы должны получить имя хоста, с которого начали.
Комментарии:
1. На самом деле это выглядит разумно… Но поскольку я запускаю это на локальном хосте, как мне это сделать…
2.
localhost
это только то, как ваш компьютер относится к самому себе; это бесполезно для кого-либо еще, потому что для нихloalhost
относится к их компьютеру, а не к вашему. У вашего сервера также будет общедоступный IP-адрес и, как правило, имя хоста. Узнайте, какой IP-адрес вашего сервера , и выполните обратный поиск по нему, но я бы предположил, что вы все равно знаете его имя хоста.3. Да, конечно, я знаю, какой у меня IP.. Я попробую это сразу