AWS SES with PHPMailer using SMTP, SMTP Error: Could not authenticate?

匿名 (未验证) 提交于 2019-12-03 01:05:01

问题:

I get the following error: Authentication Credentials Invalid.

I've double checked the username (Access key ID) and password (Secret Token) a million times. I double checked the base64 sent to the server and it's correct. User has correct access rights. All outbound traffic from EC2 server is allowed. SELinux is disabled. I've escaped special characters, tried different credentials. Tried using a user with more access.

I'm using PHPMailer with AWS SES.

Here is the code:

$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; } 

Here is the full output:

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 

回答1:

SES does not support using IAM User AccessKeys to send email. SES uses Amazon SES SMTP credentials.

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. 

Here is a link to a document that explains the different type of credentials and how they are used with SES.

Using Credentials With Amazon SES

Here is a link to obtaining credentials:

Obtaining Your Amazon SES SMTP Credentials



回答2:

Are these your AWS credentials or SMTP credentials? And if these are AWS credentials then generate SMTP credentials and then try. See it here

Or you can try this too Similar issue



回答3:

This example function will work with Amazon SES with PHP 7.1 installed on Windows 2012, assuming you unzipped phpmailer 5.2 (or so) into the same location I did. I did not bother with the composer. Note in the function below I commented out the line $mail->SMTPDebug = 2; ...but you'd want to un-comment this line while testing so you can see what happened. The values you need to add are within brackets. My SES host is "email-smtp.us-east-1.amazonaws.com" , just make sure whichever one you use that you don't put anything more than just the host fqdn, nothing else (don't lead it with tls://....

Save the following as 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;  } ?> 

You can call this function with a test program

<?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); ?> 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!