Nodemailer OAUTH Gmail连接(错误:连接ETIMEDOUT 74.125.140.108:465)

时间:2019-08-18 19:02:35

标签: oauth-2.0 smtp gmail-api nodemailer smtp-auth

我正在尝试使用OAUTH 2.0通过Nodemailer通过Gmail API发送电子邮件

我已经启用了Gmail API,并且我拥有clientId,clientSecret,refreshToken和accessToken(refreshtoken和accesstoken均来自developers.google.com/oauthplayground),因为它们都需要OAUTH才能起作用。

我遵循了每个详细信息表格(https://nodemailer.com/smtp/oauth2/#examples) 但是我遇到以下错误

{ Error: connect ETIMEDOUT 74.125.140.108:465
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
  errno: 'ETIMEDOUT',
  code: 'ESOCKET',
  syscall: 'connect',
  address: '74.125.140.108',
  port: 465,
  command: 'CONN' }

但是当我使用普通用户名和密码时会出现问题,因为没有启用安全性较低的应用访问表单(https://myaccount.google.com/lesssecureapps),所以没有连接超时错误,因此使用发送电子邮件没有错误普通的用户名和密码,但这不是一个好方法,因此,OAUTH是解决方案

这是我的代码,供您检查运行在http://localhost:3000上的开发中的(它是一个快速应用)

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
service: 'gmail',
auth: {
  type: 'OAuth2',
  user: 'mygmailaddress@gmail.com',
  clientId: 'clientID',
  clientSecret: 'clientSecret',
  refreshToken: 'refresh token obtained from https://developers.google.com/oauthplayground',
  accessToken: 'access token also obtained from https://developers.google.com/oauthplayground'
}
});
var mailOptions = {
    from: 'me <myemailaddress@gmail.com>',
    to: '',
    subject: 'Subject ',
    text: 'Some thing',
  };

  transporter.sendMail(mailOptions, (error, response) => {
    if(error){
        console.log(error);   // Always giving Error: connect ETIMEDOUT 74.125.140.108:465
    } else {
        console.log(response);
    }
});

它甚至都没有尝试登录,因为登录失败会给出错误的凭据错误(使用简单的用户名和密码进行检查)

*注意,请不要将此问题标记为重复,因为我已经检查了几乎所有其他问题和答案,但没有任何效果 有人说这是因为防火墙设置,我也检查了一下,但是没有用 那么问题是什么以及如何解决

2 个答案:

答案 0 :(得分:0)

考虑到您的问题后,我认为在生成OAuth凭证(例如,(clienId和Clientsecret))时,您没有在连接屏幕上的范围内添加https://mail.google.com/,因为您需要使用Google验证表单来为这些范围添加这些范围凭据

您必须已将其添加到(https://developers.google.com/oauthplayground)上的范围内,但是我确定您也已在生成凭据之前在同意屏幕上将其添加到了范围内

OAuth consent screen

处于开发模式并在localhost上运行您的应用程序时,因此您没有私有域和隐私政策

在生成clientId和Cliensecret之前将https://mail.google.com添加到您的作用域将解决您的问题

答案 1 :(得分:0)

您的端口号对于gmail是错误的。将这种格式用于gmail

const nodeMailer = require('nodemailer');

let transporter = nodeMailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    secure: false, // true for 587, false for other ports
    requireTLS: true,
    auth: {
        user: your email, 
        pass: your password, 
    },
});

let mailOptions = {
    from: 'from@gmail.com',
    to: 'to@gmail.com',
    subject: 'Sending Email using Node.js',
    text: 'That was easy!'
};

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