AWS SES с PHPMailer, использующим SMTP, ошибка SMTP: не удалось пройти проверку подлинности?
Я получаю следующую ошибку: Недействительные учетные данные аутентификации.
Я дважды проверил имя пользователя (идентификатор ключа доступа) и пароль (секретный токен) миллион раз. Я дважды проверил отправленный на сервер base64, и это правильно. Пользователь имеет правильные права доступа. Весь исходящий трафик с сервера EC2 разрешен. SELinux отключен. Я избежал специальных символов, пробовал разные учетные данные. Пробовал использовать пользователя с большим доступом.
Я использую PHPMailer с AWS SES.
Вот код:
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'tls';
$mail->SMTPDebug = 4;
$mail->setFrom('braydenrhancock@gmail.com', 'Sender Name');
$mail->addAddress('braydenrhancock@gmail.com', 'Recipient Name');
$mail->Username = 'AKIAINH6PZ2UQKDK2BTA';
$mail->Password = 'GvMMa7R3fAXZGacl3gyfA86J0RxJLO7FQte9vrof';
$mail->Host = 'email-smtp.us-east-1.amazonaws.com';
$mail->Subject = 'Amazon SES test (SMTP interface accessed using PHP)';
$mail->Body = '<h1>Email Test</h1>';
$mail->Port = 587;
$mail->isHTML(true);
$mail->AltBody = "Email Test\r\nThis email was sent through the
Amazon SES SMTP interface using the PHPMailer class.";
if(!$mail->send()) {
echo "Email not sent. " , $mail->ErrorInfo , PHP_EOL;
} else {
echo "Email sent!" , PHP_EOL;
}
Вот полный вывод:
2017-11-06 01:09:49 Connection: opening to email-smtp.us-east-1.amazonaws.com:587, timeout=300, options=array ()
2017-11-06 01:09:49 Connection: opened
2017-11-06 01:09:49 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "220 email-smtp.amazonaws.com ESMTP SimpleEmailService-2367521455 ZxpFMwcwQB6LGlJ2noyc"
2017-11-06 01:09:49 SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-2367521455 ZxpFMwcwQB6LGlJ2noyc
2017-11-06 01:09:49 CLIENT -> SERVER: EHLO 34.200.216.237
2017-11-06 01:09:49 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-email-smtp.amazonaws.com"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-8BITMIME"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-SIZE 10485760"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-STARTTLS"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-AUTH PLAIN LOGIN"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS250-AUTH PLAIN LOGIN"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250 Ok"
2017-11-06 01:09:49 SERVER -> CLIENT: 250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS250-AUTH PLAIN LOGIN250 Ok
2017-11-06 01:09:49 CLIENT -> SERVER: STARTTLS
2017-11-06 01:09:49 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "220 Ready to start TLS"
2017-11-06 01:09:49 SERVER -> CLIENT: 220 Ready to start TLS
2017-11-06 01:09:49 CLIENT -> SERVER: EHLO 34.200.216.237
2017-11-06 01:09:49 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-email-smtp.amazonaws.com"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-8BITMIME"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-SIZE 10485760"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-STARTTLS"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250-AUTH PLAIN LOGIN"
2017-11-06 01:09:49 SMTP -> get_lines(): $data is "250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS250-AUTH PLAIN LOGIN"
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "250 Ok"
2017-11-06 01:09:49 SERVER -> CLIENT: 250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS250-AUTH PLAIN LOGIN250 Ok
2017-11-06 01:09:49 Auth method requested: UNKNOWN
2017-11-06 01:09:49 Auth methods available on the server: PLAIN,LOGIN
2017-11-06 01:09:49 Auth method selected: LOGIN
2017-11-06 01:09:49 CLIENT -> SERVER: AUTH LOGIN
2017-11-06 01:09:49 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "334 VXNlcm5hbWU6"
2017-11-06 01:09:49 SERVER -> CLIENT: 334 VXNlcm5hbWU6
2017-11-06 01:09:49 CLIENT -> SERVER: QUtJQUlOSDZQWjJVUUtESzJCVEE=
2017-11-06 01:09:49 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:49 SMTP -> get_lines(): $str is "334 UGFzc3dvcmQ6"
2017-11-06 01:09:49 SERVER -> CLIENT: 334 UGFzc3dvcmQ6
2017-11-06 01:09:49 CLIENT -> SERVER: R3ZNTWE3UjNmQVhaR2FjbDNneWZBODZKMFJ4SkxPN0ZRdGU5dnJvZg==
2017-11-06 01:09:50 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:50 SMTP -> get_lines(): $str is "535 Authentication Credentials Invalid"
2017-11-06 01:09:50 SERVER -> CLIENT: 535 Authentication Credentials Invalid
2017-11-06 01:09:50 SMTP ERROR: Password command failed: 535 Authentication Credentials Invalid
SMTP Error: Could not authenticate.
2017-11-06 01:09:50 CLIENT -> SERVER: QUIT
2017-11-06 01:09:50 SMTP -> get_lines(): $data is ""
2017-11-06 01:09:50 SMTP -> get_lines(): $str is "221 Bye"
2017-11-06 01:09:50 SERVER -> CLIENT: 221 Bye
2017-11-06 01:09:50 Connection: closed
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Email not sent. SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
3 ответа
SES не поддерживает использование IAM User AccessKeys для отправки электронной почты. SES использует учетные данные SMTP Amazon SES.
Sign in to the AWS Management Console and open the Amazon SES console at https://console.aws.amazon.com/ses/.
In the navigation pane, choose SMTP Settings.
In the content pane, choose Create My SMTP Credentials.
In the Create User for SMTP dialog box, you will see that an SMTP user name has been filled in for you. You can accept this suggested user name or enter a different one. To proceed, choose Create.
Choose Show User SMTP Credentials. Your SMTP credentials will be displayed on the screen; copy them and store them in a safe place. You can also choose Download Credentials to download a file that contains your credentials.
Вот ссылка на документ, который объясняет различные типы учетных данных и как они используются с SES.
Использование учетных данных с Amazon SES
Вот ссылка на получение учетных данных:
Это ваши учетные данные AWS или SMTP? А если это учетные данные AWS, то сгенерируйте учетные данные SMTP, а затем попробуйте. Смотрите это здесь
Или вы можете попробовать это тоже
Я добавил сюда свой ответ, так как ничего из вышеперечисленного мне не помогло Эта проблема связана с функцией безопасности в WHM/cPanel. Читайте больше, только если на вашем сервере есть WHM.
Вариант называется:
Ограничить исходящий SMTP для root, exim и mailman (настройка FKA SMTP)
Если вы отключите это, проблема будет решена. Имейте в виду, что в некоторых версиях cPanel этот параметр отсутствует и отображается в WHM, поскольку он влияет на все учетные записи. Для меня было нормально отключить его, так как я владею сервером и там нет неизвестных доменов / пользователей.
Эта примерная функция будет работать с Amazon SES с PHP 7.1, установленным в Windows 2012, при условии, что вы разархивировали phpmailer 5.2 (или около того) в то же место, что и я. Я не заморачивался с композитором. Обратите внимание, в функции ниже я закомментировал строку $mail->SMTPDebug = 2; ... но вы захотите откомментировать эту строку во время тестирования, чтобы увидеть, что произошло. Значения, которые нужно добавить, заключены в квадратные скобки. Мой SES-хост - "email-smtp.us-east-1.amazonaws.com", просто убедитесь, что к тому, что вы используете, вы не ставите ничего, кроме хоста fqdn, ничего другого (не ведите его с TLS://....
Сохраните следующее как Send_Amazon_Mail.php
<?php
function Send_Mail($to,$subject,$body)
{
require 'C:\Program Files\PHP\v7.1\phpmailer\PHPMailerAutoload.php';
$from = "[SES validated email address here]";
$mail = new PHPMailer();
// $mail->SMTPDebug = 2;
$mail->IsSMTP(true); // SMTP
$mail->SMTPAuth = true; // SMTP authentication
$mail->SMTPSecure = 'ssl';
$mail->Mailer = "smtp";
$mail->Host= "[your SES host]";
$mail->Port = 465; // SMTP Port
$mail->Username = "[SES SMTP USERNAME]"; // SMTP Username
$mail->Password = "[SES SMTP PASSWORD]"; // SMTP Password
$mail->SetFrom($from, 'Test Do Not Reply');
$mail->AddReplyTo($from,'[SES validated email address here]');
$mail->Subject = $subject;
$mail->MsgHTML($body);
$address = $to;
$mail->AddAddress($address, $to);
if(!$mail->Send())
return false;
else
return true;
}
?>
Вы можете вызвать эту функцию с помощью тестовой программы.
<?php
require 'Send_Amazon_Mail.php';
$to = "[someemailaddresshere]";
$subject = "Test Mail Subject";
$body = "Hi<br/>Test Mail<br/>Amazon SES"; // HTML tags
Send_Mail($to,$subject,$body);
?>
У меня была такая же проблема, пока я не узнал, что ConfigServer Security & Firewall (csf) по какой-то причине блокирует его. Я перезапустил службу CSF, и проблема была решена сама собой.