php实现发送电子邮件功能,使用PHPMailer

11,239次阅读
没有评论

共计 935 个字符,预计需要花费 3 分钟才能阅读完成。

PHPMailer 可能是最流行的用于发送电子邮件的开源 PHP 库。它于 2001 年首次发布,从那时起,除了 Swiftmailer 等还有一部分人喜欢使用之外,PHPMailer 已成为 PHP 开发人员最喜欢的发送电子邮件的方式的 php 库。

在本文中,也顺便讨论以下为什么应该使用 PHPMailer 而不是 PHP 的 mail() 函数,并且我们将展示一些有关如何使用该库的代码示例。

PHPMailer 是 PHP mail() 函数的替代品吗?

在大多数情况下,PHPMailer 只是内置 PHP mail() 函数的替代品,但在许多其他情况下,该 mail() 函数根本不够灵活,无法实现您所需要的功能。

首先,PHPMailer 提供了面向对象的接口,而 PHPMailermail() 并不是面向对象的。$headersPHP 开发人员通常讨厌在使用该函数发送电子邮件时创建字符串 mail(),因为它们需要大量转义。PHPMailer 使这变得轻而易举。开发人员在使用该功能时还需要编写脏代码(转义字符、编码和格式)来发送附件和基于 HTML 的电子邮件 mail(),而 PHPMailer 使这一切变得轻松。

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

其他优点包括:

  • 当发送电子邮件失败时,它可以打印 40 多种语言的各种错误消息。

  • 它集成了 SMTP 协议支持以及基于 SSL 和 TLS 的身份验证。

  • 它可以为非 HTML 电子邮件客户端发送替代的纯文本版本的电子邮件。

  • 它有一个非常活跃的开发者社区,可以保证其安全和最新。

PHPMailer 还被流行的 PHP 内容管理系统(例如 WordPress、Drupal 和 Joomla)使用。

安装 PHPMailer

您可以使用 Composer 安装 PHPMailer:

composer require phpmailer/phpmailer

如果你没有 composer 可以通过以下链接直接下载源代码使用:

https://github.com/PHPMailer/PHPMailer

使用 PHPMailer 从本地 Web 服务器发送电子邮件

下面是使用 PHPMailer 从本地 Web 服务器发送电子邮件的最简单示例:

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

// 地址和姓名
$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); //Recipient name is optional

// 收件人要回复的地址
$mail->addReplyTo("reply@yourdomain.com", "Reply");

// 抄送和密件抄送
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");

// 发送 HTML 或纯文本电子邮件
$mail->isHTML(true);

$mail->Subject = "主题文本";
$mail->Body = "HTML 格式的邮件正文 ";
$mail->AltBody = "这是电子邮件内容的纯文本版本";

try {$mail->send();
    echo "消息发送成功";
} catch (Exception $e) {echo "邮件错误:" . $mail->ErrorInfo;
}

PHP 文件中的代码和注释应该足够清晰,能够解释所发生的一切;您可以看到我们在哪里设置邮件主题、发件人电子邮件地址、收件人电子邮件地址、HTML 邮件正文以及处理错误。

发送带有附件的电子邮件

以下是如何使用 PHPMailer 发送带有附件的电子邮件的示例:

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

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

// 提供文件路径和附件名称
$mail->addAttachment("file.txt", "File.txt");        
$mail->addAttachment("images/profile.png"); // 文件名可选

$mail->isHTML(true);

$mail->Subject = "主题文本";
$mail->Body = "HTML 格式的邮件正文 ";
$mail->AltBody = "这是电子邮件内容的纯文本版本";

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

在这里,我们附加两个文件 – file.txt,它位于与脚本相同的目录中,以及 images/profile.png,它位于 images 脚本目录的目录中。

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

故障排除

在我们的两个示例中,我们使用 PHPMailer 的 Exception 类进行调试 (https://github.com/PHPMailer/PHPMailer/blob/master/src/Exception.php),因此抛出的任何错误都将帮助我们调试可能发生的任何问题。我们还在 PHPMailer 构造函数 true 中添加了参数 (https://github.com/PHPMailer/PHPMailer/blob/master/src/PHPMailer.php#L819),以输出更高级别、更具描述性的异常。

根据我们使用的系统,我们最常看到的错误可能与 mail() 在后台运行该函数有关:

邮件程序错误:无法实例化邮件功能。

如果我们需要有关错误的更多详细信息,我们还可以在 catch 子句中添加如下内容:

print_r(error_get_last());

通常,邮件功能的问题与缺少邮件服务器设置有关,在这种情况下,该 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 vendorphpmailerphpmailersrcPHPMailer.php
    [line] => 863
)

这是我们最常遇到的问题,使用 SMTP 就可以轻松解决。

显示本地化错误消息

$mail->ErrorInfo 可以返回 43 种不同语言的错误消息。

要以不同的语言显示错误消息,请将 language 目录从 PHPMailer 的源代码复制到项目目录。

例如,要以俄语返回错误消息,请使用以下方法调用将 PHPMailer 对象设置为俄语:

$mail->setLanguage("ru");

您还可以将自己的语言文件添加到该 language 目录中。

使用 SMTP

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

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

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

SMTPDebug = 3;                              
// 设置 PHPMailer 使用 SMTP。$mail->isSMTP();            
// 设置 SMTP 主机名                       
$mail->Host = "smtp.gmail.com";
// 如果 SMTP 主机需要身份验证才能发送电子邮件,则将此设置为
$mail->SMTPAuth = true;                          
// 提供用户名和密码 
$mail->Username = "name@gmail.com";                
$mail->Password = "super_secret_password";                          
// 如果 SMTP 需要 TLS 加密则设置它
$mail->SMTPSecure = "tls";                          
// 设置要连接的 TCP 端口
$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 = "Mail body in HTML";
$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 需要通过 SMTP 进行 TLS 加密,因此我们进行了相应的设置。在通过 SMTP 发送之前,您需要查明主机名、端口号、加密类型(如果需要),如果需要身份验证,您还需要用户名和密码。请注意,在 Gmail 上启用双因素身份验证将不允许您通过用户名 / 密码使用其 SMTP。相反,将需要额外的配置 (http://webapps.stackexchange.com/questions/31297/gmail-rejects-smtp-password-with-2-factor-authentication)

与本地邮件相比,使用远程 SMTP 的一大优势是,如果您使用 PHP 的 mail() 功能发送电子邮件,并将 from 地址域设置为本地域名(服务器名称)以外的任何内容,那么收件人的电子邮件服务器的攻击过滤器将对其进行标记作为垃圾邮件。例如,如果您从具有实际主机名 example.com 且 from 地址 name@gmail.com 为 的 name@yahoo.com 服务器发送一封电子邮件,则雅虎的服务器会将其标记为垃圾邮件或向用户显示一条消息,要求用户不要信任该电子邮件,因为该邮件的来源是,但 example.com 它本身却存在仿佛来自 gmail.com。尽管您拥有 name@gmail.com,但雅虎无法发现这一点。

使用 POP3 检索电子邮件

PHPMailer 还允许 POP-before-SMTP 验证来发送电子邮件 (http://en.wikipedia.org/wiki/POP_before_SMTP)。换句话说,您可以使用 POP 进行身份验证并使用 SMTP 发送电子邮件。遗憾的是,PHPMailer 不支持使用 POP3 协议从邮件服务器检索电子邮件。它仅限于发送电子邮件。

结论

如果您是一名 PHP 开发人员,那么几乎不可能避免以编程方式发送电子邮件。虽然您可能会选择 Mandrill 或 SendGrid 等第三方服务,但有时这并不是一个选择,而滚动您自己的电子邮件发送库则更是如此。这就是 PHPMailer 及其替代品(Zend Mail、Swift Mailer 等)的用武之地。

您可以在存储库 wiki 或官方文档中了解该库的 API。

  • 存储库 wiki:https://github.com/PHPMailer/PHPMailer/wiki

  • 官方文档:http://phpmailer.github.io/PHPMailer/ 文章来源地址 https://www.toymoban.com/diary/php/401.html

到此这篇关于 php 实现发送电子邮件功能, 使用 PHPMailer 的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/php/401.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计935字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)