You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:12:03