Не вдається надіслати електронну пошту за допомогою SMTP-сервера Gmail через PHPMailer, з’являється помилка: SMTP AUTH потрібен для надсилання повідомлень через порт 587. Як це виправити?


77

Я хотів би надіслати електронне повідомлення за допомогою SMTP- сервера Gmail через PHP Mailer .

це мій код

<?php
require_once('class.phpmailer.php');

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->CharSet="UTF-8";
$mail->SMTPSecure = 'tls';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->Username = 'MyUsername@gmail.com';
$mail->Password = 'valid password';
$mail->SMTPAuth = true;

$mail->From = 'MyUsername@gmail.com';
$mail->FromName = 'Mohammad Masoudian';
$mail->AddAddress('anotherValidGmail@gmail.com');
$mail->AddReplyTo('phoenixd110@gmail.com', 'Information');

$mail->IsHTML(true);
$mail->Subject    = "PHPMailer Test Subject via Sendmail, basic";
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
$mail->Body    = "Hello";

if(!$mail->Send())
{
  echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
  echo "Message sent!";
}
?>

але я отримую таку помилку

Mailer Error: SMTP Error: The following recipients failed: anotherValidGmail@gmail.com

SMTP server error: SMTP AUTH is required for message submission on port 587

мій домен vatandesign.ir


Можливо, ви захочете поглянути на відповідь Джорджа в цій темі: stackoverflow.com/questions/5759419/…
Людина Ваннабе

Відповіді:


143
$mail = new PHPMailer(); // create a new object
$mail->IsSMTP(); // enable SMTP
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail
$mail->Host = "smtp.gmail.com";
$mail->Port = 465; // or 587
$mail->IsHTML(true);
$mail->Username = "email@gmail.com";
$mail->Password = "password";
$mail->SetFrom("example@gmail.com");
$mail->Subject = "Test";
$mail->Body = "hello";
$mail->AddAddress("email@gmail.com");

 if(!$mail->Send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
 } else {
    echo "Message has been sent";
 }

Цей код вище перевірений і працював для мене.

Може бути, що вам потрібно $mail->SMTPSecure = 'ssl';

Також переконайтеся, що у вас не ввімкнено двоетапну перевірку для цього облікового запису, оскільки це також може спричинити проблеми.

ОНОВЛЕНО

Ви можете спробувати змінити $ mail-> SMTP на:

$mail->SMTPSecure = 'tls';

Варто зазначити, що деякі SMTP-сервери блокують з'єднання. Деякі сервери SMTP не підтримують SSL(або TLS) з'єднання.


Я отримую цю помилку , коли я використовую свій код Mailer Error: Наступна адреса відправника не вдався: phoenixd110@gmail.com: Called пошти () без підключення
Mohammad Masoudian

3
Оновлена ​​відповідь із подальшою пропозицією. Код однозначно добре. Ви можете перевірити ці два джерела phpmailer.worxware.com/index.php?pg=exampleagmail та github.com/Synchro/PHPMailer/blob/master/examples/…
andrew-caulfield

я отримую помилку як: КЛІЄНТ -> SMTP: EHLO localhost SMTP -> ПОМИЛКА: EHLO не приймається від сервера: КЛІЄНТ -> SMTP: HELO localhost Примітка: fwrite (): не вдалося надіслати 16 байт з errno = 10054 Існуюче з'єднання був примусово закритий віддаленим хостом. в C: \ xampp \ htdocs \ program \ mailsending1 \ mailsending_v1 \ PHPMailer-master \ class.smtp.php у рядку 1023 SMTP -> ПОМИЛКА: HELO не приймається від сервера: SMTP -> ПРИМІТКА: EOF виявлено під час перевірки підключення SMTP Connect ( ) не вдалося. Помилка пошти: Помилка підключення SMTP ().
Анураг Сінгх

2
Зверніть увагу, що якщо ви вкажете "ssl" (що гаряче рекомендується), для вашої інсталяції PHP потрібно завантажити (або скомпілювати) розширення "openssl", використовуючи ваш улюблений механізм розширення PHP (я випадково використовую OS X Macports, для якого це sudo port install php5-openssl)
xgretsch

Краще перевірити як значення, що повертається, так і помилки, якщо (! $ Mail-> Send () || $ mail-> ErrorInfo) {
ymakux

32

Тож я просто вирішив власну помилку "Помилка з’єднання SMTP" і хотів опублікувати рішення на випадок, якщо воно допоможе комусь іншому.

Я використав ТОЧНИЙ код, наведений у прикладі файлу gmail.phps PHPMailer. Це працювало просто, поки я використовував MAMP, а потім я отримав помилку підключення SMTP, коли переніс її на свій персональний сервер.

Усі відповіді на переповнення стеку, які я прочитав, і вся документація з усунення несправностей від PHPMailer говорила, що це не проблема з PHPMailer. Це була проблема з налаштуваннями на стороні сервера. Я спробував різні порти (587, 465, 25), я спробував шифрувати 'SSL' і 'TLS'. Я перевірив, чи увімкнено openssl у моєму файлі php.ini. Я перевірив, що проблем із брандмауером не було. Все перевірили, і все ще нічого.

Рішення було в тому, що мені довелося видалити цей рядок:

$mail->isSMTP();

Зараз все це працює. Не знаю чому, але це працює. Решта мого коду копіюється та вставляється з файлу прикладу PHPMailer.


7
Це рішення працює, оскільки воно взагалі вимикає SMTP. Я НЕ рекомендую цей метод. Я ніколи не вирішував цю проблему, тепер я переходжу до використання Mandrill API.
Еван Батлер

Просто використовуйте Mandrill, це набагато краще і насправді має певну аналітику.
Еван Батлер,

Вирішив мою проблему. Дуже дякую.
Крістіан Оана,

Це спрацювало і у мене. Дивно, ця
бібліотека

1
ПОГРОЗЕ рішення, ви використовуєте не такий smtp, а голу функцію php mail (), яка, ймовірно, надсилатиме електронну пошту як сміття для деяких одержувачів
Нассім

8

Також варто зазначити, що якщо у вас увімкнено двофакторну автентифікацію, вам потрібно буде встановити спеціальний пароль програми, який використовуватиметься замість пароля вашого облікового запису електронної пошти.

Ви можете створити спеціальний пароль для програми, дотримуючись цих інструкцій: https://support.google.com/accounts/answer/185833

Потім встановіть $mail->Passwordдля програми певний пароль.


5

Здається, ваш сервер не може встановити з'єднання з SMTP-сервером Gmail. Ось декілька підказок для усунення цього: 1) перевірте, чи правильно налаштовано SSL на вашому PHP (модуль, який обробляє його, не встановлений за замовчуванням на PHP. Вам потрібно перевірити вашу конфігурацію в phph.ini). 2) перевірте, чи дозволить ваш брандмауер вихідні дзвінки на необхідний порт (тут 465 або 587). Для цього використовуйте telnet. Якщо порт не відкрито, вам знадобиться певна підтримка sysdmin для налаштування конфігурації. Сподіваюся, ви швидко це розберете!


4

Відкрийте це посилання та виберіть, дотримуючись інструкцій, сервери Google блокують будь-які спроби з невідомих серверів, так що після натискання кнопки "captcha" кожна річ буде в порядку


1
Я використовував той самий код, що й у прийнятій відповіді, але все одно отримував помилки SMTP_connect (). Я спробував все за цим посиланням, і в підсумку це спрацювало, тому +1.
Іван

1
У мене також були проблеми з помилками SMTP_connect (). Я виконав ці кроки і все ще отримував помилку. Я виконував кроки двічі за двома різними адресами gmail, і обидва рази здається, що мені потрібно було почекати ~ 1 годину, перш ніж зміни, здавалося б, почали діяти. Згодом все запрацювало, як очікувалося.
cwal

Відвідування google.com/accounts/DisplayUnlockCaptcha, а потім запуск мого коду - це те, що змусило мене працювати. +1
Білл Броуер,

Вирішив моє питання.
Nikhil Pawar

1

Google по-різному ставиться до облікових записів Gmail залежно від доступної інформації про користувачів, ймовірно, щоб приборкати спамерів.

Я не міг використовувати SMTP, поки не здійснив перевірку телефону. Зробив ще один акаунт для повторної перевірки, і я зміг його підтвердити.


1

цей код добре працює для мене

    $mail = new PHPMailer;
    //Enable SMTP debugging. 
    $mail->SMTPDebug = 0;
    //Set PHPMailer to use SMTP.
    $mail->isSMTP();
    //Set SMTP host name                          
    $mail->Host = $hostname;
    //Set this to true if SMTP host requires authentication to send email
    $mail->SMTPAuth = true;
    //Provide username and password     
    $mail->Username = $sender;
    $mail->Password = $mail_password;
    //If SMTP requires TLS encryption then set it
    $mail->SMTPSecure = "ssl";
    //Set TCP port to connect to 
    $mail->Port = 465;
    $mail->From = $sender;  
    $mail->FromName = $sender_name;
    $mail->addAddress($to);
    $mail->isHTML(true);
    $mail->Subject = $Subject;
    $mail->Body = $Body;
    $mail->AltBody = "This is the plain text version of the email content";
    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    }
    else {
           echo 'Mail Sent Successfully';
    }

$ mail-> SMTPSecure = 'ssl'; $ пошта-> Порт = 465; Я щойно змінив TSL на ssl і 587 на 465, то це спрацювало для мене, дякую вам .. GMAIL, щоб дозволити менш безпечні програми: myaccount.google.com/lesssecureapps
Рао,

0
 $mail->SMTPOptions = array(
                'ssl' => array(
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                    'allow_self_signed' => true
                )
            );

1
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду.
Athul

Це просто небезпечно. Не роби цього.
Synchro

0

Якщо ви використовуєте cPanel, просто клацніть вікно, що дозволяє відправляти на зовнішні сервери за допомогою SMTP.

Увійдіть до CPanel> Налаштування налаштувань> Усі> "Обмежити вихідний SMTP для root, exim та mailman (FKA SMTP Tweak)"

Як тут відповіли:

"Пароль не прийнятий від сервера: 535 Неправильні дані автентифікації" під час надсилання за допомогою GMail та phpMailer


0

Андерск правильно зрозумів. Дякую. Це спрацювало у мене, але не на 100%.

Довелося встановлювати

$mail->SMTPDebug = 0;

Якщо встановити значення 1, це може спричинити помилки, особливо якщо ви передаєте деякі дані як json на наступну сторінку. Приклад - Виконання перевірки надсилання пошти за допомогою json для передачі даних через ajax.

Мені довелося знизити налаштування безпеки свого облікового запису Gmail, щоб позбутися помилок: "Помилка підключення SMTP ()" та "ПОМИЛКА SMTP: Помилка команди пароля"

Рішення: Цю проблему можуть спричинити або „менш безпечні” програми, які намагаються використовувати обліковий запис електронної пошти (це згідно з довідкою google, не впевнений, як вони судять, що безпечно, а що ні) АБО якщо ви намагаєтеся ввійти кілька разів поспіль АБО якщо ви міняєте країну (наприклад, використовуєте VPN, переносите код на інший сервер або насправді намагаєтесь увійти з іншої частини світу).

Посилання, що вирішують проблему (ви повинні увійти в обліковий запис google):

  • переглянути останні спроби використання облікового запису та прийняти підозрілий доступ.

  • посилання для вимкнення функції блокування підозрілих програм / технологій:

    https://www.google.com/settings/u/1/security/lesssecureapps

Примітка: Ви можете перейти за таким посиланням на відповідь stackoverflow для отримання більш детальної інформації.

https://stackoverflow.com/a/25175234


0

привіт усім просто хотів поділитися своїм досвідом з phpMailer, який працював локально (XAMPP), але не працював на моєму хостинг-провайдері.

Я увімкнув повідомлення про помилки phpMailer

 $mail->SMTPDebug=2

я отримав "Помилка відмови у підключенні"

Я надіслав електронну пошту своєму хост-провайдеру щодо проблеми, і він сказав, що відкриє SMTP-ПОРТИ, і він відкрив порти 25 465 587.

Тоді я отримав таку відповідь на помилку "ПОМИЛКА SMTP: Помилка команди пароля:" .... "Будь ласка, увійдіть через веб-браузер, а потім повторіть спробу" .... "Помилка SMTP: не вдається автентифікуватись.

Отже, Google перевіряє, чи ввійшли ви у свій обліковий запис (я був, коли запускав скрипт локально через браузер), а потім дозволяє надсилати пошту через скрипт phpMailer.

Щоб виправити це 1: перейдіть до свого облікового запису Google -> безпека 2: Прокрутіть до піктограми ключа та виберіть «Двостороння перевірка» та виконайте процедуру 3: По завершенні поверніться до піктограми ключа з облікового запису Google -> безпека та виберіть другий варіант "створити паролі додатків" і виконайте процедуру отримання пароля.

Тепер перейдіть до об’єкта phpMailer і змініть пароль Google із паролем, наведеним у вищевказаній процедурі

ви закінчили.

Код

require_once('class.phpmailer.php');

$phpMailerObj= new PHPMailer();

                $phpMailerObj->isSMTP();                    
                $phpMailerObj->SMTPDebug = 0;
                $phpMailerObj->Debugoutput = 'html';                    
                $phpMailerObj->Host = 'smtp.gmail.com';                     
                $phpMailerObj->Port = 587;
                $phpMailerObj->SMTPSecure = 'tls';
                $phpMailerObj->SMTPAuth = true;                 
                $phpMailerObj->Username = "YOUR EMAIL";                 
                $phpMailerObj->Password = "THE NEW PASSWORD FROM GOOGLE ";
                $phpMailerObj->setFrom('YOUR EMAIL ADDRESS', 'THE NAME OF THE SENDER',0);
                $phpMailerObj->addAddress('RECEIVER EMAIL ADDRESS', 'RECEIVER NAME');

                $phpMailerObj->Subject = 'SUBJECT';
                $phpMailerObj->Body ='MESSAGE';

                if (!phpMailerObj->send()) {
                    echo "phpMailerObjer Error: " . $phpMailerObj->ErrorInfo;
                    return 0;
                } else {
                    echo "Message sent!";
                    return 1;
                } 

-2

Я думаю, що це проблема підключення, ви можете отримати код тут http://skillrow.com/sending-mail-using-smtp-and-php/

include(“smtpfile.php“);
include(“saslfile.php“); // for SASL authentication $from=”my@website.com“; //from mail id

$smtp=new smtp_class;

$smtp->host_name=”www.abc.com“; // name of host
$smtp->host_port=25;//port of host

$smtp->timeout=10;
$smtp->data_timeout=0;
$smtp->debug=1;
$smtp->html_debug=1;
$smtp->pop3_auth_host=””;
$smtp->ssl=0;
$smtp->start_tls=0;
$smtp->localhost=”localhost“;
$smtp->direct_delivery=0;

$smtp->user=”smtp username”;
$smtp->realm=””;
$smtp->password=”smtp password“;

$smtp->workstation=””;
$smtp->authentication_mechanism=””;

$mail=$smtp->SendMessage($from,array($to),array(“From:$from”,”To: $to”,”Subject: $subject”,”Date: ”.strftime(“%a, %d %b %Y %H:%M:%S %Z”)),”$message”);

if($mail){
   echo “Mail sent“;
}else{
   echo $smtp->error;
}

Відповіді лише на посилання зазвичай не рекомендуються. Чи не могли б ви це розширити як щось самостійне?
Вернер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.