13

I am using Amazon SES. I am trying to send an email from my PHP script using PHPMailer.

I already verified two email ids and trying to send mail from and to this mail ids. But It throws the following error.

ERROR

SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-693939519  QEPGeLndQQq5vJ53VMXU
CLIENT -> SERVER: EHLO localhost
SERVER -> CLIENT: 250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250- STARTTLS250-AUTH PLAIN LOGIN250 Ok
CLIENT -> SERVER: STARTTLS
SERVER -> CLIENT: 220 Ready to start TLS
CLIENT -> SERVER: EHLO localhost
SERVER -> CLIENT: 250-email-smtp.amazonaws.com250-8BITMIME250-SIZE 10485760250-STARTTLS250-AUTH PLAIN LOGIN250 Ok
CLIENT -> SERVER: AUTH LOGIN


SMTP NOTICE: EOF caught while checking if connected
SMTP connect() failed.
Mailer Error: SMTP connect() failed.

The following is my PHP Script:

<?php

//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have   access to that
date_default_timezone_set('Etc/UTC');

require 'phpmailer/PHPMailerAutoload.php';

//Create a new PHPMailer instance
$mail = new PHPMailer();

//Tell PHPMailer to use SMTP
$mail->isSMTP();

//Enable SMTP debugging

$mail->SMTPDebug = 2;

//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';

//Set the hostname of the mail server
$mail->Host = 'email-smtp.us-east-1.amazonaws.com';

//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
// I tried PORT 25, 465 too
$mail->Port = 587;

//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';

//Whether to use SMTP authentication
$mail->SMTPAuth = true;

//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "SES Secret ID";

//Password to use for SMTP authentication
$mail->Password = "SES Secret Key";

//Set who the message is to be sent from
$mail->setFrom('sender@example.com', 'sender');

//Set who the message is to be sent to
$mail->addAddress('receiver@example.com', 'receiver');

//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';


$mail->Body = 'This is a plain-text message body';
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';

//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
?>

I tried so many solutions I found over the internet, especially stackoverflow.

Nothing works !!

AKA
  • 2,601
  • 4
  • 17
  • 34
  • 1
    Why are you using PHPMailer when Amazon provides a PHP SDK? http://docs.aws.amazon.com/aws-sdk-php/guide/latest/ – ashack May 06 '14 at 15:09
  • 1
    Thanks for making remember me of PHP SDK..!! I Got It Working !! Thanks !! – AKA May 07 '14 at 06:06

5 Answers5

12

I managed to make it work.

$ mail-> Port = 587; 

// Username to use for SMTP authentication - use full email address for gmail 
$ mail-> Username = "Amazon SES Secret ID"; 

// Password to use for SMTP authentication 
$ mail-> Password = "Amazon SES Secret Key"; 

To create credentials visit this link: https://console.aws.amazon.com/ses/home?region=us-east-1#smtp-settings:

To send e-mail, both sending email, as the email you receive will necessarily have to be registered and checked by amazon. (https://console.aws.amazon.com/ses/home?region=us-east-1#verified-senders-mail:)

Any questions you can find me. I hope I helped

Victor Gomes
  • 442
  • 6
  • 15
9

I had the same problem, I could only get it to work when I changed host name to start with ssl://. So this works:

$mail = new PHPMailer;

$mail->SMTPDebug = 3; // Enable verbose debug output

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'ssl://email-smtp.us-west-2.amazonaws.com';  // Specify main and backup SMTP servers

$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'blah';                 // SMTP username
$mail->Password = 'blahblah';                           // SMTP password


$mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = 443;                  
leon
  • 1,382
  • 1
  • 15
  • 25
3

To send email successfully with PHPMailer + AWS SES, I had to use these settings:

$mail->IsSMTP(true);
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Host= "email-smtp.eu-west-1.amazonaws.com"; /** Edit to the region you're using **/
$mail->Port = 587;
$mail->Username = 'MYACCESSKEYID';
$mail->Password = 'MYSECRETACCESSKEY'

Taking it one step further, I extended the PHPMailer class to:

a. Conveniently share default values throughout my codebase; and
b. Distinguish between development and production.

It looks like this:

<?php

/* MYMAILER
 * Our own custom mailer class. Makes it easier to use default settings for all things email.
 *
 * Rules of thumb:
 * - Keep bounce rate under 5%.
 * - Keep complaint rate under 0.1%
 *
 * Tips:
 * - To check that the SPF and DKIM settings are correct, simply send an email (e.g.: to Gmail) and check its headers.
 * - Check URIBL.com and SURBL.org to check my links are not blacklisted.
 *
 * Documentation:
 * - Best practices: http://media.amazonwebservices.com/AWS_Amazon_SES_Best_Practices.pdf -- includes iSP postmaster pages for many ISPs on last page.
 * - Header fields: http://docs.aws.amazon.com/ses/latest/DeveloperGuide/header-fields.html
 * ================================================================================= */
class MyMailer extends PHPMailer {
    public function __construct() {
        parent::__construct();


        $this->CharSet = 'UTF-8';

        if ( defined('APP_DEVELOPMENT') ) {

            /**
             * Local development. e.g.: mhsendmail + MailHog.
             **/
            $this->IsMail(); /** PHPMailer's default, but let's be explicit here. **/

        } else {

            /**
             * Production, i.e.: Amazon's SES.
             * The `Username` and `Password` SMTP credentials are AWS `Access key ID`/`Secret access key` created specifically for Amazon SES.
             *  Cf. `AWS Console › SES › SMTP Settings` to create them.
             *  Cf. `AWS Console › IAM › Users` to list the access keys (passwords only available when creating credentials.)
             *      CAREFUL! Creating new access keys for the SMTP user via IAM is technically possible but it does NOT work!
             *      Instead, use the `SES › SMTP Settings` interface.
             * Remember that any FROM email has to be verified (either via domain or via email inbox.)
             **/
            $this->IsSMTP(true);
            $this->SMTPAuth = true;
            $this->SMTPSecure = "tls";

            $url = parse_url( getenv('SMTP_URL') );
            if ( $url == FALSE ) {
                $log->error( 'Failed to parse SMTP_URL' );
            }
            $this->Host= $url['host'];
            $this->Port = $url['port'];
            $this->Username = $url['user'];
            $this->Password = $url['pass'];

        }


        /**
         * Default values common to local + SES. Constant defined in config.php
         * Used defensively only.
         * Those values would and should be overwritten by the code.
         * Apparently, the order matters (TBC.)
         **/
        $this->AddReplyTo( MAIL_DEFAULT_ADDREPLYTO );
        $this->FromName = MAIL_DEFAULT_FROMNAME;
        $this->From = MAIL_DEFAULT_FROM;
    }
}

?>

I hope this helps.

Fabien Snauwaert
  • 3,686
  • 3
  • 42
  • 57
0

The below entry helped me resolve the issue I was facing with non delivery of my emails. While I had all the other configurations done but could not understand on why it was not working (not a PHP developer and hence not easy to figure out).

$mail->SMTPSecure = 'tls';
Roopendra
  • 7,221
  • 16
  • 59
  • 84
Anil
  • 1
0

Just increase your sending mail limit quota on AWS SES

I had the same issue with AWS ec2 and then by searching solution, I got that AWS SES send mails only if receivers is also verified if you are in amazon sandbox.

If you want to send mail to another mail id( that is not verified ) then you have to increase your sending limit quota. just follow the steps shown in URL

http://docs.aws.amazon.com/ses/latest/DeveloperGuide/submit-extended-access-request.html

Community
  • 1
  • 1