使用Nodemailer结合cPanel发邮件时出现PLAIN认证凭证缺失错误
解决Nodemailer + cPanel 发送邮件时的「Missing credentials for 'PLAIN'」错误
这个错误的核心是Nodemailer无法获取到有效的SMTP验证用户名和密码,以下是针对性的排查和解决步骤:
1. 先确认环境变量是否正常加载
- 检查你的
.env文件是否和代码文件在同一目录下,文件内容的键名必须和代码里的对应:USER=service@ibendouma.com SECRET=你的cPanel邮箱密码 - 在代码最顶部加两行测试代码,确认环境变量是否能被读取:
如果打印结果是console.log('当前读取的邮箱用户名:', process.env.USER); console.log('当前读取的邮箱密码:', process.env.SECRET);undefined,说明dotenv没正确加载——把require("dotenv").config()移到代码最开头,确保它早于任何使用环境变量的代码。
2. 核对cPanel的SMTP配置细节
- 用户名必须是完整邮箱地址:不能只写
service,必须写service@ibendouma.com - 密码是邮箱专属密码:不是你的cPanel主账户密码,是该邮箱在cPanel里设置的独立密码
- 若465端口配置无效,可尝试587端口的配置:
const smtpTransport = nodemailer.createTransport({ host: "mail.ibendouma.com", port: 587, secure: false, requireTLS: true, // 强制启用TLS加密 auth: { user: process.env.USER, pass: process.env.SECRET, }, });
3. 优化代码逻辑(避免混合异步写法)
原代码同时用了await和.then().catch(),容易导致逻辑混乱,改成统一的async/await写法:
const nodemailer = require("nodemailer"); require("dotenv").config(); // 先验证环境变量 console.log('邮箱用户名:', process.env.USER); console.log('邮箱密码:', process.env.SECRET); const smtpTransport = nodemailer.createTransport({ host: "mail.ibendouma.com", port: 465, secure: true, auth: { user: process.env.USER, pass: process.env.SECRET, }, }); async function run() { try { const sendResult = await smtpTransport.sendMail({ from: "'iBendouma' <service@ibendouma.com>", to: "tipox1254@gmail.com", subject: "Hello from iBendouma", text: "copier le code et verifier votre identité", }); console.log('发送成功:', sendResult); return sendResult; } catch (err) { console.error('发送失败:', err); throw err; } } run().catch(error => console.error(error));
4. 额外排查点
- 确认cPanel里的
service@ibendouma.com邮箱账户已创建且状态正常 - 检查服务器防火墙是否允许465/587端口的出站连接
- 部分cPanel主机需要在「邮箱账户管理」页面开启SMTP授权功能
内容的提问来源于stack exchange,提问作者mamadou SY
相关产品推荐
相关产品推荐

