PHPMailer не отправляет электронные письма с локального хоста, используя SMTP gmail

#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.. Я попробую это сразу