Sending Emails in PHP with PHPMailer

Share this article

Sending Emails in PHP with PHPMailer

PHPMailer is perhaps the most popular open-source PHP library to send emails with. It was first released way back in 2001, and since then it has become a PHP developer’s favorite way of sending emails programmatically, aside from a few other fan favorites like Swiftmailer.

In this article, we’ll talk about why you should use PHPMailer instead of PHP’s mail() function, and we’ll show some code samples on how to use this library.

PHP & MySQL: Novice to Ninja

Key Takeaways

  • PHPMailer is a popular open-source PHP library for sending emails, offering more flexibility and features than PHP’s built-in mail() function, including an object-oriented interface, easier handling of HTML and attachments, and the ability to use non-local mail servers.
  • PHPMailer can be installed using Composer and is used by popular PHP content management systems such as WordPress, Drupal, and Joomla.
  • The library provides robust error handling, with the ability to print error messages in over 40 languages, and integrated SMTP protocol support and authentication over SSL and TLS.
  • Beyond sending emails, PHPMailer supports adding attachments, sending HTML or plain text versions of emails, and using SMTP to send emails from non-local servers, although it does not support retrieving emails from mail servers using the POP3 protocol.

Is PHPMailer an Alternative to PHP’s mail() Function?

In most cases, PHPMailer is simply an alternative to the built-in PHP mail() function, but there are many other cases where the mail() function is simply not flexible enough to achieve what you need.

First of all, PHPMailer provides an object-oriented interface, whereas mail() is not object oriented. PHP developers generally hate to create $headers strings while sending emails using the mail() function because they require a lot of escaping. PHPMailer makes this a breeze. Developers also need to write dirty code (escaping characters, encoding and formatting) to send attachments and HTML based emails when using the mail() function, whereas PHPMailer makes this painless.

Also, the mail() function requires a local mail server to send out emails, which is not always trivial to set up. PHPMailer can use a non-local mail server (SMTP) if you have authentication.

Further advantages include:

  • It can print various kinds of error messages in more than 40 languages when it fails to send an email.
  • It has integrated SMTP protocol support and authentication over SSL and TLS.
  • It can send an alternative plain-text version of email for non-HTML email clients.
  • It has a very active developer community that keeps it secure and up to date.

PHPMailer is also used by popular PHP content management systems like WordPress, Drupal, and Joomla.

Installing PHPMailer

You can install PHPMailer using Composer:

composer require phpmailer/phpmailer

Sending Email from a Local Web Server Using PHPMailer

Here’s the simplest example of sending an email from a local web server using PHPMailer:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

//PHPMailer Object
$mail = new PHPMailer(true); //Argument true in constructor enables exceptions

//From email address and name
$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

//To address and name
$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); //Recipient name is optional

//Address to which recipient will reply
$mail->addReplyTo("reply@yourdomain.com", "Reply");

//CC and BCC
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");

//Send HTML or Plain Text email
$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

The code and comments in the PHP file should be sufficiently clear to explain everything that’s going on; you can see where we set the message subject, sender’s email address, recipient’s email address, HTML message body, and handle errors.

Sending an Email with Attachments

Here’s an example of how to send an email with attachments using PHPMailer:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer;

$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

$mail->addAddress("recipient1@example.com", "Recipient Name");

//Provide file path and name of the attachments
$mail->addAttachment("file.txt", "File.txt");        
$mail->addAttachment("images/profile.png"); //Filename is optional

$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

Here, we’re attaching two files — file.txt, which resides in the same directory as the script, and images/profile.png, which resides in images directory of the script directory.

To add attachments to the email, we just need to call the function addAttachment of the PHPMailer object by passing the file path as argument. For attaching multiple files, we need to call it multiple times.

Troubleshooting

In our two examples, we used PHPMailer’s Exception class for debugging, so any errors thrown will help us debug any issues that may occur. We also added the argument true to PHPMailer constructor, to output higher-level, more descriptive exceptions.

Depending on the system we use, probably the most frequent error we’ll see will be related to running the mail() function in the background:

Mailer Error: Could not instantiate mail function.

If we need more details on the error, we can also add something like this to the catch clause:

print_r(error_get_last());

Usually, the problem with the mail function will be related to the missing mail server setup, in which case the error_get_last function will return something like this:

Array (
    [type] => 2
    [message] => mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
    [file] => OUR_PATH \vendor\phpmailer\phpmailer\src\PHPMailer.php
    [line] => 863
)

This is the issue we’ll probably encounter most frequently, and we can solve it easily by using SMTP.

Displaying Localized Error Messages

$mail->ErrorInfo can return error messages in 43 different languages.

To display error messages in a different language, copy the language directory from PHPMailer’s source code to the project directory.

To return error messages in Russian, for example, set the PHPMailer object to the Russian language using the below method call:

$mail->setLanguage("ru");

You can also add your own language files to the language directory.

Using SMTP

You can use the mail server of an another host to send email, but for this you first need to have authentication. For example, to send an email from Gmail’s mail server, you need to have a Gmail account.

SMTP is a protocol used by mail clients to send an email send request to a mail server. Once the mail server verifies the email, it sends it to the destination mail server.

Here’s an example of sending an email from Gmail’s mail server from your domain. You don’t need a local server to run the code. We’ll be using the SMTP protocol:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer(true);

//Enable SMTP debugging.
$mail->SMTPDebug = 3;                               
//Set PHPMailer to use SMTP.
$mail->isSMTP();            
//Set SMTP host name                          
$mail->Host = "smtp.gmail.com";
//Set this to true if SMTP host requires authentication to send email
$mail->SMTPAuth = true;                          
//Provide username and password     
$mail->Username = "name@gmail.com";                 
$mail->Password = "super_secret_password";                           
//If SMTP requires TLS encryption then set it
$mail->SMTPSecure = "tls";                           
//Set TCP port to connect to
$mail->Port = 587;                                   

$mail->From = "name@gmail.com";
$mail->FromName = "Full Name";

$mail->addAddress("name@example.com", "Recepient Name");

$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

Gmail requires TLS encryption over SMTP, so we set it accordingly. Before you send via SMTP, you need to find out the host name, port number, encryption type if required and if authentication is required you also need the username and password. Note that having two-factor authentication enabled on Gmail won’t let you use their SMTP with username/password. Instead, additional configuration will be required.

One big advantage in using remote SMTP over local mail is that if you use PHP’s mail() function to send email with the from address domain set to anything other than the local domain name (name of the server), then the recipient’s email server’s attack filters will mark it as spam. For example, if you send an email from a server with actual host name example.com with the from address name@gmail.com to name@yahoo.com, then Yahoo’s servers will mark it as spam or display a message to the user not to trust the email because the mail’s origin is example.com and yet it presents itself as if coming from gmail.com. Although you own name@gmail.com, there’s no way for Yahoo to find that out.

Retrieving Emails using POP3

PHPMailer also allows POP-before-SMTP verification to send emails. In other words, you can authenticate using POP and send email using SMTP. Sadly, PHPMailer doesn’t support retrieving emails from mail servers using the POP3 protocol. It’s limited to only sending emails.

Conclusion

If you’re a PHP developer, there’s little chance of avoiding having to send emails programmatically. While you may opt for third-party services like Mandrill or SendGrid, sometimes that just isn’t an option, and rolling your own email sending library even less so. That’s where PHPMailer and its alternatives (Zend Mail, Swift Mailer, and so on) come in.

You can learn about this library’s APIs in the repository wiki, or in the official documentation.

Are you getting bogged down with PHP library dependencies? Watch our screencast and learn about how Composer can help you manage this for you.

FAQs About PHPmailer

What is PHPMailer?

PHPMailer is a popular open-source PHP library used for sending email messages from a PHP application. It provides a simple and flexible way to send emails via SMTP, mail(), or other email sending methods.

How do I install PHPMailer?

You can install PHPMailer using Composer or by downloading the library directly from GitHub. Detailed installation instructions can be found in the PHPMailer documentation.

Is PHPMailer free to use?

Yes, PHPMailer is open-source and released under the LGPL license, which means it is free to use in both open-source and commercial projects.

What are the system requirements for PHPMailer?

PHPMailer is compatible with PHP 5.5 and later versions. Ensure that your web hosting environment supports these PHP versions.

How can I send an email using PHPMailer?

You can send an email with PHPMailer by creating an instance of the PHPMailer class, setting the necessary properties like the SMTP server details and email content, and then calling the send() method.

Can PHPMailer handle attachments in emails?

Yes, PHPMailer provides methods to add attachments to your email messages. You can attach files from your server or from remote locations.

What is SMTP and why should I use it with PHPMailer?

SMTP (Simple Mail Transfer Protocol) is a common method for sending email messages. Using SMTP with PHPMailer allows you to send emails through a remote email server, providing better control and reliability for email delivery.

Can I send HTML emails with PHPmailer?

Yes, PHPMailer allows you to send both plain text and HTML-formatted emails. You can set the message type and format accordingly. Plain text emails will work with non-HTML mail clients.

Can I send plain text emails to non-HTML mail clients with PHPmailer?

Yes, PHPMailer allows you to send both plain text emails as an alternative to HTML emails. You can set the message type and format accordingly. Plain text emails will work with non-HTML mail clients.

Can I use PHPMailer with non-SMTP mail servers like Sendmail?

Yes, PHPMailer supports various email transport methods, including SMTP, mail(), and other custom methods, allowing you to use it with different types of mail servers.

Narayan PrustyNarayan Prusty
View Author

Narayan is a web astronaut. He is the founder of QNimate. He loves teaching. He loves to share ideas. When not coding he enjoys playing football. You will often find him at QScutter classes.

Tonino JankovTonino Jankov
View Author

Tonino is a web developer and IT consultant who's dived through open-source code for over a decade. He's also a crypto enthusiast, Linux fan, and moderate libertarian.

BrunoSemailgitCSgmailOOPHPPHPphpmailerpop3smtpswiftmailer
Share this article
Read Next
Get the freshest news and resources for developers, designers and digital creators in your inbox each week