PHPMailer 是 PHP 中使用最广泛的邮件发送库。它封装了 SMTP,你只需配置一次主机、端口和凭证,然后通过清晰的对象 API 构建并发送邮件。PHP 内置的 mail() 函数功能太弱(没有认证,错误报告有限),这就是大多数项目选择 PHPMailer 的原因。下面是一个完整的、可运行的发送示例。
如何安装 PHPMailer?
使用 Composer:
composer require phpmailer/phpmailer
然后加载自动加载器并导入所需的类:
<?php
require "vendor/autoload.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
如何配置 SMTP 并发送邮件?
创建一个 PHPMailer 实例,通过 isSMTP() 将其切换到 SMTP 模式,然后设置连接和邮件字段。将调用包裹在 try/catch 中,以便发送失败时报告错误而非静默吞掉:
<?php
$mail = new PHPMailer(true); // true enables exceptions
try {
// Server settings
$mail->isSMTP();
$mail->Host = "smtp.example.com";
$mail->SMTPAuth = true;
$mail->Username = getenv("SMTP_USER");
$mail->Password = getenv("SMTP_PASS");
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// Recipients
$mail->setFrom("you@yourdomain.com", "Your App");
$mail->addAddress("recipient@example.org", "Recipient Name");
// Content
$mail->isHTML(true);
$mail->Subject = "Your receipt";
$mail->Body = "<p>Thanks for your order.</p>";
$mail->AltBody = "Thanks for your order. This is the plain-text version.";
$mail->send();
echo "Message sent.";
} catch (Exception $e) {
echo "Send failed: {$mail->ErrorInfo}";
}
有几个容易踩坑的细节。SMTPSecure 和 Port 需要配合使用:587 端口使用 ENCRYPTION_STARTTLS,465 端口使用 ENCRYPTION_SMTPS。isHTML(true) 告诉 PHPMailer Body 是 HTML 格式,并将 AltBody 作为纯文本备用内容发送。向构造函数传入 true,这样失败时会抛出 Exception,而不是静默返回 false。
如何添加附件?
在 send() 之前调用 addAttachment 并传入文件路径:
<?php
$mail->addAttachment("./invoices/invoice-1042.pdf", "invoice.pdf");
第二个参数用于重命名收件人看到的文件名。可以多次调用以添加多个附件。
使用 Bird 发送
PHPMailer 通过 SMTP 通信,这意味着生产环境需要一台信誉良好的邮件服务器、正确的认证记录,以及发送后查看结果的途径。HTTP API 可以省去自建服务器。你通过 HTTPS 发送 JSON,并获得结构化的响应。使用 Bird 邮件 API,同样的邮件只需一次调用:
use Bird\Bird;
$bird = new Bird(getenv("BIRD_API_KEY"));
$bird->emails->send([
"from" => "you@yourdomain.com",
"to" => "delivered@bird.dev",
"subject" => "Hello from PHP",
"html" => "<p>It works.</p>",
]);
delivered@bird.dev 沙盒地址始终接受邮件,因此你可以在向真实收件箱发送之前验证集成。无需 SMTP 套接字,无需选择端口,无需自行预热信誉。
常见问题
为什么不直接使用 PHP 的 mail() 函数?
mail() 将邮件交给本地的 sendmail 程序,没有 SMTP 认证,错误报告也几乎没有。PHPMailer 向远程服务器进行认证,支持 TLS,构建多部分邮件,并告诉你发送失败的原因。
Body 和 AltBody 有什么区别?
Body 是 HTML 版本,AltBody 是纯文本备用内容。设置 isHTML(true) 后,无法渲染 HTML 的客户端会显示 AltBody,这也有助于提高送达能力。
STARTTLS 还是 SMTPS?
在 587 端口上 ENCRYPTION_STARTTLS 将明文连接升级为 TLS,而在 465 端口上 ENCRYPTION_SMTPS 从一开始就是加密的。根据你的邮件服务器要求的端口匹配相应的设置。
当你需要在 PHP 中通过 SMTP 发送邮件时,PHPMailer 是合适的工具。如果你希望跳过自行运维服务器,邮件发送指南完整展示了 API 的用法。