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.

PHPMailer可能是最受欢迎的用于发送电子邮件的开源PHP库。 它于2001年首次发布,此后,它成为PHP开发人员最喜欢的以编程方式发送电子邮件的方法,除了其他一些喜欢的邮件(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.


This popular article was updated in 2020 to offer the most up-to-date instructions for working with PHPMailer.


它是PHP的mail()函数的替代方法吗? (Is It an Alternative to PHP’s mail() Function?)

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

在大多数情况下,它是PHP的mail()函数的替代方法,但是在许多其他情况下, mail()函数根本不够灵活,无法实现所需的功能。

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.

首先,PHPMailer提供了一个面向对象的接口,而mail()不是面向对象的。 PHP开发人员通常讨厌在使用mail()函数发送电子邮件时创建$headers字符串,因为它们需要大量转义。 PHPMailer使这变得轻而易举。 开发人员还需要编写肮脏的代码(转义字符,编码和格式),以便在使用mail()函数时发送附件和基于HTML的电子邮件,而PHPMailer则使此工作变得轻而易举。

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.

此外, mail()函数需要本地邮件服务器发送电子邮件,这并不总是很容易设置的。 如果您具有身份验证,PHPMailer可以使用非本地邮件服务器(SMTP)。

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.


安装PHPMailer (Installing PHPMailer)

You can install PHPMailer using Composer:


composer require phpmailer/phpmailer

使用PHPMailer从本地Web服务器发送电子邮件 (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:


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 = "";
$mail->FromName = "Full Name";

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

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

//CC and BCC

//Send HTML or Plain Text email

$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 {
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;

The code and comments should be sufficiently clear to explain everything that’s going on.


发送带有附件的电子邮件 (Sending an Email with Attachments)

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


use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer;

$mail->From = "";
$mail->FromName = "Full Name";

$mail->addAddress("", "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->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    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.

在这里,我们将附加两个文件file.txtimages/profile.png ,该文件与脚本位于同一目录,而images/profile.png则位于脚本目录的images目录中。

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.

要将附件添加到电子邮件中,我们只需要通过传递文件路径作为参数来调用PHPMailer对象的addAttachment函数。 要附加多个文件,我们需要多次调用它。

故障排除 (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.

在我们的两个示例中,我们使用PHPMailer的Exception类进行调试,因此抛出的任何错误将有助于我们调试可能发生的任何问题。 我们还为PHPMailer构造函数添加了true参数,以输出更高级别,更具描述性的异常。

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:



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:

通常,邮件功能的问题与缺少的邮件服务器设置有关,在这种情况下, error_get_last函数将返回如下内容:

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:



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


使用SMTP (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.

您可以使用其他主机的邮件服务器发送电子邮件,但是为此,您首先需要进行身份验证。 例如,要从Gmail的邮件服务器发送电子邮件,您需要具有一个Gmail帐户。

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.

SMTP是邮件客户端用来将电子邮件发送请求发送到邮件服务器的协议。 邮件服务器验证电子邮件后,会将其发送到目标邮件服务器。

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

这是从您的域的Gmail邮件服务器发送电子邮件的示例。 您不需要本地邮件服务器即可运行代码。 我们将使用SMTP协议:

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.
//Set SMTP host name                          
$mail->Host = "";
//Set this to true if SMTP host requires authentication to send email
$mail->SMTPAuth = true;                          
//Provide username and password     
$mail->Username = "";                 
$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 = "";
$mail->FromName = "Full Name";

$mail->addAddress("", "Recepient Name");


$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 {
    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.

Gmail需要通过SMTP进行TLS加密,因此我们进行了相应的设置。 通过SMTP发送之前,需要找出主机名,端口号,加密类型(如果需要),如果需要身份验证,则还需要用户名和密码。 请注意,在Gmail上启用了双重身份验证后,您将无法通过用户名/密码使用其SMTP。 相反,将需要其他配置

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 with the from address to, 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 and yet it presents itself as if coming from Although you own, there’s no way for Yahoo to find that out.

在使用远程SMTP在本地邮件的一大好处是,如果你使用PHP的mail()函数来发送电子邮件from地址域设置为本地域名(服务器名),则收件人的邮件服务器的攻击其他任何过滤器会将其标记为垃圾邮件。 例如,如果你从实际的主机名称的服务器发送电子邮件example.comfrom地址 ,那么雅虎的服务器将其标记为垃圾邮件或显示一条消息给用户不之所以信任电子邮件,是因为该邮件的来源是 ,但其自身却好像来自 。 尽管您拥有 ,但Yahoo无法找到

使用POP3检索电子邮件 (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.

PHPMailer还允许SMTP之前的POP验证发送电子邮件。 换句话说,您可以使用POP进行身份验证并使用SMTP发送电子邮件。 遗憾的是,PHPMailer不支持使用POP3协议从邮件服务器检索电子邮件。 仅限于发送电子邮件。

结论 (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.

如果您是PHP开发人员,那么几乎不必避免以编程方式发送电子邮件。 尽管您可以选择使用Mandrill或SendGrid之类的第三方服务,但有时这不是一个选择,而滚动自己的电子邮件发送库的可能性甚至更低。 那就是PHPMailer及其替代品(Zend Mail,Swift Mailer等)出现的地方。

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.

您是否对PHP库依赖感到困惑? 观看我们的截屏视频 ,了解Composer如何帮助您进行管理。



  • 0
  • 1
    觉得还不错? 一键收藏
  • 0


  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助




当前余额3.43前往充值 >
领取后你会自动成为博主和红包主的粉丝 规则
钱包余额 0