395

I am trying to send an email via GMail's SMTP server from a PHP page, but I get this error:

authentication failure [SMTP: SMTP server does no support authentication (code: 250, response: mx.google.com at your service, [98.117.99.235] SIZE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

Can anyone help? Here is my code:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>
skb
  • 28,056
  • 29
  • 91
  • 140

14 Answers14

362
// Pear Mail Library
require_once "Mail.php";

$from = '<fromaddress@gmail.com>';
$to = '<toaddress@yahoo.com>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'johndoe@gmail.com',
        'password' => 'passwordxxx'
    ));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}
Nathan Tuggy
  • 2,239
  • 27
  • 28
  • 36
pavan kumar
  • 3,708
  • 1
  • 14
  • 2
  • 147
    what is `Mail.php`?? where do I get this file from? – Zain Shaikh Nov 26 '10 at 23:23
  • 19
    could anyone please give me a link where I can get the Mail.php file. Because I tried it and it would not work Thanks – Yoosuf Apr 17 '11 at 06:52
  • 1
    Would someone please post an example of Mail.php? That is the only piece I am missing, otherwise I believe it will work. Thanks in advance. – rahrahruby Apr 18 '11 at 16:00
  • 12
    Where are the @ symbols in this example above? I do not see a single one in there! – darkAsPitch Jun 30 '11 at 04:08
  • 7
    I believe that myaccount.gmail.com is the same as myaccount@gmail.com in the email standards. – Sherwin Flight Oct 14 '11 at 09:02
  • 3
    You don't need to include @gmail if you have the server specified. Just type `myaccount` for username. – Jack Apr 16 '12 at 06:08
  • 3
    Is there a way to encrypt the password? – David Aug 16 '12 at 17:10
  • 2
    @Xavi : when i use that pear mail package it asks for PEAR.php file – logan Jan 12 '13 at 17:42
  • 2
    I'm unable to send mail using the above code. I found the [Mail.php](http://pear.php.net/package/Mail/download) [here](http://pear.php.net/package/Mail/download) but it contains a file `mail` without any extension. Anybody could help? – Mohammad Faisal Feb 20 '13 at 07:25
  • If you already installed the PEAR library in debian is in the following directory: /usr/share/php/ You can put something like this, or change php.ini var include_path: require_once "/usr/share/php/Mail.php"; – renedet Apr 22 '13 at 20:10
  • 2
    This code does not work, it give this error: "SMTP: Invalid response code received from server (code: 535, response: Incorrect authentication data)]" – nacholibre Jun 09 '13 at 10:26
  • use `include_once("Mail.php");` instead of `require_once "Mail.php";` – Sumit Ramteke Aug 02 '13 at 08:02
  • 2
    Following installation are required to use this code on Ubuntu. – waqas Aug 22 '13 at 11:53
  • I'm getting : Non-static method Mail::factory() should not be called statically Please help – Vaido Sep 22 '13 at 16:06
  • for those who's asking about `Mail.php` They can google `PEAR Library`. While installing `PEAR Library`, be sure to install `PEAR Mail` extension,Thus, `MAIL.PHP`. – Black0CodeR Mar 22 '14 at 09:45
  • i used your code exactly but i replaced the gmail account with my gmail and passowrd. for the to and from fields i used: 'lmorda2@hotmail.com' => 'ABC' 'lmorda2@hotmail.com' am i doing something wrong? I dont get any emails. – Lou Morda Jul 04 '14 at 14:18
  • i think what im trying to ask is can i use anything for the to, from fields? or does one of them have to be a mail address on my servers domain? i have one email with my servers domain, and i use google apps for that email. i dont have a mail server running.. – Lou Morda Jul 04 '14 at 14:28
  • I tried to send mail as explained. Mail was sent successfully, but it does populate the plain html with "tr" and "td". Can you please help me on this? Mail content will be like
    Name:Email:
    – saran Oct 10 '14 at 04:58
  • 1
    Download the [latest version **Mail-1.2.0.tgz**](http://pear.php.net/package/Mail/download) and get the Mail.php from it `\Mail-1.2.0.tgz\Mail-1.2.0.tar\Mail-1.2.0\Mail.php` – Jaider Feb 13 '15 at 17:46
  • Works very well. Can I use it to send mass mails ( to notify e-commerce newly added products to subscribed customers) ? for example in for loop. Is it safe ? ( in terms of spam) – Bhavesh G Apr 06 '15 at 09:13
  • How to get pear.php file to run above code successfully.I am getting "Warning: require_once(PEAR.php): failed to open stream" error while accessing above code in browser. – BABU K Aug 19 '15 at 06:54
  • To use PEAR packages just add the include path to php like this: ini_set("include_path", '/home/user/php:' . ini_get("include_path") ); – matiaslanzi May 04 '16 at 21:29
  • 2
    I am getting `"authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 p80sm2675348pfk.50 - gsmtp)]"`. – Murad Hasan May 11 '17 at 09:35
  • i am also getting the auth failure like Frayne Konok. The PHP script is on Ubuntu 14.04 (Digial Ocean server) and the account used to authenticate is a G Suite account that does not end in "@gmail.com". But same account username can log into gmail. – robnardo Jul 10 '18 at 00:13
  • 3
    I have tried all of this thread answer and nothing works for GSuite email that doesnt have @gmail.com. I have looked and tried lot of things of others sites and nothing work. I think the problem is GSuite. If some one has the same issue and could give a solution or point to a web site would be great. I am on a gmail instance using corporative GSuite. – Diego Andrés Díaz Espinoza Sep 01 '18 at 14:58
108

Using Swift mailer, it is quite easy to send a mail through Gmail credentials:

<?php
require_once 'swift/lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
  ->setUsername('GMAIL_USERNAME')
  ->setPassword('GMAIL_PASSWORD');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Test Subject')
  ->setFrom(array('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>
shasi kanth
  • 6,503
  • 22
  • 101
  • 151
  • 2
    This worked "to the first" just changing the GMAIL_USERNAME, GMAIL_PASSWORD, and the From and To addresses. No other solution worked for me. Thanks. – Marco Muciño May 14 '13 at 18:08
  • 8
    I agree, swift mailer is a drop in mail solution that much easier than messing with pear. Don't forget to enable PHP's php_openssl extension. – Soth May 30 '13 at 04:02
  • 1
    Nice solution using SwiftMailer! +1 – Amal Murali Feb 16 '14 at 06:16
  • Worked like a charm! Thanks! :-) – Armando Freire Jun 18 '14 at 15:19
  • 1
    arrrgh. icant get swiftmailer to work. i dont know how to use that "composer" so i just downloaded the swiftmailer zip from github then I enabled open_ssl then supplied my gmail email and password but it still didnt work. – boi_echos Sep 14 '14 at 13:05
  • 3
    ah sorry for my stupidity. you have to open your gmail account because there is an email telling you to enable "less secure app". then its now working heheh – boi_echos Sep 14 '14 at 13:09
  • OpenSSL support enabled OpenSSL Library Version OpenSSL 1.0.1f 6 Jan 2014 OpenSSL Header Version OpenSSL 1.0.1f 6 Jan 2014 But not working yet. – Satanand Tiwari Nov 29 '16 at 08:22
  • Finally, Swift Mailer is also the only one that worked for me. I also had some troubles with composer but finally got it. You just install composer for windows then rather then make those json files, just navigate to your direcotry via cmd, then type "composer require swiftmailer/swiftmailer" – Alex Jan 22 '17 at 11:38
56

Your code does not appear to be using TLS (SSL), which is necessary to deliver mail to Google (and using ports 465 or 587).

You can do this by setting

$host = "ssl://smtp.gmail.com";

Your code looks suspiciously like this example which refers to ssl:// in the hostname scheme.

crb
  • 7,964
  • 6
  • 35
  • 46
34

I don't recommend Pear Mail. It has not been updated since 2010. Also read the source files; the source code is almost outdated, written in PHP 4 style and many errors / bugs have been posted (Google it). I am using Swift Mailer.

Swift Mailer integrates into any web application written in PHP 5, offering a flexible and elegant object-oriented approach to sending emails with a multitude of features.

Send emails using SMTP, sendmail, postfix or a custom Transport implementation of your own.

Support servers that require username & password and/or encryption.

Protect from header injection attacks without stripping request data content.

Send MIME compliant HTML/multipart emails.

Use event-driven plugins to customize the library.

Handle large attachments and inline/embedded images with low memory use.

It is a free and open source you can Download Swift Mailer and upload to your server. (The feature list is copied from owner website).

The working example of Gmail SSL/SMTP and Swift Mailer is here...

// Swift Mailer Library
require_once '../path/to/lib/swift_required.php';

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('username@gmail.com') // Your Gmail Username
    ->setPassword('my_secure_gmail_password'); // Your Gmail Password

// Mailer
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance('Wonderful Subject Here')
    ->setFrom(array('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('receiver@example.com' => 'Receiver Name')) // your email / multiple supported.
    ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');

// Send the message
if ($mailer->send($message)) {
    echo 'Mail sent successfully.';
} else {
    echo 'I am sure, your configuration are not correct. :(';
}

I hope this helps. Happy coding... :)

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Madan Sapkota
  • 21,350
  • 11
  • 100
  • 111
  • 1
    This no longer works, I always get the return message "535-5.7.8 Username and Password not accepted". My credentials are fine and I have set the "allow less-secure apps" to ON. Anyone know a fix to this? – AndrewB May 17 '17 at 17:08
  • Swift doesn't seem to work in PHP 5.x - doesn't understand the ?? coalesce - just blows up. – HerrimanCoder Jan 05 '18 at 04:51
28
<?php
date_default_timezone_set('America/Toronto');

require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = "gdssdh";
//$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
//$mail->Host       = "ssl://smtp.gmail.com"; // SMTP server
$mail->SMTPDebug  = 1;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
$mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail->Port       = 465;                   // set the SMTP port for the GMAIL server
$mail->Username   = "user@gmail.com";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('contact@prsps.in', 'PRSPS');

//$mail->AddReplyTo("user2@gmail.com', 'First Last");

$mail->Subject    = "PRSPS password";

//$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "user2@yahoo.co.in";
$mail->AddAddress($address, "user2");

//$mail->AddAttachment("images/phpmailer.gif");      // attachment
//$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

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

?>
Deept Raghav
  • 1,381
  • 12
  • 14
20

SwiftMailer can send E-Mail using external servers.

here is an example that shows how to use a Gmail server:

require_once "lib/Swift.php";
require_once "lib/Swift/Connection/SMTP.php";

//Connect to localhost on port 25
$swift =& new Swift(new Swift_Connection_SMTP("localhost"));


//Connect to an IP address on a non-standard port
$swift =& new Swift(new Swift_Connection_SMTP("217.147.94.117", 419));


//Connect to Gmail (PHP5)
$swift = new Swift(new Swift_Connection_SMTP(
    "smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS));
Sam Apostel
  • 558
  • 3
  • 18
Pekka
  • 418,526
  • 129
  • 929
  • 1,058
14

The code as listed in the question needs two changes

$host = "ssl://smtp.gmail.com";
$port = "465";

Port 465 is required for an SSL connection.

s01ipsist
  • 2,882
  • 2
  • 28
  • 34
6

Send Mail using phpMailer library through Gmail Please donwload library files from Github

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 */
//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 '../PHPMailerAutoload.php';
//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$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 = "username@gmail.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
Bhavin Solanki
  • 1,296
  • 11
  • 27
6

I had this problem also. I set the correct settings and have enabled less secure apps but it still did not work. Finally, I enabled this https://accounts.google.com/UnlockCaptcha, and it worked for me. I hope this helps someone.

Strategist
  • 550
  • 8
  • 11
4

Gmail requires port 465, and also it's the code from phpmailer :)

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
4

To install PEAR's Mail.php in Ubuntu, run following set of commands:

    sudo apt-get install php-pear
    sudo pear install mail
    sudo pear install Net_SMTP
    sudo pear install Auth_SASL
    sudo pear install mail_mime
Nahid
  • 2,657
  • 1
  • 18
  • 15
0

I have a solution for GSuite accounts that doesnt have the "@gmail.com" sufix. Also I think it will work for GSuite accounts with the @gmail.com but havent tried it. First you should have the privileges to change the option "allos¿w less secure app" for your GSuite account. If you have the privileges (you can check in account settings->security) then you have to deactivate "two step factor authentication" go to the end of the page and set to "yes" for allow less secure applications. That's all. If you dont have privileges to change those options the solution for this thread will not work. Check https://support.google.com/a/answer/6260879?hl=en to make changes to "allow less..." option.

0

I tried the suggestion offered by @shasi kanth, but it didn't work out. I read the documentation and there are few changes made. So I managed to send mail via Gmail using this code, where vendor/autoload.php is got by composer with composer require "swiftmailer/swiftmailer:^6.0":

<?php
     require_once 'vendor/autoload.php';
     $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))->setUsername ('SendingMail')->setPassword ('Password');

     $mailer = new Swift_Mailer($transport);

     $message = (new Swift_Message('test'))
      ->setFrom(['Sending mail'])
      ->setTo(['Recipient mail'])
      ->setBody('Message')
  ;

     $result = $mailer->send($message);
    ?>
sjuesju
  • 11
  • 4
-4

Set

'auth' => false,

Also, see if port 25 works.

CookieOfFortune
  • 12,980
  • 8
  • 36
  • 56
  • 2
    It won't - Google requires delivery on 465 or 587. See http://mail.google.com/support/bin/answer.py?hl=en&answer=13287. – crb Apr 03 '09 at 03:11