
每个网站——从在线商店发送订单确认到企业联系表单——都需要一个可靠的电子邮件发送系统。本指南涵盖了从理解 PHP mail() 的问题所在、到正确配置 WordPress SMTP、在自定义 PHP 应用中使用 PHPMailer、在 DirectAdmin 上设置电子邮件虚拟主机,以及配置 SPF/DKIM/DMARC 以确保您的电子邮件真正到达收件箱的所有内容。
什么是 PHP mail() 以及为什么它不可靠?
PHP mail() 是一个内置的 PHP 函数,它通过安装在服务器上的 Sendmail 或 MTA(邮件传输代理)直接发送电子邮件,无需任何 SMTP 配置。虽然方便,但它有几个问题经常会阻止电子邮件到达收件人:
- 几乎总是进入垃圾邮件 — PHP mail() 直接从服务器的 IP 地址发送电子邮件,没有适当的身份验证。Gmail、Outlook 和 Yahoo 等电子邮件提供商应用严格的垃圾邮件过滤器,并经常将 PHP mail() 邮件分类为垃圾邮件。
- 不支持 SPF/DKIM — PHP mail() 不会自动签署 DKIM 标头或通过身份验证过程。电子邮件没有接收服务器可以验证的"签名"。
- 共享 IP 声誉 — 在共享虚拟主机上,数百个客户共享同一台服务器。如果另一个客户发送垃圾邮件,该 IP 会被列入黑名单,影响同一 IP 上的每个帐户。
- 错误处理不佳 — PHP mail() 只返回 true 或 false。您无法看到电子邮件被拒绝或退回的原因,使调试变得非常困难。
- 速率限制 — 许多虚拟主机提供商(包括 AsiaGB)限制每小时可通过 PHP mail() 发送的电子邮件数量,以防止滥用。
底线: PHP mail() 仅适合在开发环境中进行测试。对于生产环境,始终使用带有适当身份验证的 SMTP。
PHP mail() vs SMTP vs 电子邮件 API:有什么区别?
从网站发送电子邮件有三种主要方法。每种都有其优点和缺点:
| 方法 | 可靠性 | 设置 | 最适合 |
|---|---|---|---|
| PHP mail() | 非常低 | 无需设置 | 仅用于测试 |
| 虚拟主机 SMTP | 良好 | 中等 | 低-中等量 |
| Gmail SMTP | 很好 | 中等 | 个人/中小企业网站 |
| 电子邮件 API(Mailgun/SendGrid) | 最佳 | 更复杂 | 高容量/事务型 |
SMTP(简单邮件传输协议)是通过已认证服务器发送电子邮件的标准协议。客户端(您的网站)在每次发送前使用用户名和密码登录,这让接收服务器相信电子邮件来自合法发件人。
电子邮件 API(如 Mailgun 或 SendGrid)允许您通过 HTTP API 而不是 SMTP 发送电子邮件。它们速度更快,提供分析仪表板,处理自动重试,并支持每月发送数百万封电子邮件。它们非常适合大型电子商务网站或发送高容量事务型电子邮件的应用程序。
使用 WP Mail SMTP 插件在 WordPress 上配置 SMTP
WordPress 默认使用 PHP mail(),但使用插件切换到 SMTP 很简单——无需更改代码。最推荐的插件是 WP Mail SMTP,拥有超过 400 万个活跃安装。
安装 WP Mail SMTP
- 转到 WordPress 管理仪表板 → 插件 → 添加新插件
- 搜索"WP Mail SMTP" → 立即安装 → 激活
- 导航到 WP Mail SMTP → 设置 → 常规
- 输入"发件人"电子邮件(在"发件人"字段中显示的地址)和"发件人"名称
- 选择您的邮件程序(Gmail、虚拟主机 SMTP、Mailgun 等)
- 为选择的邮件程序输入所需凭据 → 保存设置
- 在 WP Mail SMTP → 工具 → 电子邮件测试中测试配置
选项 1:带有应用密码的 Gmail SMTP
Google 不再允许将常规密码与 SMTP 一起使用。您必须改为创建应用密码——一个 16 字符的密码,用于替代不本地支持 2FA 的应用的真实密码:
- 打开您的 Google 账户 → 安全性 → 两步验证(必须先启用)
- 在"安全性"页面底部附近搜索"应用密码"
- 选择应用:"邮件"和设备:"其他(自定义名称)" → 输入您的网站名称
- 点击生成 — 您将收到一个 16 字符的密码(现在保存;它只显示一次)
- 回到 WP Mail SMTP,选择邮件程序:"其他 SMTP"
- 填写:SMTP 主机:
smtp.gmail.com、端口:587、加密:TLS、用户名:您的 Gmail 地址、密码:您刚生成的应用密码
Gmail SMTP 免费限制:标准 Gmail 账户每天最多 500 封电子邮件(或每小时 100 封)。使用 Google Workspace 可增加到每天 2,000 封。适合低到中等流量的网站。
选项 2:您的虚拟主机 SMTP 服务器
如果您已经在 AsiaGB 虚拟主机上有电子邮件帐户,您可以直接使用虚拟主机 SMTP 服务器。优点是电子邮件从与网站相同的域发送,使 SPF/DKIM 配置更加简单。
AsiaGB 虚拟主机的 SMTP 设置:
- SMTP 主机:
mail.yourdomain.com(替换为您的实际域) - SMTP 端口:
587(STARTTLS)或465(SSL/TLS) - 加密:TLS(端口 587)或 SSL(端口 465)
- 身份验证:始终启用
- 用户名:完整电子邮件地址,例如
[email protected] - 密码:该电子邮件帐户的密码
端口 587 vs 465:首先尝试端口 587 和 STARTTLS — 大多数防火墙不会阻止它。如果连接失败,请改为尝试端口 465 和 SSL/TLS。两者同样安全;它们仅在加密握手启动方式上有所不同。
使用 PHPMailer 在 PHP 中配置 SMTP
如果您正在构建自定义 PHP 网站或使用 Laravel、CodeIgniter 或纯 PHP 等框架,PHPMailer 是发送电子邮件的最佳库。它完全支持 SMTP、HTML 电子邮件、附件和 SSL/TLS 加密。
通过 Composer 安装
composer require phpmailer/phpmailer
示例:使用 PHPMailer 发送电子邮件
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true); // true = 启用异常
try {
// 配置 SMTP 服务器
$mail->isSMTP();
$mail->Host = 'mail.yourdomain.com'; // 虚拟主机 SMTP 服务器
$mail->SMTPAuth = true;
$mail->Username = '[email protected]'; // 电子邮件帐户
$mail->Password = 'your_email_password'; // 电子邮件密码
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS
$mail->Port = 587;
// 设置发件人和收件人
$mail->setFrom('[email protected]', 'Your Website Name');
$mail->addAddress('[email protected]', 'Recipient Name');
$mail->addReplyTo('[email protected]', 'Customer Support');
// 电子邮件内容
$mail->isHTML(true);
$mail->CharSet = 'UTF-8'; // 对非 ASCII 字符很重要
$mail->Subject = 'Order Confirmation #12345';
$mail->Body = '<h2>Thank You for Your Order</h2>'
. '<p>Your order has been confirmed.</p>';
$mail->AltBody = 'Thank you for your order. Your order has been confirmed.';
$mail->send();
echo 'Email sent successfully';
} catch (Exception $e) {
echo "Failed to send email: {$mail->ErrorInfo}";
}
重要提示:永远不要直接在您的代码中存储 SMTP 密码。使用环境变量或存储在文档根目录之外的配置文件。永远不要向版本控制中提交凭据。
AsiaGB DirectAdmin 电子邮件虚拟主机
所有 AsiaGB 虚拟主机计划都支持通过 DirectAdmin 控制面板在您的域上创建电子邮件账户,可立即用于 SMTP 身份验证。
在 DirectAdmin 中创建电子邮件账户
- 登录到 DirectAdmin → 电子邮件管理部分
- 点击电子邮件账户
- 点击创建账户
- 输入用户名(例如
noreply或contact)并设置密码 - 根据需要设置配额(邮箱大小)
- 点击创建 — 电子邮件地址立即可用
DirectAdmin 电子邮件账户的 SMTP 设置
mail.yourdomain.com
用您的实际域名替换 yourdomain.com。该主机名适用于 SMTP、IMAP 和 POP3。
587 with STARTTLS
经过身份验证的 SMTP 的标准端口,可通过大多数防火墙。与加密一起使用:TLS。
465 with SSL/TLS
SMTPS — 从一开始就建立 SSL 连接。如果您的 ISP 或防火墙阻止了端口 587,请使用此选项。
SPF、DKIM 和 DMARC:为什么它们很重要以及如何配置它们
即使正确配置了 SMTP,如果没有 SPF、DKIM 和 DMARC,您的电子邮件仍然有很高的可能性进入垃圾邮件。电子邮件提供商使用这些记录来验证声称来自您的域的电子邮件是否真的来自授权的服务器。
SPF(发件人政策框架)
SPF 是一条 TXT DNS 记录,指定哪些 IP 地址或服务器有权代表您的域发送电子邮件。如果接收电子邮件服务器检测到电子邮件来自您的 SPF 记录中未列出的 IP,它将把检查标记为"失败",可能会拒绝或将邮件发送到垃圾邮件。
在 AsiaGB 服务器上托管的 SPF 记录示例:
v=spf1 include:yourhostingserver.com ~all
DKIM(DomainKeys 识别邮件)
DKIM 为您发送的每个电子邮件标头添加数字签名。接收服务器根据在您的 DNS 中发布的公钥验证此签名。如果签名匹配,它确认电子邮件在传输中未被修改并且来自您的实际域。
DMARC(基于域的邮件身份验证、报告和一致性)
DMARC 是一项政策,告诉接收服务器如何处理未通过 SPF 或 DKIM 检查的电子邮件:不执行任何操作 (none)、隔离(移到垃圾邮件)或直接拒绝。您还可以收到被拒绝电子邮件的报告以供分析。
如何在 DirectAdmin DNS 管理器中配置
- 登录到 DirectAdmin → 域管理 → DNS 管理
- 选择要配置的域
- 为 SPF 添加 TXT 记录:名称 =
@或您的域,值 = 您的 SPF 记录 - 对于 DKIM:较新版本的 DirectAdmin 在电子邮件管理器中有"启用 DKIM"按钮 — 点击"启用",系统将生成密钥对并自动添加 DNS 记录
- 为 DMARC 添加 TXT 记录:名称 =
_dmarc,示例值:
# DMARC 记录(首先用 p=none 来监控) _dmarc.yourdomain.com TXT "v=DMARC1; p=none; rua=mailto:[email protected]" # 确信后,改为 p=quarantine 或 p=reject _dmarc.yourdomain.com TXT "v=DMARC1; p=quarantine; pct=100; rua=mailto:[email protected]"
建议:开始使用 p=none 以在实施前收集 1-2 周的报告。然后切换到 p=quarantine 或 p=reject 以获得针对电子邮件欺骗的全面保护。
Mailgun / SendGrid 免费版本:何时使用 API 而不是虚拟主机 SMTP
虚拟主机 SMTP 适用于电子邮件量低到中等的典型网站,但随着业务增长,有充分理由切换到电子邮件 API:
- 高容量 — 如果您需要每天发送超过 500-1,000 封电子邮件(订单确认、新闻通讯、通知),您的虚拟主机 SMTP 可能会不足或触及速率限制。
- 分析 — Mailgun 和 SendGrid 提供实时显示打开率、点击率、退回率和垃圾邮件投诉的仪表板,标准 SMTP 不提供此功能。
- 更好的可送达性 — 电子邮件 API 提供商维护具有已建立的高声誉历史和适当的 IP 预热过程的专用 IP 池,从而获得更好的收件箱放置率。
- 自动重试和退回处理 — 如果发送失败,API 会自动重试,并通过 Webhook 通知您有关退回和取消订阅的信息。
Mailgun 免费版本:每天 100 封电子邮件,前 3 个月免费,然后从 $35/月起支持 50,000 封电子邮件。
SendGrid 免费版本:每天 100 封电子邮件,无时间限制 — 适合小型网站。
准则:如果您的网站每天发送少于 200 封电子邮件,虚拟主机 SMTP 就足够了,而且设置起来简单得多。如果超过每天 500-1,000 封,请考虑使用电子邮件 API 以获得更好的可送达性和可靠性。
上线前的电子邮件清单
上线前,验证以下每一项,以确保您的电子邮件到达收件人并远离垃圾邮件文件夹:
- SPF 记录已设置在 DNS 中并完全传播(在 mxtoolbox.com/spf.aspx 验证)
- 在 DirectAdmin 电子邮件管理器中启用了 DKIM,DNS 记录正确
- DMARC 记录已添加到 DNS(从 p=none 开始)
- 向 mail-tester.com 发送了测试电子邮件并收到至少 8/10 的分数
- 发件人电子邮件地址与配置了 SPF/DKIM 的域匹配(不是 Gmail 或另一个域)
- 营销电子邮件包含取消订阅链接(Gmail/Yahoo 2024 发件人政策要求)
- 发送给 Gmail、Outlook 和 Yahoo 的测试电子邮件都在收件箱中,而不是垃圾邮件
- 服务器 IP 未被列入黑名单(在 mxtoolbox.com/blacklists.aspx 检查)
- 电子邮件主题和正文不包含垃圾邮件触发词,如"免费!"、"现在点击"、"赚钱"
- 回复地址配置正确并且收件箱受到监控(避免 noreply,除非真的必要)
如何使用 mail-tester.com 进行测试
- 访问 mail-tester.com — 您将收到一个临时地址,如
[email protected] - 从您的系统向该地址发送测试电子邮件
- 返回 mail-tester.com 并点击"然后检查您的分数"
- 查看您的分数和需要修复的任何问题。目标是 10/10,或至少 9/10
常见问题以及解决方法
电子邮件进入垃圾邮件
最常见原因:缺少 SPF/DKIM、发件人地址与配置了 SPF/DKIM 的域不匹配、电子邮件正文包含垃圾邮件触发词,或服务器 IP 被列入黑名单。修复方法:完全设置 SPF/DKIM,使用 mail-tester.com 进行测试,并检查黑名单。
电子邮件间歇性发送
通常由 SMTP 服务器速率限制、网络不稳定导致的超时或共享 IP 被垃圾邮件过滤器临时阻止引起。修复方法:检查 SMTP 错误日志,减少发送频率,或切换到处理自动重试的电子邮件 API。
电子邮件退回
退回有两种类型:硬退回发生在收件人地址不存在或域无效时(立即删除这些地址);软退回发生在邮箱已满或目标服务器暂时不可用时(系统自动重试)。PHPMailer 和大多数电子邮件 API 在错误消息中提供退回类型。
电子邮件正文中的乱码字符
这是编码问题:在 PHPMailer 中设置 $mail->CharSet = 'UTF-8',或在使用 PHP mail() 时添加标头 Content-Type: text/html; charset=UTF-8。还要确保您的 PHP 文件本身以 UTF-8 编码保存。
您自己域名上的电子邮件虚拟主机和 SMTP
AsiaGB 提供 DirectAdmin 上的电子邮件虚拟主机,支持完整的 SMTP、IMAP/POP3、SPF 和 DKIM。立即在您的域上创建电子邮件账户。泰国服务器,起价 500 泰铢/年。
查看虚拟主机套餐