Nodemailer对接Gmail遇认证错误:Missing credentials for 'PLAIN'
解决Nodemailer+Gmail认证错误:"Missing credentials for 'PLAIN'"
这个错误的核心原因是Nodemailer未获取到有效的邮箱账号或App Password认证信息,以下是针对性的排查和修复步骤:
1. 确认环境变量是否真的加载成功
别只检查.env文件,直接在代码中加日志验证变量实际值:
import nodemailer from 'nodemailer'; // 打印变量,确认是否读取到有效内容 console.log('邮箱账号:', process.env.ADDRESS); console.log('App Password:', process.env.MAILING_SERVICE_APP_PASSWORD); const transporter = nodemailer.createTransport({ // ... 原有配置 });
如果输出为undefined或空字符串,说明环境变量未正确加载:
- 若使用本地.env文件,确保已安装并在代码最顶部引入
dotenv:import dotenv from 'dotenv'; dotenv.config(); // 加载根目录下的.env文件 - 检查.env文件格式:变量名与值之间不能有空格,比如
ADDRESS=your-email@gmail.com,而非ADDRESS = your-email@gmail.com - 确认.env文件放在项目根目录,且未被.gitignore意外排除(正常需排除,但本地要确保存在)
2. 验证Gmail App Password的有效性
- 必须确保Gmail账号已开启两步验证,未开启则无法生成有效App Password
- 生成App Password时,应用类型选
Mail,设备可选Other(自定义命名),生成的是16位无空格字符串,复制时不要漏字符或多加空格 - 禁止用普通账号密码替代App Password,Gmail已禁用非App Password的第三方登录方式
3. 调整Nodemailer配置细节
建议切换到587端口(STARTTLS协议),兼容性比465的SSL协议更好:
const transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 587, secure: false, // 587端口无需设置secure:true,会自动启用STARTTLS auth: { user: process.env.ADDRESS, pass: process.env.MAILING_SERVICE_APP_PASSWORD, }, // 建议移除tls.rejectUnauthorized: false,该设置会降低安全性,Gmail证书默认可信 });
同时确保mailOptions中的from字段与auth.user完全一致,Gmail不允许发件人地址与认证账号不一致:
const mailOptions = { from: process.env.ADDRESS, // 必须和auth.user相同 to: to, subject: subject, text: text, };
4. 其他排查点
- 若使用TypeScript,需在
types/env.d.ts中声明环境变量类型,避免类型推断导致的读取异常:declare namespace NodeJS { interface ProcessEnv { ADDRESS: string; MAILING_SERVICE_APP_PASSWORD: string; } } - 修改环境变量后必须重启服务器,否则旧变量值会保留在内存中
内容的提问来源于stack exchange,提问作者Zsombor
相关产品推荐
相关产品推荐

