Unable to send email using Gmail SMTP server through PHPMailer, getting error: SMTP AUTH is required for message submission on port 587. How to fix?
Asked Answered
K

13

82

I would like to send an email using Gmail SMTP server through PHP Mailer.

this is my code

<?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 = '[email protected]';
$mail->Password = 'valid password';
$mail->SMTPAuth = true;

$mail->From = '[email protected]';
$mail->FromName = 'Mohammad Masoudian';
$mail->AddAddress('[email protected]');
$mail->AddReplyTo('[email protected]', '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!";
}
?>

but I receive this following error

Mailer Error: SMTP Error: The following recipients failed: [email protected]

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

my domain is vatandesign.ir

Kailey answered 16/4, 2013 at 22:34 Comment(1)
You may want to have a look at Jorj's answer on this thread: #5759919Northumbria
Q
149
$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 protected]";
$mail->Password = "password";
$mail->SetFrom("[email protected]");
$mail->Subject = "Test";
$mail->Body = "hello";
$mail->AddAddress("[email protected]");

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

This code above has been tested and worked for me.

It could be that you needed $mail->SMTPSecure = 'ssl';

Also make sure you don't have two step verification switched on for that account as that can cause problems also.

UPDATED

You could try changing $mail->SMTP to:

$mail->SMTPSecure = 'tls';

It's worth noting that some SMTP servers block connections. Some SMTP servers don't support SSL (or TLS) connections.

Quipu answered 16/4, 2013 at 22:45 Comment(6)
i recieve this error when i use your code Mailer Error: The following From address failed: [email protected] : Called Mail() without being connectedKailey
Updated answer with a further suggestion. The code is definitely fine anyway. You could check these two sources phpmailer.worxware.com/index.php?pg=exampleagmail and github.com/Synchro/PHPMailer/blob/master/examples/…Quipu
i am getting the error as: CLIENT -> SMTP: EHLO localhost SMTP -> ERROR: EHLO not accepted from server: CLIENT -> SMTP: HELO localhost Notice: fwrite(): send of 16 bytes failed with errno=10054 An existing connection was forcibly closed by the remote host. in C:\xampp\htdocs\program\mailsending1\mailsending_v1\PHPMailer-master\class.smtp.php on line 1023 SMTP -> ERROR: HELO not accepted from server: SMTP -> NOTICE: EOF caught while checking if connectedSMTP Connect() failed. Mailer Error: SMTP Connect() failed.Tavie
Note that if you specify "ssl" (which is warmly recommended), your PHP installation needs to have the "openssl" extension loaded (or compiled in), using your favourite PHP extension mechanism (I happen to use OS X Macports, for which it's sudo port install php5-openssl)Chrysarobin
It better to check both returning value and errors if(!$mail->Send() || $mail->ErrorInfo) {Plassey
In my experience you now need to match the port and security options. $mail->SMTPSecure = 'tls'; $mail->Port = 587; or $mail->SMTPSecure = 'ssl'; $mail->Port = 465;Newmown
A
34

So I just solved my own "SMTP connection failure" error and I wanted to post the solution just in case it helps anyone else.

I used the EXACT code given in the PHPMailer example gmail.phps file. It worked simply while I was using MAMP and then I got the SMTP connection error once I moved it on to my personal server.

All of the Stack Overflow answers I read, and all of the troubleshooting documentation from PHPMailer said that it wasn't an issue with PHPMailer. That it was a settings issue on the server side. I tried different ports (587, 465, 25), I tried 'SSL' and 'TLS' encryption. I checked that openssl was enabled in my php.ini file. I checked that there wasn't a firewall issue. Everything checked out, and still nothing.

The solution was that I had to remove this line:

$mail->isSMTP();

Now it all works. I don't know why, but it works. The rest of my code is copied and pasted from the PHPMailer example file.

Allemande answered 2/7, 2015 at 21:12 Comment(8)
This solution works because it turns off SMTP altogether. I DO NOT recommend this method. I never solved this issue, I'm now switching to using Mandrill API instead.Allemande
Just use Mandrill, it's much better and actually has some analytics.Allemande
Solved my problem. Thank you so much.Irretrievable
It worked for me too. Weird, this lib is quite maturePlassey
Once I sent first email I put isSMTP() back and it works fine now. So looks like Gmail protectionPlassey
BAD solution, you are not using smtp like this but bare php mail() function which will probably send your email as junk for some recipientsCapillarity
Thanks for this, I had the same issue and once I removed isSMTP it workedPentobarbital
I was having the same issue and this solution worked for me. The emails are being sent and not ending in the spam folder now. Not sure they it works but it worksPentobarbital
S
9

Also worth noting that if you have two factor authentication enabled, you'll need to setup an application specific password to use in place of your email account's password.

You can generate an application specific password by following these instructions: https://support.google.com/accounts/answer/185833

Then set $mail->Password to your application specific password.

Sheedy answered 22/1, 2014 at 12:5 Comment(0)
B
5

It seems that your server fails to establish a connection to Gmail SMTP server. Here are some hints to troubleshoot this: 1) check if SSL correctly configured on your PHP (module that handle it isn't installed by default on PHP. You have to check your configuration in phph.ini). 2) check if your firewall let outgoing calls to the required port (here 465 or 587). Use telnet to do so. If the port isn't opened, you'll then require some support from sysdmin to setup the config. I hope you'll sort this out quickly!

Backer answered 26/7, 2013 at 8:26 Comment(0)
T
1

Google treat Gmail accounts differently depending on the available user information, probably to curb spammers.

I couldn't use SMTP until I did the phone verification. Made another account to double check and I was able to confirm it.

Thirdrate answered 19/4, 2016 at 15:29 Comment(0)
M
1

this code working fine for me

    $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';
    }
Meldameldoh answered 27/10, 2016 at 5:41 Comment(2)
$mail->SMTPSecure = 'ssl'; $mail->Port = 465; I just changed TSL to ssl and 587 to 465, then it's worked for me, thank you.. GMAIL to allow less secure apps : myaccount.google.com/lesssecureappsKreindler
And Google will remove this setting by May 30, 2022. No one will be able to login into google using only username and password. support.google.com/accounts/answer/…Neoterism
B
0

Anderscc has got it correct. Thanks. It worked for me but not 100%.

I had to set

$mail->SMTPDebug = 0;

Setting it to 1, can cause errors especially if you are passing some data as json to next page. Example - Performing verification if mail is sent, using json to pass data through ajax.

I had to lower my gmail account security settings to get rid of errors: " SMTP connect() failed " and " SMTP ERROR: Password command failed "

Solution: This problem can be caused by either 'less secure' applications trying to use the email account (this is according to google help, not sure how they judge what is secure and what is not) OR if you are trying to login several time in a row OR if you change countries (for example use VPN, move code to different server or actually try to login from different part of the world).

Links that fix the problem (you must be logged into google account):

Note: You can go to the following stackoverflow answer link for more detailed reference.

https://stackoverflow.com/a/25175234

Blowout answered 4/5, 2017 at 12:25 Comment(1)
and voila... less secure setting will be removed by 30 May, 2022Neoterism
L
0

If you are using cPanel you should just click the wee box that allows you to send to external servers by SMTP.

Login to CPanel > Tweak Settings > All> "Restrict outgoing SMTP to root, exim, and mailman (FKA SMTP Tweak)"

As answered here:

"Password not accepted from server: 535 Incorrect authentication data" when sending with GMail and phpMailer

Lindsley answered 26/10, 2017 at 15:32 Comment(0)
H
0
 $mail->SMTPOptions = array(
                'ssl' => array(
                    'verify_peer' => false,
                    'verify_peer_name' => false,
                    'allow_self_signed' => true
                )
            );
Holography answered 29/3, 2018 at 4:17 Comment(2)
While this code snippet may solve the question, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion.Coagulate
This is just dangerous. Don't do it.Thyme
O
0

I just wanted to share my experience with phpMailer , that was working locally (XAMPP) but wasn't working on my hosting provider.

I turned on phpMailer error reporting

 $mail->SMTPDebug=2

I got 'Connection refused Error'

I email my host provider for the issue, and they said that they would open the SMTP PORTS 25, 465, 587.

Then I got the following error response "SMTP ERROR: Password command failed:"...."Please log in via your web browser and then try again"...."SMTP Error: Could not authenticate."

So google checks if your are logged in to your account (I was when I ran the script locally through my browser) and then allows you to send mail through the phpMailer script.

To fix that:

1: go to your Google account -> security 2: Scroll to the Key Icon and choose "2 way verification" and follow the procedure 3: When done go back to the key icon from google account -> security and choose the second option "create app passwords" and follow the procedure to get the password.

Now go to your phpMailer object and change your Google password with the password given from the above procedure.

You are done.

The code:

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;
                } 
Ode answered 20/3, 2020 at 1:6 Comment(0)
A
0

If anyone there who is not getting a working answer, they can try this.

Note: I am using PHPMailer 5.2.23.

<?php

    date_default_timezone_set('Asia/Kolkata');

    require './Libraries/PHPMailer5/PHPMailerAutoload.php';
    $mail = new PHPMailer;

    $mail->isSMTP();

    // Enable SMTP debugging
    // 0 = off (for production use)
    // 1 = client messages
    // 2 = client and server messages
    $mail->SMTPDebug = 2;

    $mail->Debugoutput = 'html';

    $mail->Host = 'localhost';
    $mail->Port = 587;

    $mail->SMTPSecure = 'tls';

    $mail->SMTPAuth = true;
    $mail->Username = "yourWebmailUsermail";
    $mail->Password = "yourWebmailPassword";

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

    $mail->setFrom('formEmailAddress', 'First Last');

    $mail->addAddress('toEmailAddress', 'John Doe');

    $mail->Subject = 'PHPMailer GMail SMTP test';

    $mail->msgHTML("<h1>Hi Test Mail</h1>");
    $mail->AltBody = 'This is a plain-text message body';

    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!";
    }
?>
Appressed answered 11/6, 2021 at 19:50 Comment(0)
E
0

I have found a solution and it is working.

Basic settings:

$mail->IsHTML(true);
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
//SMTP::DEBUG_OFF = off (for production use)
//SMTP::DEBUG_CLIENT = client messages
//SMTP::DEBUG_SERVER = client and server messages
$mail->SMTPDebug = SMTP::DEBUG_CLIENT;
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
//Set the SMTP port number - likely to be 25, 465 or 587
$mail->Port = 587;
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication
$mail->Username = '[email protected]';
//Password to use for SMTP authentication
$mail->Password = 'PASSWORD_HERE';
//Set who the message is to be sent from
$mail->setFrom('[email protected]', 'From where it is sent');
//Set an alternative reply-to address
$mail->addReplyTo('[email protected]', 'Reply To');
//Set who the message is to be sent to
$mail->addAddress('[email protected]');
//Set the subject line
$mail->Subject = 'Email subject';
// Body message
$mail->Body = '
  <h1>Message details</h1>
';
// Send message
if( $mail->send()  ) {
    echo "Sent"
} else {
    echo "Not Sent";
}

If you've already tried everything, try doing this:

  1. Disable the feature of blocking suspicious apps/technologies https://www.google.com/settings/u/1/security/lesssecureapps
  2. Clear the Captcha https://accounts.google.com/b/0/DisplayUnlockCaptcha

Do the test.

Here are some articles of interest that helped me solve this:

https://support.google.com/a/thread/108782439/smtp-error-password-command-failed-535-5-7-8-username-and-password-not-accepted?hl=en&msgid=108963583

https://bobcares.com/blog/phpmailer-smtp-error-password-command-failed/

Emilieemiline answered 19/9, 2021 at 1:39 Comment(0)
E
-2

I think it is connection issue you can get code here http://skillrow.com/sending-mail-using-smtp-and-php/

include(“smtpfile.php“);
include(“saslfile.php“); // for SASL authentication $from=”[email protected]“; //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;
}
Exacting answered 21/3, 2014 at 6:6 Comment(1)
Link-only answers are typically discouraged. Could you expand this into something stand-alone?Koel

© 2022 - 2024 — McMap. All rights reserved.