站点邮件怎么发:第三方中继还是自建
注册确认、密码重置、评论通知——站点总得发邮件。但直接用自己的服务器发,十有八九进垃圾箱。
一、先说结论
个人站点不要自己直接发信,用第三方中继。
理由:
| 问题 | 说明 |
|---|---|
| IP 信誉 | 新 IP 没有历史,各大邮箱默认不信任 |
| 反向解析 | 云厂商的 IP 通常无法设置 PTR 记录 |
| 端口封锁 | 很多云默认封禁 25 端口出站 |
| 维护成本 | 退信处理、黑名单监控、IP 预热 |
# 先测一下 25 端口能不能出
telnet smtp.gmail.com 25
# 连不上 → 被封了,直接放弃自建
# 或者用 465/587(很多厂商只封 25)
nc -zv smtp.gmail.com 587二、两条路
| 方案 | 适用 |
|---|---|
| 第三方 SMTP 中继 | 个人站点、小项目(推荐) |
| 专业邮件 API | 注册信、营销信(更省心) |
| 自建 Postfix + 中继 | 服务器上命令行发信(告警用) |
三、第三方服务对比
| 服务 | 免费额度 | 特点 |
|---|---|---|
| Gmail SMTP | 每天约 500 封 | 需应用专用密码,限制多 |
| QQ / 163 邮箱 SMTP | 免费 | 国内可达性好,需授权码 |
| 阿里云邮件推送 | 有免费额度 | 国内场景,需备案域名 |
| Brevo(原 Sendinblue) | 300 封/天 | 免费额度够小站用 |
| Resend | 3000 封/月 | 开发者友好,API 简洁 |
| Postmark / SendGrid | 有免费额度 | 专业送达率 |
选择建议:
- 用户主要在国内 → 阿里云邮件推送 / 腾讯云 SES;
- 用户主要在海外 → Resend / Brevo;
- 只是服务器告警发给自己 → Gmail 或 QQ 邮箱 SMTP 足够。
四、服务器上配置中继(发告警信)
装一个极简的 MTA,把邮件转发给第三方 SMTP:
sudo apt install -y msmtp msmtp-mta# /etc/msmtprc
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account relay
host smtp.resend.com
port 587
from noreply@example.com
user resend
password 你的API Key
account default : relaychmod 600 /etc/msmtprc
# 测试
echo "测试内容" | mail -s "服务器告警测试" you@example.com
tail /var/log/msmtp.log
msmtp只发不收,体积很小,适合服务器告警这种「只往外发」的场景。
五、用 Postfix 做中继(更通用)
sudo apt install -y postfix mailutils
# 安装时选 "Satellite system"(卫星系统)# /etc/postfix/main.cf 关键项
relayhost = [smtp.resend.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# 只监听本机
inet_interfaces = loopback-only# /etc/postfix/sasl_passwd
[smtp.resend.com]:587 resend:你的API Key
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd*
sudo systemctl restart postfix
# 测试
echo "hello" | mail -s "test" you@example.com
sudo tail -20 /var/log/mail.log六、SPF / DKIM / DMARC 复核
即使走中继,域名的发信认证也要配好(详见「DNSSEC、CAA 与邮件记录」那篇)。这里只给检查命令:
# SPF
dig +short TXT www.bzii.cn | grep spf
# v=spf1 include:amazonses.com ~all
# DKIM(选择器名由服务商给)
dig +short TXT resend._domainkey.www.bzii.cn
# DMARC
dig +short TXT _dmarc.www.bzii.cn
# v=DMARC1; p=none; rua=mailto:dmarc@example.com配置建议:
| 记录 | 推荐值 |
|---|---|
| SPF | v=spf1 include:<服务商> -all(稳定后从 ~all 改 -all) |
| DKIM | 按服务商提供的选择器添加 |
| DMARC | 先 p=none 观察报告,再 p=quarantine |
七、测试送达质量
# 1. 用 mail-tester.com 发一封测试信,会给出评分
echo "测试" | mail -s "test" test@example.com
# 2. 看邮件原文里的认证结果
# Gmail 里:显示原始邮件 → 看 SPF/DKIM/DMARC 是否 PASS
# 3. 检查 IP 是否在黑名单
# mxtoolbox.com/blacklists.aspx八、常见问题
| 现象 | 原因 |
|---|---|
| 进了垃圾箱 | SPF/DKIM 没配,或内容像营销 |
| 认证失败 535 | 用了登录密码而不是授权码/API Key |
| 超时 | 25 端口被封,改用 587/465 |
| 发件人被改 | 中继服务要求域名验证 |
| 收不到退信 | 没配置返回路径 |
# 查看队列和日志
mailq
sudo tail -50 /var/log/mail.log
# 清空卡住的队列(谨慎)
sudo postsuper -d ALL九、我的配置
本站目前只需要「评论和联系表单通知」这类少量邮件,做法是:
- 域名配好 SPF + DKIM + DMARC;
- 用一家支持自定义域名的邮件 API;
- 服务器上的 cron 告警走 msmtp 中继到同一个服务;
- 每月看一次 DMARC 报告。
如果是纯静态站(像本站这样),其实连发信都不需要——联系我直接留邮箱地址就行。
发邮件的难点从来不是「怎么发出去」,而是怎么不进垃圾箱。中继 + 三件套认证是最省心的解法。
