You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,这个可以保留或者根据情况调整
  }
});

如果确实需要本地认证(不推荐当前场景)

如果你因为某些原因必须用认证方式发送(比如后续要支持远程连接),那需要做以下配置:

  1. 安装并配置saslauthd服务,让Postfix能验证系统用户的密码
    • 运行命令sudo apt install sasl2-bin
    • 修改/etc/default/saslauthd,设置START=yesMECHANISMS="shadow"
    • 重启saslauthdsudo systemctl restart saslauthd
  2. 修改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
  3. 此时你的Node代码里的auth就可以填实际的Linux系统用户名和密码了,但注意这个用户需要有合法的系统密码,且saslauthd能读取到它的密码哈希。

不过回到你的场景,直接去掉auth是最简单且符合Postfix默认行为的解决方案,毕竟你只是在本地VPS上用Node连接本地Postfix发送邮件。

内容的提问来源于stack exchange,提问作者K.Broncel

火山引擎 最新活动