为什么用587和465端口发送
25端口是邮件服务器之间传递邮件的端口。从服务器直接发往收件方邮件服务器,IP 信誉、反向 DNS、发送量管理都得自己负责,而且从新服务器 IP 发出的邮件容易进入垃圾邮件箱。
587和465是登录用户提交邮件的提交端口。用账号和密码登录邮件发送服务提交邮件,由信誉受到管理的发送服务器代为投递。这是让注册确认、找回密码、订单通知等邮件顺利进入收件箱最可靠的方法。
- 587端口:以明文连接后,用 STARTTLS 开始加密。是大多数服务和程序默认使用的端口。
- 465端口:从一开始就以 TLS 加密连接。在设置界面中多显示为 SSL 或 SSL/TLS。
选择邮件发送服务
邮件发送服务大致分两种。一种是大批量发送网站和应用通知邮件的事务邮件服务,另一种是已在使用的企业邮箱或个人邮箱账户的 SMTP 功能。无论哪种,拿到以下四项信息就做好了设置准备。
- SMTP 服务器地址:例如 smtp.example.com
- 端口:587(STARTTLS)或465(SSL/TLS)
- 用户名:服务指定的账号或邮箱地址
- 密码:服务的 SMTP 专用密码或 API 密钥
发送量大的网店或服务,事务邮件服务会负责发送记录、退信处理和退订管理,十分省心。只发几封通知的话,邮箱账户的 SMTP 就足够了。
在服务器上确认 SMTP 连接
设置前,先确认服务器能否顺利连接到发送服务。下面的命令只确认连接,不会发送邮件。
nc -vz smtp.example.com 587
openssl s_client -starttls smtp -connect smtp.example.com:587 -crlf -quiet
openssl s_client -connect smtp.example.com:465 -crlf -quiet第一行显示 succeeded 或 open,openssl 命令显示以220开头的服务器问候语,就说明准备好了。按 Ctrl+C 退出。如果没有 nc 命令,Ubuntu 和 Debian 用 apt install -y netcat-openbsd,AlmaLinux 用 dnf install -y nmap-ncat 安装。
把 Postfix 连接到发送服务
想把服务器上的程序、cron 通知和 mail 命令发出的邮件集中到一处,就把 Postfix 设置为转交给发送服务的中继。服务器内的所有邮件都会通过587端口登录后发出。
第1步. 安装
apt install -y postfix libsasl2-modules mailutils安装过程中询问邮件配置类型时选择 Internet Site,邮件名称填入自己的域名。AlmaLinux 10 用 dnf install -y postfix cyrus-sasl-plain s-nail 安装,再用 systemctl enable --now postfix 启动。
第2步. 中继设置
postconf -e 'relayhost = [smtp.example.com]:587'
postconf -e 'smtp_sasl_auth_enable = yes'
postconf -e 'smtp_sasl_password_maps = texthash:/etc/postfix/sasl_passwd'
postconf -e 'smtp_sasl_security_options = noanonymous'
postconf -e 'smtp_tls_security_level = encrypt'
postconf -e 'inet_interfaces = loopback-only'inet_interfaces = loopback-only 只接收服务器内部发出的邮件,使外部无法把这台服务器用作邮件中继。
第3步. 保存登录信息
echo '[smtp.example.com]:587 SMTP_USER:SMTP_PASSWORD' > /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
systemctl restart postfix使用465端口的服务,请把 relayhost 和 sasl_passwd 的端口改为465,并再加一行 postconf -e 'smtp_tls_wrappermode = yes'。
第4步. 测试发送与查看日志
echo "VPS mail test" | mail -s "Test from VPS" you@example.com
postqueue -p
journalctl -t postfix/smtp -n 20日志中出现 status=sent,就说明发送服务已接收邮件。postqueue -p 显示尚未发出的邮件列表。修改登录信息后,执行 systemctl restart postfix,再用 postqueue -f 重新发送。
在 WordPress 和应用中设置 SMTP
大多数网站和应用都有 SMTP 设置栏,不在服务器上部署 Postfix、直接连接发送服务也可以。WordPress 安装 SMTP 插件并填入下面的值,注册和找回密码邮件就会通过该服务发出。
- SMTP 主机:发送服务地址
- 加密:587端口用 TLS(STARTTLS),465端口用 SSL
- 端口:587 或 465
- 认证:开启,填入用户名和密码
- 发件人地址:自己域名的地址(例如:no-reply@example.com)
Node.js、PHP、Python 应用也用同样的值设置邮件库。密码不要直接写在代码里,用环境变量或配置文件传入更规范。WordPress 安装见 WordPress 安装指南。
在域名 DNS 中添加 SPF、DKIM、DMARC
收件方邮件服务器会通过 DNS 记录确认这封邮件是否确实来自自己域名所允许的地方。添加这三条记录,收件箱送达率会大幅提升。
- SPF:可以发送自己域名邮件的服务器列表。把发送服务提供的 include 值写进一条 TXT 记录。
- DKIM:附在邮件上的电子签名。把发送服务界面生成的 TXT 或 CNAME 记录原样添加。
- DMARC:决定如何处理未通过 SPF 和 DKIM 验证的邮件。一开始像下面这样,从只接收报告的设置开始。
_dmarc.example.com TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"观察几周报告,确认所有邮件都能通过后,升级为 p=quarantine,再升级为 p=reject,防止域名被冒用。
接收邮件与下一步
想接收发往自己域名的邮件,就在域名中添加邮件托管服务的 MX 记录。收件交给邮件托管,发出的通知邮件交给发送服务,服务器就能专注于网站和应用。
采用邮件发送服务的方式,迁移或新建服务器时只需搬几行设置即可延续。即使服务器 IP 变了,发送信誉仍保留在服务方,把网站迁到其他地区时邮件送达率也保持稳定。
