简体   繁体   English

带有 Gmail 和 NodeJS 的 Nodemailer

[英]Nodemailer with Gmail and NodeJS

I try to use nodemailer to implement a contact form using NodeJS but it works only on local it doesn't work on a remote server...我尝试使用 nodemailer 来实现使用 NodeJS 的联系表单,但它只适用于本地,它不适用于远程服务器......

My error message:我的错误信息:

[website.fr-11 (out) 2013-11-09T15:40:26] { [AuthError: Invalid login - 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787
[website.fr-11 (out) 2013-11-09T15:40:26] 534 5.7.14 54 fr4sm15630311wib.0 - gsmtp]
[website.fr-11 (out) 2013-11-09T15:40:26]   name: 'AuthError',
[website.fr-11 (out) 2013-11-09T15:40:26]   data: '534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX\r\n534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC\r\n534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX\r\n534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r\r\n534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.\r\n534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787\r\n534 5.7.14 54 fr4sm15630311wib.0 - gsmtp',
[website.fr-11 (out) 2013-11-09T15:40:26]   stage: 'auth' }

My controller:我的 controller:

exports.contact = function(req, res){
    var name = req.body.name;
    var from = req.body.from;
    var message = req.body.message;
    var to = '*******@gmail.com';
    var smtpTransport = nodemailer.createTransport("SMTP",{
        service: "Gmail",
        auth: {
            user: "******@gmail.com",
            pass: "*****"
        }
    });
    var mailOptions = {
        from: from,
        to: to, 
        subject: name+' | new message !',
        text: message
    }
    smtpTransport.sendMail(mailOptions, function(error, response){
        if(error){
            console.log(error);
        }else{
            res.redirect('/');
        }
    });
}

I solved this by going to the following url (while connected to google with the account I want to send mail from):我通过访问以下网址解决了这个问题(同时使用我要发送邮件的帐户连接到谷歌):

https://www.google.com/settings/security/lesssecureapps https://www.google.com/settings/security/lesssecureapps

There I enabled less secure apps.在那里我启用了不太安全的应用程序。

Done完毕

See nodemailer's official guide to connecting Gmail:请参阅 nodemailer 的连接 Gmail 的官方指南:

https://community.nodemailer.com/using-gmail/ https://community.nodemailer.com/using-gmail/

- -

It works for me after doing this:这样做后它对我有用:

  1. Enable less secure apps - https://www.google.com/settings/security/lesssecureapps启用不太安全的应用程序 - https://www.google.com/settings/security/lesssecureapps
  2. Disable Captcha temporarily so you can connect the new device/server - https://accounts.google.com/b/0/displayunlockcaptcha暂时禁用验证码,以便您可以连接新设备/服务器 - https://accounts.google.com/b/0/displayunlockcaptcha

Easy Solution:简单的解决方案:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  host: 'smtp.gmail.com',
  auth: {
    user: 'somerealemail@gmail.com',
    pass: 'realpasswordforaboveaccount'
  }
}));

var mailOptions = {
  from: 'somerealemail@gmail.com',
  to: 'friendsgmailacc@gmail.com',
  subject: 'Sending Email using Node.js[nodemailer]',
  text: 'That was easy!'
};

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

Step 1:步骤1:

go here https://myaccount.google.com/lesssecureapps and enable for less secure apps.去这里https://myaccount.google.com/lesssecureapps并启用不太安全的应用程序。 If this does not work then如果这不起作用,那么

Step 2第2步

go here https://accounts.google.com/DisplayUnlockCaptcha and enable/continue and then try.去这里https://accounts.google.com/DisplayUnlockCaptcha并启用/继续,然后尝试。

for me step 1 alone didn't work so i had to go to step 2.对我来说,单独的第 1 步不起作用,所以我不得不进行第 2 步。

i also tried removing the nodemailer-smtp-transport package and to my surprise it works.我还尝试删除 nodemailer-smtp-transport 包,令我惊讶的是它可以工作。 but then when i restarted my system it gave me same error, so i had to go and turn on the less secure app (i disabled it after my work).但是当我重新启动系统时,它给了我同样的错误,所以我不得不去打开不太安全的应用程序(我在工作后禁用了它)。

then for fun i just tried it with off(less secure app) and vola it worked again!然后为了好玩,我只是尝试关闭(不太安全的应用程序)和vola它再次工作!

You should use an XOAuth2 token to connect to Gmail.您应该使用XOAuth2 令牌连接到 Gmail。 No worries, Nodemailer already knows about that:不用担心,Nodemailer 已经知道这一点:

var smtpTransport = nodemailer.createTransport('SMTP', {
    service: 'Gmail',
    auth: {
      XOAuth2: {
        user: smtpConfig.user,
        clientId: smtpConfig.client_id,
        clientSecret: smtpConfig.client_secret,
        refreshToken: smtpConfig.refresh_token,
        accessToken: smtpConfig.access_token,
        timeout: smtpConfig.access_timeout - Date.now()
      }
    }
  };

You'll need to go to the Google Cloud Console to register your app.您需要前往Google Cloud Console注册您的应用。 Then you need to retrieve access tokens for the accounts you wish to use.然后,您需要检索您希望使用的帐户的访问令牌。 You can use passportjs for that.您可以为此使用passportjs

Here's how it looks in my code:这是它在我的代码中的样子:

var passport = require('passport'),
    GoogleStrategy = require('./google_oauth2'),
    config = require('../config');

passport.use('google-imap', new GoogleStrategy({
  clientID: config('google.api.client_id'),
  clientSecret: config('google.api.client_secret')
}, function (accessToken, refreshToken, profile, done) {
  console.log(accessToken, refreshToken, profile);
  done(null, {
    access_token: accessToken,
    refresh_token: refreshToken,
    profile: profile
  });
}));

exports.mount = function (app) {
  app.get('/add-imap/:address?', function (req, res, next) {
    passport.authorize('google-imap', {
        scope: [
          'https://mail.google.com/',
          'https://www.googleapis.com/auth/userinfo.email'
        ],
        callbackURL: config('web.vhost') + '/add-imap',
        accessType: 'offline',
        approvalPrompt: 'force',
        loginHint: req.params.address
      })(req, res, function () {
        res.send(req.user);
      });
  });
};

Worked fine:工作正常:

1- install nodemailer , package if not installed (type in cmd) : npm install nodemailer 1-安装nodemailer ,如果未安装则打包(输入cmd): npm install nodemailer

2- go to https://myaccount.google.com/lesssecureapps and turn on Allow less secure apps . 2- 转到https://myaccount.google.com/lesssecureapps并打开允许不太安全的应用程序

3- write code: 3-编写代码:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'trueUsername@gmail.com',
        pass: 'truePassword'
    }
});

const mailOptions = {
    from: 'any@any.com', // sender address
    to: 'true@true.com', // list of receivers
    subject: 'test mail', // Subject line
    html: '<h1>this is a test mail.</h1>'// plain text body
};

transporter.sendMail(mailOptions, function (err, info) {
    if(err)
        console.log(err)
    else
        console.log(info);
})

4- enjoy! 4-享受!

I had the same problem.我有同样的问题。 Allowing "less secure apps" in my Google security settings made it work!在我的 Google 安全设置中允许“安全性较低的应用程序”使其工作!

Same problem happened to me too.同样的问题也发生在我身上。 I tested my system on localhost then deployed to the server (which is located at different country) then when I try the system on production server I saw this error.我在 localhost 上测试了我的系统,然后部署到服务器(位于不同的国家),然后当我在生产服务器上尝试系统时,我看到了这个错误。 I tried these to fix it:我尝试了这些来修复它:

  1. https://www.google.com/settings/security/lesssecureapps Enabled it but it was not my solution https://www.google.com/settings/security/lesssecureapps启用它,但它不是我的解决方案
  2. https://g.co/allowaccess I allowed access from outside for a limited time and this solved my problem. https://g.co/allowaccess我允许在有限的时间内从外部访问,这解决了我的问题。

Non of the above solutions worked for me.上述解决方案都不适合我。 I used the code that exists in the documentation of NodeMailer .我使用了NodeMailer 文档中存在的代码。 It looks like this:它看起来像这样:

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: 'user@example.com',
        serviceClient: '113600000000000000000',
        privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
}); 

I found the simplest method, described in this article mentioned in Greg T's answer , was to create an App Password which is available after turning on 2FA for the account.我发现Greg T 的回答中提到的这篇文章中描述的最简单的方法是创建一个应用程序密码,该密码在为帐户打开 2FA 后可用。

myaccount.google.com > Sign-in & security > Signing in to Google > App Passwords myaccount.google.com > 登录和安全 > 登录 Google > 应用密码

This gives you an alternative password for the account, then you just configure nodemailer as a normal SMTP service.这为您提供了该帐户的备用密码,然后您只需将 nodemailer 配置为普通的 SMTP 服务。

var smtpTransport = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    auth: {
        user: "username@gmail.com",
        pass: "app password"
    }
});

While Google recommend Oauth2 as the best option, this method is easy and hasn't been mentioned in this question yet.虽然 Google 推荐 Oauth2 作为最佳选择,但此方法很简单,并且尚未在此问题中提及。

Extra tip: I also found you can add your app name to the "from" address and GMail does not replace it with just the account email like it does if you try to use another address.额外提示:我还发现您可以将您的应用程序名称添加到“发件人”地址,并且 GMail 不会像您尝试使用其他地址那样仅将其替换为帐户电子邮件。 ie. IE。

from: 'My Pro App Name <username@gmail.com>'

Try disabling captchas in your gmail account;尝试在您的 gmail 帐户中禁用验证码; probably being triggered based on IP address of requestor.可能是根据请求者的 IP 地址触发的。 See: How to use GMail as a free SMTP server and overcome captcha请参阅: 如何将 GMail 用作免费 SMTP 服务器并克服验证码

For me is working this way, using port and security (I had issues to send emails from gmail using PHP without security settings)对我来说,使用端口和安全性以这种方式工作(我在没有安全设置的情况下使用 PHP 从 gmail 发送电子邮件时遇到问题)

I hope will help someone.我希望能帮助某人。

var sendEmail = function(somedata){
  var smtpConfig = {
    host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL, 
                  // you can try with TLS, but port is then 587
    auth: {
      user: '***@gmail.com', // Your email id
      pass: '****' // Your password
    }
  };

  var transporter = nodemailer.createTransport(smtpConfig);
  // replace hardcoded options with data passed (somedata)
  var mailOptions = {
    from: 'xxxx@gmail.com', // sender address
    to: 'yyyy@gmail.com', // list of receivers
    subject: 'Test email', // Subject line
    text: 'this is some text', //, // plaintext body
    html: '<b>Hello world ✔</b>' // You can choose to send an HTML body instead
  }

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

exports.contact = function(req, res){
   // call sendEmail function and do something with it
   sendEmail(somedata);
}

all the config are listed here (including examples)此处列出了所有配置(包括示例)

It is resolved using nodemailer-smtp-transport module inside createTransport.它是使用 createTransport 中nodemailer-smtp-transport模块解决的。

var smtpTransport = require('nodemailer-smtp-transport');

var transport = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '*******@gmail.com',
        pass: '*****password'
    }
}));

Many answers advice to allow less secure apps which is honestly not a clean solution.许多答案建议允许安全性较低的应用程序,老实说这不是一个干净的解决方案。

Instead you should generate an app password dedicated to this use:相反,您应该生成一个专用于此用途的应用程序密码

  1. Log in to your Google account登录您的 Google 帐户
  2. Go to security安检
  3. Under Signing in to Google enable 2-Step Verification登录 Google下启用两步验证
  4. Under Signing in to Google click on App passwords .Signing in to Google下,点击App passwords
  5. You'll now generate a new password.您现在将生成一个新密码。 Select the app as Mail and the device as Other (Custom name) and name it.选择应用程序作为邮件和设备作为其他(自定义名称)并命名。
  6. Save the app password保存应用密码

You can now use this app password instead of your log in password.您现在可以使用此应用程序密码代替您的登录密码。

If you use Express, express-mailer wraps nodemailer very nicely and is very easy to use:如果你使用 Express, express-mailer很好地包装nodemailer并且非常易于使用:

//# config/mailer.js    
module.exports = function(app) {
  if (!app.mailer) {
    var mailer = require('express-mailer');
    console.log('[MAIL] Mailer using user ' + app.config.mail.auth.user);
    return mailer.extend(app, {
      from: app.config.mail.auth.user,
      host: 'smtp.gmail.com',
      secureConnection: true,
      port: 465,
      transportMethod: 'SMTP',
      auth: {
        user: app.config.mail.auth.user,
        pass: app.config.mail.auth.pass
      }
    });
  }
};

//# some.js
require('./config/mailer.js)(app);
app.mailer.send("path/to/express/views/some_view", {
  to: ctx.email,
  subject: ctx.subject,
  context: ctx
}, function(err) {
  if (err) {
    console.error("[MAIL] Email failed", err);
    return;
  }
  console.log("[MAIL] Email sent");
});

//#some_view.ejs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title><%= subject %></title>
  </head>
  <body>
  ... 
  </body>
</html>

For some reason, just allowing less secure app config did not work for me even the captcha thing.出于某种原因,即使是验证码,只允许不太安全的应用程序配置对我也不起作用。 I had to do another step which is enabling IMAP config:我不得不做另一个步骤,即启用 IMAP 配置:

From google's help page: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin从谷歌的帮助页面: https ://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • In the top right, click Settings Settings.在右上角,单击设置设置。
  • Click Settings.单击设置。
  • Click the Forwarding and POP/IMAP tab.单击转发和 POP/IMAP 选项卡。
  • In the "IMAP Access" section, select Enable IMAP.在“IMAP 访问”部分中,选择启用 IMAP。
  • Click Save Changes.单击保存更改。

all your code is okay only the things left is just go to the link https://myaccount.google.com/security您所有的代码都可以,只剩下剩下的就是转到链接https://myaccount.google.com/security

and keep scroll down and you will found Allow less secure apps: ON and keep ON, you will find no error.并继续向下滚动,你会发现允许不太安全的应用程序:打开并保持打开,你会发现没有错误。

Just add "host" it will work .只需添加“主机”就可以了。

host: 'smtp.gmail.com'

Then enable "lesssecureapps" by clicking bellow link然后通过单击下面的链接启用“lesssecureapps”

https://myaccount.google.com/lesssecureapps https://myaccount.google.com/lesssecureapps

exports.mailSend = (res, fileName, object1, object2, to, subject,   callback)=> {
var smtpTransport = nodemailer.createTransport('SMTP',{ //smtpTransport
host: 'hostname,
port: 1234,
secureConnection: false,
//   tls: {
//     ciphers:'SSLv3'
// },
auth: {
  user: 'username',
  pass: 'password'
}

});
res.render(fileName, {
info1: object1,
info2: object2
}, function (err, HTML) {

smtpTransport.sendMail({
  from: "mail@from.com",
  to: to,
  subject: subject,
  html: HTML
}
  , function (err, responseStatus) {
      if(responseStatus)
    console.log("checking dta", responseStatus.message);
    callback(err, responseStatus)
  });
});
}

You must add secureConnection type in you code.您必须在代码中添加 secureConnection 类型。

I was using an old version of nodemailer 0.4.1 and had this issue.我使用的是旧版本的 nodemailer 0.4.1 并且遇到了这个问题。 I updated to 0.5.15 and everything is working fine now.我更新到 0.5.15,现在一切正常。

Edited package.json to reflect changes then编辑 package.json 以反映更改

npm install

Just attend those: 1- Gmail authentication for allow low level emails does not accept before you restart your client browser 2- If you want to send email with nodemailer and you wouldnt like to use xouath2 protocol there you should write as secureconnection:false like below只需参加这些: 1-在您重新启动客户端浏览器之前不接受允许低级别电子邮件的 Gmail 身份验证 2-如果您想使用 nodemailer 发送电子邮件并且您不想使用 xouath2 协议,您应该写为 secureconnection:false 如下所示

const routes = require('express').Router();
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');



routes.get('/test', (req, res) => {
  res.status(200).json({ message: 'test!' });
});

routes.post('/Email', (req, res) =>{

    var smtpTransport = nodemailer.createTransport({
        host: "smtp.gmail.com",
        secureConnection: false,
        port: 587,
        requiresAuth: true,
        domains: ["gmail.com", "googlemail.com"],
        auth: {
            user: "your gmail account", 
            pass: "your password*"
        }
});  

  var mailOptions = {
      from: 'from@gmail.com',
      to:'to@gmail.com',
      subject: req.body.subject,
      //text: req.body.content,
      html: '<p>'+req.body.content+' </p>'
  };

  smtpTransport.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log('Error while sending mail: ' + error);
    } else {
        console.log('Message sent: %s', info.messageId);
    }
    smtpTransport.close();
});  

})

module.exports = routes;

first install nodemailer首先安装nodemailer

npm install nodemailer  --save

import in to js file导入到js文件

const nodemailer = require("nodemailer");

const smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "example@gmail.com",
        pass: "password"
    },
    tls: {
        rejectUnauthorized: false
    }
});






 const mailOptions = {
        from: "example@gmail.com",
        to: sending@gmail.com,
        subject: "Welcome to ",
        text: 'hai send from me'.
    };


    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
        }
        else {
            console.log("mail sent");
        }
    });

working in my application在我的应用程序中工作

You may need to " Allow Less Secure Apps " in your Gmail account (it's all the way at the bottom).您可能需要在您的 Gmail 帐户中“允许不太安全的应用程序”(它一直在底部)。 You also may need to " Allow access to your Google account ".您可能还需要“允许访问您的 Google 帐户”。 You also may need to " Allow access to your Google account ".您可能还需要“允许访问您的 Google 帐户”。

This is my Nodemailer configuration which worked after some research.这是我的Nodemailer 配置,经过一些研究后工作。

Step 1: Enable lesssecureapp第 1 步:启用 lesssecureapp

https://www.google.com/settings/security/lesssecureapps 

Step 2: The Nodemailer configuration for Gmail第 2 步:Gmail 的 Nodemailer 配置

Setting up the transporter : A transporter is going to be an object that can send mail.设置传输器:传输器将成为可以发送邮件的对象。 It is the transport configuration object, connection URL, or a transport plugin instance它是传输配置对象、连接 URL 或传输插件实例

let transporter = nodemailer.createTransport({
    service: 'gmail',                              // the service used
    auth: {
        user: process.env.EMAIL_FROM,              // authentication details of sender, here the details are coming from .env file
        pass: process.env.EMAIL_FROM_PASSWORD,
    },
});

Writing the message写消息

const message = {
    from: 'myemail@gmail.com',                         // sender email address
    to: "receiver@example.com, receiver2@gmail.com",   // reciever email address
    subject: `The subject goes here`,
    html: `The body of the email goes here in HTML`,
    attachments: [
    {
      filename: `${name}.pdf`,
      path: path.join(__dirname, `../../src/assets/books/${name}.pdf`),
      contentType: 'application/pdf',
    },
  ],

Sending the mail发送邮件

transporter.sendMail(message, function (err, info) {
    if (err) {                                            // if error
        console.log(err);
    } else {
        console.log(info);                                // if success
    }
});

I also had issues with nodemailer email sending when running on Vercel lambda in production.在生产环境中运行 Vercel lambda 时,我也遇到了 nodemailer 电子邮件发送的问题。

What fixed it in my case was to await for sendMail Promise to resolve.在我的情况下解决它的是等待 sendMail Promise 解决。

I also added nodemailer-smtp-transport like suggested in this thread but I don't think it made a difference.我还添加了 nodemailer-smtp-transport 就像在这个线程中建议的那样,但我认为它没有什么不同。

Here is my whole function:这是我的整个功能:

const nodemailer = require('nodemailer');
const smtpTransport = require('nodemailer-smtp-transport');


const transporter = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '***@gmail.com',
        pass: process.env.SMTP_PASSWORD,
    },
}));


async function contact(req: any, res: any) {
    try {
        const response = await transporter.sendMail({
            from: '"*** <***gmail.com>', // sender address
            to: "***@gmail.com", // list of receivers
            subject: `***`, // Subject line
            html: `${req.body.message}<br/><br/>${req.body.firstname} ${req.body.lastname} - <b>${req.body.email}</b>`, // html body
        });
    } catch (error: any) {
        console.log(error);
        return res.status(error.statusCode || 500).json({ error: error.message });
    }

    return res.status(200).json({ error: "" });
}

export default contact;

Google has disabled the Less Secure App Access, Below is New Process to use Gmail in Nodejs Google 已禁用不太安全的应用程序访问,以下是在 Nodejs 中使用 Gmail 的新流程

  1. Now you have to enable 2 Step Verification in Google ( How to Enable 2 Step Auth )现在您必须在 Google 中启用两步验证(如何启用两步验证
  2. You need to generate App Specific Password.您需要生成应用专用密码。 Goto Google My Account > Security转到Google 我的帐户 > 安全性
  3. Click on App Password > Select Other and you will get App Password点击应用密码 > 选择其他,您将获得应用密码
  4. You can use normal smtp with email and App password.您可以使用带有电子邮件和应用程序密码的普通 smtp。

Less secure option is not supported anymore by gmail. gmail 不再支持不太安全的选项。

For sending email from third party, gmail is also not allowing with its user password .对于从第三方发送电子邮件,gmail 也不允许使用其用户密码

You should now use App Password to resolve this issue.您现在应该使用应用密码来解决此问题。 Hope this link will help to set your app password.希望此链接有助于设置您的应用密码。 https://support.google.com/mail/answer/185833?hl=en https://support.google.com/mail/answer/185833?hl=en

This approach is no longer supported by gmail gmail 不再支持这种方法

在此处输入图像描述

在此处输入图像描述

As pointed out by Yaach, as of May 30th, 2022, Google no longer supports Less Secure Apps, and instead switched over to their own Gmail API .正如 Yaach 指出的那样,截至 2022 年 5 月 30 日,Google 不再支持不太安全的应用程序,而是切换到他们自己的Gmail API

Here is the sample code for Gmail SMTP with nodemailer.这是 Gmail SMTP 和 nodemailer 的示例代码。

"use strict";
const nodemailer = require("nodemailer");

async function main() {
    let transporter = nodemailer.createTransport({
        host: "smtp.gmail.com",
        transportMethod: "SMTP",
        secureConnection: true,
        port: 465,
        secure: true, // upgrade later with STARTTLS
        auth: {
            user: "yourEmail@gmail.com",
            pass: "Your App  Specific password",
        },
    });

    let info = await transporter.sendMail(
        {
            from: "yourEmail@gmail.com",
            to: "to@gmail.com",
            subject: "Testing Message Message",
            text: "I hope this message gets delivered!",
            html: "<b>Hello world?</b>", // html body
        },
        (err, info) => {
            if (err) {
                console.log(err);
            } else {
                console.log(info.envelope);
                console.log(info.messageId);
            }
        }
    );
}

main();

Enabling "less secure" apps is not longer available from google.谷歌不再提供启用“不太安全”的应用程序。 A better way is to use application passwords.更好的方法是使用应用程序密码。 See scipilot's answer down below.请参阅下面的 scipilot 答案。

I post this as an answer because I still have not enough rep to post comments.我将其发布为答案,因为我仍然没有足够的代表发表评论。

There is another option to use SendGrid for email delivery with no failure.还有另一个选项可以使用 SendGrid 进行电子邮件传递而不会失败。 A lot of the time, Nodemailer gives failure for mail which could happen frequently.很多时候,Nodemailer 会给出可能经常发生的邮件失败。

Nodemailer can be found in the link. Nodemailer可以在链接中找到。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM