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 服务器发送电子邮件的最简单示例:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once "vendor/autoload.php"; //PHPMailer对象 $mail = new PHPMailer(true); //构造函数中的参数 true 启用异常 //来自电子邮件地址和姓名 $mail->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 = "<i>HTML 格式的邮件正文</i>"; $mail->AltBody = "这是电子邮件内容的纯文本版本"; try { $mail->send(); echo "消息发送成功"; } catch (Exception $e) { echo "邮件错误:" . $mail->ErrorInfo; }
PHP 文件中的代码和注释应该足够清晰,能够解释所发生的一切;您可以看到我们在哪里设置邮件主题、发件人电子邮件地址、收件人电子邮件地址、HTML 邮件正文以及处理错误。
发送带有附件的电子邮件
以下是如何使用 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"); //提供文件路径和附件名称 $mail->addAttachment("file.txt", "File.txt"); $mail->addAttachment("images/profile.png"); //文件名可选 $mail->isHTML(true); $mail->Subject = "主题文本"; $mail->Body = "<i>HTML 格式的邮件正文</i>"; $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 \vendor\phpmailer\phpmailer\src\PHPMailer.php [line] => 863 )
这是我们最常遇到的问题,使用 SMTP 就可以轻松解决。
显示本地化错误消息
$mail->ErrorInfo可以返回 43 种不同语言的错误消息。
要以不同的语言显示错误消息,请将language目录从 PHPMailer 的源代码复制到项目目录。
例如,要以俄语返回错误消息,请使用以下方法调用将 PHPMailer 对象设置为俄语:
$mail->setLanguage("ru");
您还可以将自己的语言文件添加到该language目录中。
使用 SMTP
您可以使用其他主机的邮件服务器发送电子邮件,但为此您首先需要进行身份验证。例如,要从 Gmail 的邮件服务器发送电子邮件,您需要拥有 Gmail 帐户。
SMTP 是邮件客户端用来向邮件服务器发送电子邮件发送请求的协议。邮件服务器验证电子邮件后,会将其发送到目标邮件服务器。
以下是从您所在域的 Gmail 邮件服务器发送电子邮件的示例。您不需要本地服务器来运行代码。我们将使用 SMTP 协议:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; require_once "vendor/autoload.php"; $mail = new PHPMailer(true); //启用SMTP调试。 $mail->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 = "<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 需要通过 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文章来源:https://www.toymoban.com/diary/php/401.html
官方文档:http://phpmailer.github.io/PHPMailer/文章来源地址https://www.toymoban.com/diary/php/401.html
到此这篇关于php实现发送电子邮件功能,使用PHPMailer的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!