Nodemailer对接GoDaddy邮箱认证失败及发送限制问题求助
Nodemailer 对接 GoDaddy/Office365 邮箱的认证及发送故障排查
首次使用Nodemailer对接GoDaddy托管的Office365邮箱时,遇到SSL版本错误、认证失败及发送限额异常问题,以下是详细场景及解决方案:
一、初始实现与SSL版本错误
最初使用的Node.js/Express路由代码如下:
const router = require("express").Router(); const nodemailer = require("nodemailer"); const simplesmtp = require("simplesmtp"); const MailParser = require("mailparser").MailParser; const imaps = require("imap-simple"); // 发送邮件函数 function sendEmail(data) { const smtpTransport = nodemailer.createTransport({ host: "smtp.office365.com", port: 587, secure: true, tls: { ciphers: "SSLv3", minVersion: "TLSv1.2", }, auth: { user: "myemail@mydomain.com", pass: "mypassword", }, }); const mailOptions = { to: data.email, from: "myemail@mydomain.com", subject: "Test Email", text: data.message, }; smtpTransport.sendMail(mailOptions, (error, info) => { if (error) { console.log(`Error sending email: ${error}`); } else { console.log(`Email sent: ${info.response}`); } smtpTransport.close(); }); } // 创建接收邮件的SMTP服务器 function createSMTPServer() { const server = simplesmtp.createServer({ debug: false }); server.on("startData", (connection) => { console.log(`Message from: ${connection.from}`); console.log(`Message to: ${connection.to}`); connection.saveStream = new MailParser(); connection.saveStream.on("end", (mail) => { console.log("Received email:"); console.log(`Subject: ${mail.subject}`); console.log(`From: ${mail.from.text}`); console.log(`To: ${mail.to.text}`); console.log(`Body: ${mail.text}`); }); connection.pipe(connection.saveStream); }); server.listen(25); } // 连接IMAP服务器监听新邮件 function connectToIMAPServer() { const imapConfig = { imap: { user: "myemail@mydomain.com", password: "mypassword", host: "outlook.office365.com", port: 993, tls: true, authTimeout: 10000, }, onmail: (numNewMsgs) => { console.log(`You have ${numNewMsgs} new email(s).`); }, }; imaps .connect(imapConfig) .then((connection) => { return connection.openBox("INBOX").then(() => { console.log("Connected to IMAP server"); }); }) .catch((err) => { console.error(`Error connecting to IMAP server: ${err}`); }); } // 处理contact路由 router.post("/contact", (req, res) => { let data = req.body; if (data.name.length === 0 || data.email.length === 0 || data.message.length === 0) { return res.json({ msg: "Please fill out all the fields" }); } sendEmail(data); connectToIMAPServer(); res.json({ msg: "Email sent and listening for incoming emails" }); }); module.exports = router;
替换真实邮箱密码后,控制台抛出SSL版本错误:
[0] Error sending email: Error: 34400000:error:0A00010B:SSL routines:ssl3_get_record:wrong version number:c:\ws\deps\openssl\openssl\ssl\record\ssl3_record.c:355:
二、GoDaddy提供的官方配置
联系GoDaddy后获取的邮箱配置信息:
- 用户名:完整邮箱地址
- 密码:邮箱登录密码
- 收件设置:
- 服务器:outlook.office365.com(POP/IMAP通用)
- 端口:POP:995(SSL加密),IMAP:993(SSL加密)
- 加密方式:TLS
- 发件设置:
- 服务器:smtp.office365.com
- 端口:587
- 加密方式:STARTTLS
三、简化代码后的认证失败与限额问题
改用简化版代码后:
const router = require("express").Router(); const nodemailer = require("nodemailer"); router.post("/contact", (req, res) => { let data = req.body; if (data.name.length === 0 || data.email.length === 0 || data.message.length === 0) { return res.json({ msg: "Please fill out all the fields" }); } let smtpTransport = nodemailer.createTransport({ service: "Godaddy", host: "smtpout.secureserver.net", secureConnection: false, port: 587, auth: { user: "myemail@mydomain.com", pass: "mypassword", }, }); let mailOptions = { from: data.email, to: "myemail@mydomain.com", subject: `Message from ${data.name}`, html: ` <h3>Informations</h3> <ul> <li>Name: ${data.name}</li> <li>Email: ${data.email}</li> </ul> <h3>Message</h3> <p>${data.message}</p> `, }; smtpTransport.sendMail(mailOptions, (err) => { try { if (err) { console.log(err); return res.status(400).json({ msg: "Failed to send email" }); } console.log("success"); res.status(200).json({ msg: "Message was sent successfully" }); } catch (err) { return res.status(500).json({ msg: "There was an unexpected server error." }); } }); }); module.exports = router;
出现认证失败错误:
[0] Error: Invalid login: 535 Authentication Failed for myemail@mydomain.com [0] at SMTPConnection._formatError (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:790:19) [0] at SMTPConnection._actionAUTHComplete (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:1564:34) [0] at SMTPConnection.<anonymous> (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:546:26) [0] at SMTPConnection._processResponse (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:969:20) [0] at SMTPConnection._onData (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:755:14) [0] at SMTPConnection._onSocketData (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:193:44) [0] at TLSSocket.emit (node:events:513:28) [0] at addChunk (node:internal/streams/readable:324:12) [0] at readableAddChunk (node:internal/streams/readable:297:9) [0] at Readable.push (node:internal/streams/readable:234:10) { [0] code: 'EAUTH', [0] response: '535 Authentication Failed for myemail@mydomain.com', [0] responseCode: 535, [0] command: 'AUTH PLAIN' [0] }
后续又触发发送限额错误(从未成功发送过邮件):
[0] Error: Mail command failed: 550 User myemail@mydomain.com has exceeded its 24-hour sending limit. Messages to 5 recipients out of 5 allowed have been sent. Relay quota will reset in 13.69 hours. [0] at SMTPConnection._formatError (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:790:19) [0] at SMTPConnection._actionMAIL (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:1594:34) [0] at SMTPConnection.<anonymous> (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:1063:18) [0] at SMTPConnection._processResponse (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:969:20) [0] at SMTPConnection._onData (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:755:14) [0] at SMTPConnection._onSocketData (C:\Users\Baily\Desktop\nodemailer\nodemailer-form\node_modules\nodemailer\lib\smtp-connection\index.js:193:44) [0] at TLSSocket.emit (node:events:513:28) [0] at addChunk (node:internal/streams/readable:324:12) [0] at readableAddChunk (node:internal/streams/readable:297:9) [0] at Readable.push (node:internal/streams/readable:234:10) { [0] code: 'EENVELOPE', [0] response: '550 User myemail@mydomain.com has exceeded its 24-hour sending limit. Messages to 5 recipients out of 5 allowed have been sent. Relay quota will reset in 13.69 hours.', [0] responseCode: 550, [0] command: 'MAIL FROM' [0] }
四、解决方案
1. 修复SSL版本错误
初始代码中secure: true与587端口不兼容(587端口使用STARTTLS而非直接SSL加密),且SSLv3已被Office365淘汰,修正后的SMTP配置:
const smtpTransport = nodemailer.createTransport({ host: "smtp.office365.com", port: 587, secure: false, // 587端口需设为false,通过STARTTLS升级加密 tls: { minVersion: "TLSv1.2", rejectUnauthorized: false, // 测试阶段临时关闭,稳定后可开启 }, auth: { user: "myemail@mydomain.com", pass: "应用密码", // 下文说明替换为应用密码 }, });
2. 解决认证失败问题
- 使用应用密码:GoDaddy托管的Office365邮箱(尤其是开启两步验证的账户),需使用专门生成的应用密码替代登录密码。登录GoDaddy账户,找到对应邮箱的应用密码生成入口,生成后替换代码中的密码。
- 统一发件人地址:
from字段必须与认证邮箱一致,不能使用用户提交的data.email,否则会触发SPF验证失败。如需接收用户回复,可使用replyTo字段:let mailOptions = { from: "myemail@mydomain.com", // 与auth.user保持一致 replyTo: data.email, // 接收用户回复的地址 to: "myemail@mydomain.com", subject: `Message from ${data.name}`, html: `...`, }; - 检查邮箱权限:确认邮箱套餐支持第三方SMTP客户端发送,部分基础套餐可能存在限制。
3. 处理发送限额问题
- 等待限额重置:未成功的发送请求也会被GoDaddy计入次数,等待限额重置后用修正代码测试。
- 优化请求逻辑:测试阶段避免频繁重复请求,减少无效请求占用额度。
- 升级邮箱套餐:若5封/24小时的限额无法满足需求,联系GoDaddy升级套餐获取更高额度。
4. IMAP连接修正
若需监听收件,IMAP配置同样需使用应用密码,并确保TLS版本正确:
const imapConfig = { imap: { user: "myemail@mydomain.com", password: "应用密码", host: "outlook.office365.com", port: 993, tls: true, tlsOptions: { minVersion: "TLSv1.2", }, authTimeout: 10000, }, };
内容的提问来源于stack exchange,提问作者GBOOKEY96
相关产品推荐
相关产品推荐

