OVH Ubuntu VPS上Nodemailer+Postfix无法发送邮件求助
解决Node.js Nodemailer连接本地Postfix时的认证失败问题
看起来你踩了Postfix本地提交的一个常见坑——默认情况下,Postfix允许来自localhost(127.0.0.1)的邮件无需认证直接发送,而你在Node代码里额外加了auth配置,反而触发了Postfix的认证检查,导致报错。
为什么终端mail命令能正常工作?
终端里的mail工具是通过本地系统接口(比如调用sendmail)或者直接连接localhost:25提交邮件的,Postfix的默认配置里,mynetworks参数已经包含了127.0.0.1,属于信任的本地网络,这类请求会被跳过认证步骤,所以不需要输入用户名密码就能发送成功。
最快的解决方法:去掉auth配置
修改你的Node.js代码,删除auth相关的配置项,因为本地连接localhost:25根本不需要认证:
let transporter = nodemailer.createTransport({ host: 'localhost', port: 25, tls:{ rejectUnauthorized: false // 如果你的Postfix没有配置SSL,这个可以保留或者根据情况调整 } });
如果确实需要本地认证(不推荐当前场景)
如果你因为某些原因必须用认证方式发送(比如后续要支持远程连接),那需要做以下配置:
- 安装并配置
saslauthd服务,让Postfix能验证系统用户的密码- 运行命令
sudo apt install sasl2-bin - 修改
/etc/default/saslauthd,设置START=yes和MECHANISMS="shadow" - 重启
saslauthd:sudo systemctl restart saslauthd
- 运行命令
- 修改Postfix的
main.cf配置,启用SASL认证:- 添加或修改以下参数:
smtpd_sasl_auth_enable = yes smtpd_sasl_type = cyrus smtpd_sasl_path = private/auth smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = $myhostname - 重启Postfix:
sudo systemctl restart postfix
- 添加或修改以下参数:
- 此时你的Node代码里的
auth就可以填实际的Linux系统用户名和密码了,但注意这个用户需要有合法的系统密码,且saslauthd能读取到它的密码哈希。
不过回到你的场景,直接去掉auth是最简单且符合Postfix默认行为的解决方案,毕竟你只是在本地VPS上用Node连接本地Postfix发送邮件。
内容的提问来源于stack exchange,提问作者K.Broncel




