Nodejs nodemailer Error: connect ETIMEDOUT

Nodejs nodemailer Error: connect ETIMEDOUT

使用nodemailer模块,发送邮件的JS文件为mail.js如下

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
    service: 'QQ',
    auth: {
        user: '123@qq.com',
        pass: 'XXX'
    }
});
var mailOptions = {
    from: '123@qq.com', // sender address
    to: 'ABC@qq.com', // list of receivers
    subject: 'Hello', // Subject line
    text: 'Hello world', // plaintext body
    html: '<b>Hello world </b>' // html body
};
transporter.sendMail(mailOptions, function(error, info){
    if(error){
        console.log(error);
    }else{
        console.log('Message sent: ' + info.response);
    }
});

QQ邮箱的POP3/IMAP/SMTP/Exchange服务已经开启,node mail.js后报错

{ [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' }

请教这是什么问题?


6 回复

问题分析

Error: connect ETIMEDOUT 这个错误通常表示在尝试建立与服务器的连接时超时了。这可能是由于网络连接问题、防火墙设置或邮件服务提供商的服务器暂时不可达等原因造成的。

解决方案

1. 检查网络连接

确保你的网络连接正常,并且没有被防火墙或其他网络设备阻止与邮件服务器的连接。

2. 邮件服务提供商配置

确保你已经在QQ邮箱中正确启用了SMTP服务,并且使用的用户名和密码是正确的。

3. 使用更详细的错误信息

你可以通过添加更多的错误处理来获取更详细的错误信息,以便更好地诊断问题。

示例代码

以下是改进后的 mail.js 文件,包括更详细的错误处理:

var nodemailer = require('nodemailer');

// 创建一个SMTP传输对象
var transporter = nodemailer.createTransport({
    host: 'smtp.qq.com', // QQ邮箱的SMTP主机
    port: 465,           // 端口号,通常为465
    secure: true,        // 使用SSL
    auth: {
        user: '123@qq.com', // 发件人邮箱地址
        pass: 'XXX'         // 发件人邮箱密码
    }
});

var mailOptions = {
    from: '123@qq.com', // 发件人地址
    to: 'ABC@qq.com',   // 收件人地址
    subject: 'Hello',   // 邮件主题
    text: 'Hello world', // 邮件正文(文本格式)
    html: '<b>Hello world</b>' // 邮件正文(HTML格式)
};

// 发送邮件
transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
        console.error('Error occurred:', error);
        return;
    }
    console.log('Message sent: ' + info.response);
});

关键点解释

  • host: 设置为 smtp.qq.com,因为QQ邮箱使用的是QQ的SMTP服务器。
  • port: 设置为 465,因为QQ邮箱使用的是SSL加密的SMTP服务。
  • secure: 设置为 true,以启用SSL加密。
  • auth: 提供发件人的邮箱地址和密码。
  • error 回调函数中,打印详细的错误信息以便于调试。

通过以上步骤,你应该能够更好地诊断并解决 connect ETIMEDOUT 错误。如果问题仍然存在,请检查你的网络环境和邮件服务提供商的配置。


var nodemailer = require(‘nodemailer’); var transport = nodemailer.createTransport(‘SMTP’, { service: ‘qq’, //use well known service auth: { user: ‘hankewins@qq.com’, pass: ‘123456’ } }); var data = { form: ‘Hankewins <hankewins.vip@qq.com’, to: ‘tomail@gmail.com,tomail2tomail2@gmail.com’, subject: ‘Hello world’, text: ‘Hello world, I am a test mail!’, html: ‘<b>Hello world, I am a test mail!</b>’ }; transport.sendMail(data, function(err, res){ if (err) { console.log(err); } else { console.log('Message sent: ’ + res.message); } }); 传输协议,hosts指定了么?

是你们公司内网做了处理吧,比如不允许使用SSL发东西啥的

题主解决了吗?? 我也遇到这个问题 ,家里网络或者云服务上都不行,尝试了QQ和163

求大神帮忙!fail: Error: connect ECONNREFUSED 127.0.0.1:25 这个是个什么错误啊? 源码: QQ截图20160119153302.png

根据你提供的信息,Error: connect ETIMEDOUT 表示在尝试连接到远程服务器时超时。这通常意味着你的网络环境或防火墙设置阻止了与 SMTP 服务器的连接。以下是几种可能的解决方法:

1. 检查网络连接

确保你的网络可以访问外部 SMTP 服务器。你可以尝试使用其他工具(如 telnetping)来检查是否能连接到 QQ 邮箱的 SMTP 服务器(smtp.qq.com,默认端口为 465587)。

telnet smtp.qq.com 587

2. 使用正确的 SMTP 端口

QQ 邮箱的 SMTP 服务器默认使用 465(SSL)或 587(TLS)端口。你可以显式地指定端口以确保正确连接。

3. 修改 nodemailer 配置

修改你的 mail.js 文件以包含正确的端口和安全协议(ssltls)。

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    host: 'smtp.qq.com',
    port: 587, // 尝试 465 (SSL) 或 587 (TLS)
    secure: false, // true for 465, false for other ports
    auth: {
        user: '123@qq.com',
        pass: 'XXX'
    },
    tls: {
        rejectUnauthorized: false // 如果你遇到 SSL 证书错误,可以尝试这一项
    }
});

var mailOptions = {
    from: '123@qq.com',
    to: 'ABC@qq.com',
    subject: 'Hello',
    text: 'Hello world',
    html: '<b>Hello world</b>'
};

transporter.sendMail(mailOptions, function(error, info){
    if(error){
        console.log(error);
    }else{
        console.log('Message sent: ' + info.response);
    }
});

4. 防火墙和代理设置

如果你在网络环境中使用防火墙或代理,确保这些设置不会阻止与 SMTP 服务器的连接。你可能需要配置代理以允许通过相应的端口进行连接。

5. 检查 QQ 邮箱的授权码

确保你使用的授权码是正确的,并且是通过 QQ 邮箱的设置页面生成的。

通过以上步骤,你应该能够解决 ETIMEDOUT 错误并成功发送邮件。如果问题仍然存在,请提供更多的网络诊断信息(例如,telnet 命令的输出),以便进一步排查问题。

回到顶部