17

I am trying to use PHPMailer to send a gmail email. I followed this post

In order to do this, I set up a function shown below:

function sendEmail($email, $name) {
    $mail = new PHPMailer();
    $mail->IsSMTP(); // send via SMTP
    //IsSMTP(); // send via SMTP I commented it cos it gives an error
    $mail->SMTPAuth = true; // turn on SMTP authentication
    $mail->Username = 'email@gmail.com'; // Changed my email
    $mail->Password = "password";// Changed my password
    $mail->From = 'email@gmail.com';
    $mail->FromName = 'FROM NAME';


    $mail->AddAddress($email);

    $mail->IsHTML(true); // send as HTML
    $mail->Subject = "Subject";
    $mail->Body = "Body";

    if (!$mail->Send()) {
        return false;
    } else {
        return true;
    }
}

Unfortunately, it keeps on returning false. Can you please tell me whats wrong with the code?

Edit: The error which I am getting is shown below:

SMTP -> ERROR: Failed to connect to server: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

SMTP Error: Could not connect to SMTP host.

UPDATED CODE:

 $Mail = new PHPMailer();
    $Mail->IsSMTP(); // Use SMTP
    $Mail->Host = "smtp.gmail.com"; // Sets SMTP server
    $Mail->SMTPDebug = 2; // 2 to enable SMTP debug information 
    $Mail->SMTPAuth = TRUE; // enable SMTP authentication
    $Mail->SMTPSecure = "tls"; //Secure conection
    $Mail->Port = 587; // set the SMTP port
    $Mail->Username = EMAIL; // SMTP account username
    $Mail->Password = PASS; // SMTP account password
    $Mail->Priority = 1; // Highest priority - Email priority (1 = High, 3 = Normal, 5 = low)
    $Mail->CharSet = 'UTF-8';
    $Mail->Encoding = '8bit';
    $Mail->Subject = 'SUB';
    $Mail->ContentType = 'text/html; charset=utf-8\r\n';
    $Mail->From = EMAIL;
    $Mail->FromName = 'FROM NAME';
    $Mail->WordWrap = 900; // RFC 2822 Compliant for Max 998 characters per line

    $Mail->AddAddress($email); // To:
    $Mail->isHTML(TRUE);
    $Mail->Body = "Hi";
    $Mail->AltBody = "Hi";
    $Mail->Send();
    $Mail->SmtpClose();
Community
  • 1
  • 1
Goaler444
  • 2,591
  • 6
  • 35
  • 53
  • Have you set the SMTP settings on your server, within PHP.ini? – Luke Nov 12 '12 at 13:07
  • No Problem with code check server side for SMTP settings ! – Viral Shah Nov 12 '12 at 13:08
  • 2
    have you set `$mail->Host = 'smtp.gmail.com'; $mail->Port = 465;` – GBD Nov 12 '12 at 13:09
  • On the post I referenced, it told me to do this with regards the host and port setting: "5) Open the file class.smtp.php in phpmailer directory 6) Paste this code $host = "ssl://smtp.gmail.com"; $port = 465;" – Goaler444 Nov 12 '12 at 13:14
  • Set `$mail->SMTPDebug = true;` and paste the debug messages. – air4x Nov 12 '12 at 13:19
  • I added the code, not debug messages are being printed out.. – Goaler444 Nov 12 '12 at 13:26
  • change your first line to this `$mail = new PHPMailer(true);` and see if you get any error message. – air4x Nov 12 '12 at 13:29
  • "Message body empty" its giving me that error – Goaler444 Nov 12 '12 at 14:07
  • Never mind: getting this now: SMTP -> ERROR: Failed to connect to server: php_network_getaddresses: getaddrinfo failed: A non-recoverable error occurred during a database lookup. (0) SMTP Error: Could not connect to SMTP host. – Goaler444 Nov 12 '12 at 14:13
  • Ok: Now Im getting this only :SMTP -> ERROR: Failed to connect to server: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. (10060) – Goaler444 Nov 12 '12 at 14:17
  • Ok im lost, dont know why it is not working. @Coulton what do I have to check in the PHP.ini file please? – Goaler444 Nov 12 '12 at 14:51
  • I'd do a search within PHP.ini for instances of SMTP and check that they are set to the relevant server and username/password. Once this is done, reboot your server to pick up the new settings :) – Luke Nov 12 '12 at 14:53
  • [mail function] ; For Win32 only. ; http://php.net/smtp SMTP = localhost ; http://php.net/smtp-port smtp_port = 25 – Goaler444 Nov 12 '12 at 15:01
  • Thats all that is mentioned about SMTP in my ini file – Goaler444 Nov 12 '12 at 15:01
  • Have you tried to telnet to see if you can even connect to the SMTP server? Once in telnet `open smtp.gmail.com 465` you should get some type of response. I tried and can connect via port 25 but not 465. Port 587 also works. – Pitchinnate Nov 20 '12 at 20:56
  • @Pitchinnate u managed with my code so? – Goaler444 Nov 20 '12 at 21:09
  • @user1724140 not sure what you are asking? Did port 587 work for you? – Pitchinnate Nov 20 '12 at 21:25
  • @Pitchinnate To be honest, I have no idea why its not working... I tried code taken and compared from multiple sources; and I have thoroughly checked my php .ini file and configuration file... It just doesnt want to work for me – Goaler444 Nov 20 '12 at 21:31
  • @Pitchinnate and yes, port 587 doesnt work either – Goaler444 Nov 20 '12 at 21:32
  • 1
    Have you tested using telnet? To make sure you can connect without php. Just trying to narrow down the source of the problem. If you can connect to port 587 via telnet but not php then we know it is a php config issue. If you can't then it is a firewall issue or some other network issue. – Pitchinnate Nov 20 '12 at 21:33
  • Ok I managed to connect using Telnet. thx. So now we now its not a firewall issue right? – Goaler444 Nov 20 '12 at 21:44
  • 1
    Yeah if you were able to connect via telnet then it definitely is not a firewall issue. Now we just need to figure out what is preventing php from connecting on the same computer. – Pitchinnate Nov 21 '12 at 13:31

7 Answers7

21

Here is a working example:

<?php
function SendMail( $ToEmail, $MessageHTML, $MessageTEXT ) {
  require_once ( 'class.phpmailer.php' ); // Add the path as appropriate
  $Mail = new PHPMailer();
  $Mail->IsSMTP(); // Use SMTP
  $Mail->Host        = "smtp.gmail.com"; // Sets SMTP server
  $Mail->SMTPDebug   = 2; // 2 to enable SMTP debug information
  $Mail->SMTPAuth    = TRUE; // enable SMTP authentication
  $Mail->SMTPSecure  = "tls"; //Secure conection
  $Mail->Port        = 587; // set the SMTP port
  $Mail->Username    = 'MyGmail@gmail.com'; // SMTP account username
  $Mail->Password    = 'MyGmailPassword'; // SMTP account password
  $Mail->Priority    = 1; // Highest priority - Email priority (1 = High, 3 = Normal, 5 = low)
  $Mail->CharSet     = 'UTF-8';
  $Mail->Encoding    = '8bit';
  $Mail->Subject     = 'Test Email Using Gmail';
  $Mail->ContentType = 'text/html; charset=utf-8\r\n';
  $Mail->From        = 'MyGmail@gmail.com';
  $Mail->FromName    = 'GMail Test';
  $Mail->WordWrap    = 900; // RFC 2822 Compliant for Max 998 characters per line

  $Mail->AddAddress( $ToEmail ); // To:
  $Mail->isHTML( TRUE );
  $Mail->Body    = $MessageHTML;
  $Mail->AltBody = $MessageTEXT;
  $Mail->Send();
  $Mail->SmtpClose();

  if ( $Mail->IsError() ) { // ADDED - This error checking was missing
    return FALSE;
  }
  else {
    return TRUE;
  }
}

$ToEmail = 'Name@example.com';
$ToName  = 'Name';

$Send = SendMail( $ToEmail, $MessageHTML, $MessageTEXT );
if ( $Send ) {
  echo "<h2> Sent OK</h2>";
}
else {
  echo "<h2> ERROR</h2>";
}
die;
?>

I tried this script and had no problem sending several messages.

UPDATED:

This is the typical response from Gmail on success:

SMTP -> FROM SERVER:220 mx.google.com ESMTP 20sm6345523qek.6
SMTP -> FROM SERVER: 250-mx.google.com at your service, [181.155.13.39]
                     250-SIZE 35882577
                     250-8BITMIME
                     250-STARTTLS
                     250 ENHANCEDSTATUSCODES
SMTP -> FROM SERVER:220 2.0.0 Ready to start TLS
SMTP -> FROM SERVER: 250-mx.google.com at your service, [181.155.13.39]
                     250-SIZE 35882577
                     250-8BITMIME
                     250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
                     250 ENHANCEDSTATUSCODES
SMTP -> FROM SERVER:250 2.1.0 OK 20sm6345523qek.6
SMTP -> FROM SERVER:250 2.1.5 OK 20sm6345523qek.6
SMTP -> FROM SERVER:354 Go ahead 20sm6345523qek.6
SMTP -> FROM SERVER:250 2.0.0 OK 1353474062 20sm6345523qek.6
SMTP -> FROM SERVER:221 2.0.0 closing connection 20sm6345523qek.6
Deltik
  • 1,129
  • 7
  • 32
Felipe Alameda A
  • 11,791
  • 3
  • 29
  • 37
  • Thanks, ill be trying it out – Goaler444 Nov 20 '12 at 11:18
  • Unfortunately it did not work, I think now I am convinced its not a bug error.. I got this :Warning: stream_socket_enable_crypto(): this stream does not support SSL/crypto. I am sure I have open_ssl enabled I checked it and restarted me server a number of times. Thanks for your help but – Goaler444 Nov 20 '12 at 21:08
  • Also prior to that it told me SMTP -> FROM SERVER:220 2.0.0 Ready to start TLS (I think thats a good thing but) – Goaler444 Nov 20 '12 at 21:10
  • Well, the mesage is quite different from the "Time out" error you had initially. It means communication with server is achieved. Getting close, I guess. On the other hand, is NOT SSL, is TLS. They are different, hence the port 587. SSL is supported at port 465. If you want to use SSL, modified the port and replace "tls' with 'ssl'. I have never tried it with Gmail, though. – Felipe Alameda A Nov 21 '12 at 00:08
  • Yes, the example is how I did it. – Felipe Alameda A Nov 21 '12 at 00:37
  • I edited the answer to add the error checking at the end of the function, which I missed when I pasted the code, and to add one of results I got with the script of the example. – Felipe Alameda A Nov 21 '12 at 05:32
  • Solved it, I didnt realise that my WAMP has a configuration file. Thx for your help. – Goaler444 Nov 21 '12 at 13:58
2

Your Code is not working because you did not set the SMTPSecure option to ssl which is required for gmail account

include_once "/lib/phpmailer/PHPMailer.class.php";
include_once "/lib/phpmailer/SMTP.class.php";
include_once "/lib/phpmailer/POP3.class.php";

$mail = new PHPMailer(true);
$mail->IsSMTP();

try {
    $mail->Host = "smtp.gmail.com"; 
    $mail->SMTPDebug = 2; 
    $mail->SMTPSecure = 'ssl'; //<----------------- You missed this 
    $mail->SMTPAuth = true; 
    $mail->Host = "smtp.gmail.com"; 
    $mail->Port = 465; // 
    $mail->Username = "xxxxxx@gmail.com";
    $mail->Password = "xxxxxx";
    $mail->AddAddress('to@example.com', 'John Doe');
    $mail->SetFrom('xxxxxx@gmail.com', 'First Last');
    $mail->Subject = 'This is a TEST message';
    $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';
    $body = "To view the message, please use an HTML compatible email viewer!"; // automatically
    $mail->MsgHTML($body);
    $mail->Send();
    echo "Message Sent OK</p>\n";
} catch ( phpmailerException $e ) {
    echo $e->errorMessage(); 
} catch ( Exception $e ) {
    echo $e->getMessage(); 
}

Output

SMTP -> FROM SERVER:220 mx.google.com ESMTP q22sm2927759bkv.16 
SMTP -> FROM SERVER: 250-mx.google.com at your service, [62.173.54.190] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 250 ENHANCEDSTATUSCODES 
SMTP -> FROM SERVER:250 2.1.0 OK q22sm2927759bkv.16 
SMTP -> FROM SERVER:250 2.1.5 OK q22sm2927759bkv.16 
SMTP -> FROM SERVER:354 Go ahead q22sm2927759bkv.16 
SMTP -> FROM SERVER:250 2.0.0 OK 1353341553 q22sm2927759bkv.16 
Message Sent OK
Baba
  • 94,024
  • 28
  • 166
  • 217
1

In such kinds of issues it is important to check how it runs on development environment before you deploy to production, since there are many server issues that might be related to the problem.

Because of that before anything set debug to true and check the messages you get.

$mail->SMTPDebug = 1;

That said, common server issues in such situations are the following.

  1. Lack of SSL support in PHP. You must enable it.

  2. Some kind of firewall might be blocking you from connecting to outbound sockets. You can check that using PHP.

-

$p = fsockopen( '127.0.0.1', <port number>, $errno, $errstr, 5 );
if ( !$p )
    // port is closed or blocked
else
    // port is open and available
    fclose( $p );`
inigomedina
  • 1,791
  • 14
  • 21
  • Firstly, thanks for your reply. I have added the SMTPDebug flag already and the message in which it returns can be seen in my question in the edit section. How do I check if ssl is enabled? I am using easyphp as a WAMP for development if that is of any help – Goaler444 Nov 14 '12 at 21:51
  • Also in your program what should be the value of port number? 465? – Goaler444 Nov 14 '12 at 22:03
  • 1
    @user1724140 For enabling SSL on PHP you should have uncommented the following directive on `php.ini`: `extension=php_openssl.dll`. You can set that directly or look at WAMP documentation. – inigomedina Nov 14 '12 at 22:38
  • Solved it, I didnt realize that my WAMP has a configuration file too, as I only edited my php.ini (I feel like an idiot atm haha). Thanks for your everyone's help. I appreciate it. – Goaler444 Nov 21 '12 at 13:59
  • @user1724140 Opla! Configuration files are always a source of issues. :/ – inigomedina Nov 21 '12 at 14:39
  • Another issue I wanted to add is the account locking before getting the settings right. I didn't realize I was using the wrong encryption, then changed it, still didn't work, so I ended up here. Turns out everything was fine after the encryption change but I had already failed enough attempts that the account got locked. Silly, but definitely something to watch out for while working on such things. Hopeful this'll save someone some head banging (not the metal kind). – NekoKikoushi Jul 16 '20 at 21:31
0

Try...

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

$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "smtp.gmail.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->Host       = "smtp.gmail.com"; // sets the SMTP server
  $mail->Port       = 465;                    // set the SMTP port for the GMAIL server
  $mail->Username   = "yourname@yourdomain"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'This is a TEST Message';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML($obdy);
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK</p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
?>

Just replace with your configuration, set the require_once('class.phpmailer.php'); to point to the right place and replace 'contents.html' your HTML template.

or

Use this code if you choose not to use an HTML template...

<?php

$body ='Your HTML message should go here';

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

$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "smtp.gmail.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->Host       = "smtp.gmail.com"; // sets the SMTP server
  $mail->Port       = 465;                    // set the SMTP port for the GMAIL server
  $mail->Username   = "yourname@yourdomain"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'This is a TEST message';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML($body);
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK</p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
?>
Matzo
  • 94
  • 4
  • I've updated the code above so instead of `$mail->Port = 26` it contains the correct GMil settings `$mail->Port = 465`. I've also inserted the correct SMTP settings. – Matzo Nov 13 '12 at 11:54
  • Did you run this code, does it work for you? Its not working for me =/ – Goaler444 Nov 13 '12 at 16:38
0
$mail = new PHPMailer();

                // Set up SMTP
                $mail->IsSMTP();                // Sets up a SMTP connection
                $mail->SMTPDebug  = 0;          // This will print debugging info
                $mail->SMTPAuth = true;         // Connection with the SMTP does require authorization
                $mail->SMTPSecure = "tls";      // Connect using a TLS connection
                $mail->Host = "smtp.gmail.com";
                $mail->Port = 587;
                $mail->Encoding = '7bit';       // SMS uses 7-bit encoding
                $mail->IsHTML(true);            // Set email format to HTML

                // Authentication
                $mail->Username   = "xxx@xxx.xxx.xx"; // Login
                $mail->Password   = "xxxxxx"; // Password

                //$to=
                $to = "zzz@zzz.zzz.zz";
                $mail->Subject = "Outstanding Balance Notification ";     // Subject (which isn't required)
                $mail->Body =  "Dear Sir / Madam";
                $mail->FromName = "stackoverflow";
                $mail->From = "noreply@xxx.xxx.xx";

                $mail->AddAddress($row["Email1"]);

try this.. :)

0

I have send mail from xampp server from localhost

This code is perfectly work for me

1: down load phpmailer from https://github.com/PHPMailer/PHPMailer

2: go to xampp and search php.ini

3 In php.ini search

;extension=php_openssl.dll    
 remove(;)       
 extension=php_openssl.dll 

then save and restart p.c. its work

<%php <br/>
require_once("C:\\xampp\\phpMailer\\PHPMailer-master\\class.phpmailer.php"); <br/>

$mail = new PHPMailer(); <br/>
$mail->IsSMTP();  // telling the class to use SMTP    <br/>
$mail->SMTPAuth = true;         // Enable SMTP authentication  <br/>
$mail->SMTPSecure = 'ssl' ;   <br/>
$mail->Host    = "smtp.gmail.com" ;// SMTP server <br/>
$mail->Port = 465; // or 587   <br/>

$mail->Username = 'senderemailid@gmail.com';    // SMTP username <br/>
$mail->Password = 'senderpassword';     // SMTP password   <br/>

$mail -> IsHTML(true);  <br/>
$mail->From    = 'senderemailid@gmail.com'; <br/>
$mail->FromName = 'sendername';   <br/>
$mail->addAddress('receiveremailid@domain.com','receivername');  <br/>

$mail->WordWrap = 50;  <br/>

$mail->Subject  = "This mail send from  PhP code xampp"; <br/>
$mail->Body     = "Hi! \n\n This is my first e-mail sent through PHPMailer."; <br/>

if(!$mail->Send()) {   <br/>
echo 'Message was not sent.';   <br/>
echo 'Mailer error: ' . $mail->ErrorInfo;  <br/>

} else    <br/>
 {   <br/>
echo 'Message has been sent.';  <br/>
}  <br/>
?>  <br/>
Synchro
  • 35,538
  • 15
  • 81
  • 104
0

2019 Update phpMailer with Gmail

I know this is an old question but it still comes up in Google and I need to update the answer to this.

If you are experience the issue (where many do) with phpmailer that it only works when you comment out IsSMTP() when trying to use gmail's SMTP then here is why.

When you comment out IsSMTP() you are telling phpmailer NOT TO USE SMTP which by default phpmailer will send the request to your local mail() instead. If you look at the emails sent at this point and look at the header of the email you will see that it is coming from your local server and not the address/domain you are trying to send it as. So yes commenting out IsSMTP() will make it work, but it really isn't. And sending from your local server that is not setup correctly will most likely result in your emails going to spam.

So how do I fix this

Plain and simple you most likely are using an old version of phpmailer, you need a newer version. The easy way to tell this is how you set your From address. If it looks like this $mail->From = "name@example.com" then you are using an old version.

The newest versions of phpmailer defines From as $mail->setFrom("name@example.com", "First Last"). If you see that then you are using a newer version of phpmailer.

How to do it right and actually make it work

  1. Please make sure that you have TCP OUT port for 587 on your firewall

  2. SMTP Gmail will only work with tls/587 AND NOT ssl/465 (ssl is 1990's)

  3. Make sure that you have allow less secure apps set correctly within gmail. If you are using a G Suite account then you will have to have your admin enable it if it isn't already.

  4. This is a perfect example how to use the new phpmailer with gmail smtp (and yes it does work, if not then something is wrong on your end)

How to install phpmailer

First download the latest version of phpmailer

There are 2 ways to install it. Composer or manual. The manual way all you need is

use PHPMailer\PHPMailer\PHPMailer; <-- make sure these are not in a function
use PHPMailer\PHPMailer\Exception;

require 'path/src/Exception.php';
require 'path/src/PHPMailer.php';
require 'path/src/SMTP.php';

EXAMPLE

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 * This uses traditional id & password authentication - look at the gmail_xoauth.phps
 * example to see how to use XOAUTH2.
 * The IMAP section shows how to save this message to the 'Sent Mail' folder using IMAP commands.
 */

//Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/src/Exception.php';
require 'path/src/PHPMailer.php';
require 'path/src/SMTP.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;

//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'), __DIR__);

//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!";
    //Section 2: IMAP
    //Uncomment these to save your message in the 'Sent Mail' folder.
    #if (save_mail($mail)) {
    #    echo "Message saved!";
    #}
}

//Section 2: IMAP
//IMAP commands requires the PHP IMAP Extension, found at: https://php.net/manual/en/imap.setup.php
//Function to call which uses the PHP imap_*() functions to save messages: https://php.net/manual/en/book.imap.php
//You can use imap_getmailboxes($imapStream, '/imap/ssl') to get a list of available folders or labels, this can
//be useful if you are trying to get this working on a non-Gmail IMAP server.
function save_mail($mail)
{
    //You can change 'Sent Mail' to any other folder or tag
    $path = "{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail";

    //Tell your server to open an IMAP connection using the same username and password as you used for SMTP
    $imapStream = imap_open($path, $mail->Username, $mail->Password);

    $result = imap_append($imapStream, $path, $mail->getSentMIMEMessage());
    imap_close($imapStream);

    return $result;
}
?>
Cesar Bielich
  • 4,754
  • 9
  • 39
  • 81