许多 PHP 开发人员需要从他们的代码发送电子邮件。唯一直接支持此功能的 PHP 函数是mail()
。但是,它不为使用加密、身份验证、HTML 消息和附件等流行功能提供任何帮助。
正确设置电子邮件格式非常困难。有无数重叠(和冲突)的标准,需要严格遵守极其复杂的格式和编码规则——您在网上找到的绝大多数直接使用mail()
函数的代码即使不是不安全,也是完全错误的!
PHP mail()
函数通常通过本地邮件服务器发送,在 Linux、BSD 和 macOS 平台上通常以sendmail
二进制文件开头,但是 Windows 通常不包含本地邮件服务器; PHPMailer 的集成 SMTP 客户端允许在所有平台上发送电子邮件,而无需本地邮件服务器。但请注意,应尽可能避免使用mail()
函数;使用 SMTP 到本地主机既更快又更安全。
请不要尝试自己动手 - 如果您不使用 PHPMailer,那么在推出您自己的库之前,您应该先了解许多其他优秀的库。尝试 SwiftMailer 、 Laminas/Mail 、 ZetaComponents 等。
该软件根据 LGPL 2.1 许可证以及 GPL 合作承诺进行分发。请阅读许可证以获取有关软件可用性和分发的信息。
PHPMailer 可在 Packagist 上使用(使用语义版本控制),建议通过 Composer 安装 PHPMailer。只需将此行添加到您的composer.json
文件中:
"phpmailer/phpmailer" : " ^6.9.2 "
或运行
composer require phpmailer/phpmailer
注意vendor
文件夹和vendor/autoload.php
脚本是由Composer生成的;它们不是 PHPMailer 的一部分。
如果您想使用 XOAUTH2 身份验证,您还需要在您的composer.json
中添加对league/oauth2-client
和适当的服务适配器包的依赖项,或者查看 @decomplexity 的 SendOauth2 包装器,特别是如果您使用微软服务。
或者,如果您不使用 Composer,则可以将 PHPMailer 作为 zip 文件下载(请注意,zip 文件中不包含文档和示例),然后将 PHPMailer 文件夹的内容复制到中指定的include_path
目录之一您的 PHP 配置并手动加载每个类文件:
<?php
use PHPMailer PHPMailer PHPMailer ;
use PHPMailer PHPMailer Exception ;
require ' path/to/PHPMailer/src/Exception.php ' ;
require ' path/to/PHPMailer/src/PHPMailer.php ' ;
require ' path/to/PHPMailer/src/SMTP.php ' ;
如果您没有明确使用SMTP
类(您可能没有),则不需要 SMTP 类的use
行。即使您不使用异常,您仍然需要加载Exception
类,因为它是在内部使用的。
PHPMailer 5.2(与 PHP 5.0 - 7.0 兼容)不再受支持,即使是安全更新也是如此。您将在 5.2-stable 分支中找到最新版本的 5.2。如果您使用的是 PHP 5.5 或更高版本(您应该使用),请切换到 6.x 版本。
最大的变化是源文件现在位于src/
文件夹中,并且 PHPMailer 现在声明名称空间PHPMailerPHPMailer
。这有几个重要的影响 - 请阅读升级指南以获取更多详细信息。
虽然手动或使用 Composer 安装整个包简单、方便且可靠,但您可能只想在项目中包含重要文件。至少你需要 src/PHPMailer.php。如果您使用 SMTP,则需要 src/SMTP.php,如果您使用 POP-before SMTP(不太可能!),则需要 src/POP3.php。如果您不向用户显示错误并且可以解决仅英语错误,则可以跳过语言文件夹。如果您使用 XOAUTH2,您将需要 src/OAuth.php 以及您希望进行身份验证的服务的 Composer 依赖项。确实,使用 Composer 更容易!
<?php
//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailer PHPMailer PHPMailer ;
use PHPMailer PHPMailer SMTP ;
use PHPMailer PHPMailer Exception ;
//Load Composer's autoloader
require ' vendor/autoload.php ' ;
//Create an instance; passing `true` enables exceptions
$ mail = new PHPMailer ( true );
try {
//Server settings
$ mail -> SMTPDebug = SMTP :: DEBUG_SERVER ; //Enable verbose debug output
$ mail -> isSMTP (); //Send using SMTP
$ mail -> Host = ' smtp.example.com ' ; //Set the SMTP server to send through
$ mail -> SMTPAuth = true ; //Enable SMTP authentication
$ mail -> Username = ' [email protected] ' ; //SMTP username
$ mail -> Password = ' secret ' ; //SMTP password
$ mail -> SMTPSecure = PHPMailer:: ENCRYPTION_SMTPS ; //Enable implicit TLS encryption
$ mail -> Port = 465 ; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
//Recipients
$ mail -> setFrom ( ' [email protected] ' , ' Mailer ' );
$ mail -> addAddress ( ' [email protected] ' , ' Joe User ' ); //Add a recipient
$ mail -> addAddress ( ' [email protected] ' ); //Name is optional
$ mail -> addReplyTo ( ' [email protected] ' , ' Information ' );
$ mail -> addCC ( ' [email protected] ' );
$ mail -> addBCC ( ' [email protected] ' );
//Attachments
$ mail -> addAttachment ( ' /var/tmp/file.tar.gz ' ); //Add attachments
$ mail -> addAttachment ( ' /tmp/image.jpg ' , ' new.jpg ' ); //Optional name
//Content
$ mail -> isHTML ( true ); //Set email format to HTML
$ mail -> Subject = ' Here is the subject ' ;
$ mail -> Body = ' This is the HTML message body <b>in bold!</b> ' ;
$ mail -> AltBody = ' This is the body in plain text for non-HTML mail clients ' ;
$ mail -> send ();
echo ' Message has been sent ' ;
} catch ( Exception $ e ) {
echo " Message could not be sent. Mailer Error: { $ mail -> ErrorInfo }" ;
}
您会在示例文件夹中找到很多可以使用的内容,其中涵盖了许多常见场景,包括通过 Gmail 发送、构建联系表单、发送到邮件列表等等。
如果您重复使用该实例(例如,发送到邮件列表时),您可能需要清除收件人列表以避免发送重复的消息。请参阅邮件列表示例以获得进一步的指导。
就是这样。您现在应该可以使用 PHPMailer 了!
PHPMailer 默认为英语,但在语言文件夹中,您会发现许多可能遇到的 PHPMailer 错误消息的翻译。它们的文件名包含翻译的 ISO 639-1 语言代码,例如fr
表示法语。要指定一种语言,您需要告诉 PHPMailer 使用哪种语言,如下所示:
//To load the French version
$ mail -> setLanguage ( ' fr ' , ' /optional/path/to/language/directory/ ' );
我们欢迎更正和新语言 - 如果您正在寻找更正,请运行测试文件夹中的 Language/TranslationCompletenessTest.php 脚本,它将显示任何缺失的翻译。
从 GitHub wiki 开始阅读。如果您遇到问题,请参阅故障排除指南,因为它会经常更新。
有关如何在常见场景中使用 PHPMailer 的示例可以在示例文件夹中找到。如果您正在寻找一个好的起点,我们建议您从 Gmail 示例开始。
为了减少 PHPMailer 的部署代码占用量,如果您通过 Composer 或通过 GitHub 的 zip 文件下载加载 PHPMailer,则不会包含示例,因此您需要克隆 git 存储库或使用上面的链接直接获取示例。
完整生成的 API 文档可在线获取。
您可以通过在顶级文件夹中运行phpdoc
来生成完整的 API 级文档,并且文档将出现在docs
文件夹中,但您需要安装 PHPDocumentor。您可能会发现单元测试对于如何执行加密等各种操作是一个很好的参考。
如果文档未涵盖您需要的内容,请在 Stack Overflow 上搜索许多问题,并且在提出有关“SMTP 错误:无法连接到 SMTP 主机”的问题之前,请阅读故障排除指南。
PHPMailer 测试使用 PHPUnit 9,并带有一个 polyfill,可以让 9 样式的测试在较旧的 PHPUnit 和 PHP 版本上运行。
如果这没有通过,您可以做些什么来提供帮助吗?
请负责任地披露发现的任何漏洞——私下向维护人员报告安全问题。
请参阅 GitHub 上的 SECURITY 和 PHPMailer 的安全建议。
请向 GitHub 问题跟踪器提交错误报告、建议和拉取请求。
我们对修复边缘情况、扩大测试覆盖范围和更新翻译特别感兴趣。
如果您在文档中发现错误,或者想要添加某些内容,请继续修改 wiki - 任何人都可以编辑它。
如果您在转移到 PHPMailer GitHub 组织之前拥有 git 克隆,则需要在克隆中使用如下命令来更新引用旧 GitHub 位置的所有远程 URL:
git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git
请不要再使用 SourceForge 或 Google Code 项目;它们已经过时并且不再维护。
PHPMailer 的开发时间和资源由 Smartmessages.net 提供,Smartmessages.net 是世界上唯一的隐私第一电子邮件营销系统。
我们非常欢迎捐款,无论是啤酒、T 恤还是现金。通过 GitHub 赞助是向 PHPMailer 的维护者和贡献者说“谢谢”的一种简单便捷的方式 - 只需单击项目页面上的“赞助”按钮即可。如果您的公司使用 PHPMailer,请考虑参加 Tidelift 的企业支持计划。
作为 Tidelift 订阅的一部分提供。
PHPMailer 和数千个其他软件包的维护者正在与 Tidelift 合作,为您用来构建应用程序的开源软件包提供商业支持和维护。节省时间、降低风险并改善代码运行状况,同时向您使用的确切软件包的维护人员付费。了解更多。
请参阅变更日志。
coolbru
)和 Andy Prevost( codeworxtech
)于 2004 年接管了该项目。