Email

使用 PHPMailer 发送邮件

PHPMailer 是 PHP 中使用最广泛的邮件发送库。

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}";
}

有几个容易踩坑的细节。SMTPSecurePort 需要配合使用:587 端口使用 ENCRYPTION_STARTTLS,465 端口使用 ENCRYPTION_SMTPSisHTML(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 的用法。

基于同一网络构建。

测试 API 密钥即刻获取。添加付款方式并验证发送者身份后,即可解锁生产环境。

你的下一个创意。
随时连接。