站点邮件怎么发:第三方中继还是自建

注册确认、密码重置、评论通知——站点总得发邮件。但直接用自己的服务器发,十有八九进垃圾箱。

一、先说结论

个人站点不要自己直接发信,用第三方中继。

理由:

问题说明
IP 信誉新 IP 没有历史,各大邮箱默认不信任
反向解析云厂商的 IP 通常无法设置 PTR 记录
端口封锁很多云默认封禁 25 端口出站
维护成本退信处理、黑名单监控、IP 预热
bash
# 先测一下 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 封/天免费额度够小站用
Resend3000 封/月开发者友好,API 简洁
Postmark / SendGrid有免费额度专业送达率

选择建议:

  • 用户主要在国内 → 阿里云邮件推送 / 腾讯云 SES;
  • 用户主要在海外 → Resend / Brevo;
  • 只是服务器告警发给自己 → Gmail 或 QQ 邮箱 SMTP 足够。

四、服务器上配置中继(发告警信)

装一个极简的 MTA,把邮件转发给第三方 SMTP:

bash
sudo apt install -y msmtp msmtp-mta
bash
# /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 : relay
bash
chmod 600 /etc/msmtprc

# 测试
echo "测试内容" | mail -s "服务器告警测试" you@example.com
tail /var/log/msmtp.log

msmtp 只发不收,体积很小,适合服务器告警这种「只往外发」的场景。

五、用 Postfix 做中继(更通用)

bash
sudo apt install -y postfix mailutils
# 安装时选 "Satellite system"(卫星系统)
bash
# /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
bash
# /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 与邮件记录」那篇)。这里只给检查命令:

bash
# 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

配置建议:

记录推荐值
SPFv=spf1 include:<服务商> -all(稳定后从 ~all-all
DKIM按服务商提供的选择器添加
DMARCp=none 观察报告,再 p=quarantine

七、测试送达质量

bash
# 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
发件人被改中继服务要求域名验证
收不到退信没配置返回路径
bash
# 查看队列和日志
mailq
sudo tail -50 /var/log/mail.log

# 清空卡住的队列(谨慎)
sudo postsuper -d ALL

九、我的配置

本站目前只需要「评论和联系表单通知」这类少量邮件,做法是:

  1. 域名配好 SPF + DKIM + DMARC;
  2. 用一家支持自定义域名的邮件 API;
  3. 服务器上的 cron 告警走 msmtp 中继到同一个服务;
  4. 每月看一次 DMARC 报告。

如果是纯静态站(像本站这样),其实连发信都不需要——联系我直接留邮箱地址就行。


发邮件的难点从来不是「怎么发出去」,而是怎么不进垃圾箱。中继 + 三件套认证是最省心的解法。