Javascript 带Gmail和NodeJS的nodeEmailer

Javascript 带Gmail和NodeJS的nodeEmailer,javascript,node.js,nodemailer,Javascript,Node.js,Nodemailer,我尝试使用nodeEmailr来实现一个使用NodeJS的联系人表单,但是它只在本地工作,在远程服务器上不工作 我的错误消息: [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)

我尝试使用nodeEmailr来实现一个使用NodeJS的联系人表单,但是它只在本地工作,在远程服务器上不工作

我的错误消息:

[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' }
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('/');
        }
    });
}
你应该使用连接到Gmail的。不用担心,NodeEmailer已经知道了:

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()
      }
    }
  };
您需要转到以注册您的应用程序。然后,您需要为希望使用的帐户检索访问令牌。你可以用它

以下是我的代码中的外观:

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);
      });
  });
};

我使用的是旧版本的nodemailer 0.4.1,出现了这个问题。我更新到0.5.15,现在一切正常

编辑package.json以反映更改

npm install

尝试在你的gmail帐户中禁用CAPTCHA;可能是根据请求者的IP地址触发的。
请参阅:

我通过以下url解决了这个问题(使用我想发送邮件的帐户连接到google):

在那里,我启用了不太安全的应用程序


完成

如果您使用Express,
Express-mailer
NodeEmailr
包装得非常好,并且非常易于使用:

//# 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>
/#config/mailer.js
module.exports=函数(应用程序){
如果(!app.mailer){
var-mailer=require('express-mailer');
log(“[MAIL]Mailer使用用户”+app.config.MAIL.auth.user);
返回mailer.extend(应用程序{
发件人:app.config.mail.auth.user,
主机:“smtp.gmail.com”,
安全连接:正确,
港口:465,
transportMethod:'SMTP',
认证:{
用户:app.config.mail.auth.user,
通过:app.config.mail.auth.pass
}
});
}
};
//#some.js
需要('./config/mailer.js)(应用程序);
app.mailer.send(“path/to/express/views/some_view”{
致:ctx.email,
主题:ctx.subject,
上下文:ctx
},函数(err){
如果(错误){
控制台错误(“[MAIL]电子邮件失败”,错误);
返回;
}
console.log(“[MAIL]已发送电子邮件”);
});
//#一些_view.ejs
... 

我也有同样的问题。在我的谷歌安全设置使它工作

对于我来说,使用端口和安全性是这样工作的(我在没有安全设置的情况下使用PHP从gmail发送电子邮件时遇到了问题)

我希望你能帮助别人

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);
}
var sendmail=function(somedata){
var smtpConfig={
主机:“smtp.gmail.com”,
港口:465,
secure:true,//使用SSL,
//您可以尝试使用TLS,但端口为587
认证:{
用户:'***@gmail.com',//您的电子邮件id
密码:'***'//您的密码
}
};
var transporter=nodeEmailer.createTransport(smtpConfig);
//用传递的数据替换硬编码选项(somedata)
var mailpoptions={
发件人:'xxxx@gmail.com“,//发件人地址
致:'yyyy@gmail.com“,//接收者列表
主题:'测试电子邮件',//主题行
text:'这是一些文本',//,//纯文本正文
你好,世界✔' // 您可以选择发送HTML正文
}
transporter.sendMail(邮件选项,函数(错误,信息){
如果(错误){
返回false;
}否则{
console.log('发送的消息:'+信息响应);
返回true;
};
});
}
exports.contact=功能(请求、回复){
//调用sendEmail函数并对其进行处理
发送电子邮件(somedata);
}

列出了所有配置(包括示例)

同样的问题也发生在我身上。我在本地主机上测试了我的系统,然后将其部署到服务器(位于不同的国家/地区),然后在生产服务器上尝试该系统时,我看到了这个错误。我尝试了以下方法来修复它:

  • 启用了它,但它不是我的解决方案
  • 我允许从外面进入有限的时间,这解决了我的问题

  • 它是通过createTransport中的
    nodeEmailer smtp传输
    模块解决的

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

    请参阅NodeEmailer的官方Gmail连接指南:

    -

    完成此操作后,它对我有效:

  • 启用不太安全的应用程序-
  • 暂时禁用验证码,以便您可以连接新设备/服务器-

  • 您必须在代码中添加secureConnection类型。

    所有代码都正常,只剩下转到链接即可


    继续向下滚动,你会发现允许不太安全的应用:打开并继续,你不会发现任何错误

    简易解决方案:

    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);
      }
    });  
    
    第1步:

    转到此处并启用不太安全的应用程序。如果这不起作用,那么

    步骤2

    转到此处并启用/继续,然后重试

    对我来说,单是第一步不起作用,所以我不得不进入第二步

    我还尝试删除nodemailer smtp传输包,令我惊讶的是,它居然能正常工作。但是当我重新启动系统时,它给了我同样的错误,所以我不得不去打开不太安全的应用程序(我在工作后禁用了它)


    然后,为了好玩,我只是用off(不太安全的应用)和vola试了一下,它又成功了

    上述解决方案中没有一个对我有效。我使用了中存在的代码。看起来是这样的:

    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
        }
    }); 
    
    只需参加以下活动: 1-在重新启动客户端浏览器之前,不接受允许低级别电子邮件的Gmail身份验证 2-如果你想用nodeEmailer发送电子邮件,但你不想使用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;
    
    const routes=require('express').Router();
    var nodeEmailer=require('nodeEmailer');
    var smtpTransport=require('nodemailer-smtp-transport');
    routes.get('/test',(req,res)=>{
    res.status(200).json({message:'test!'});
    });
    routes.post('/Email',(请求、回复)=>{
    var smtpTransport=nodemailer.createTransport({
    主机:“smtp.gmail.com”,
    安全连接:false,
    港口:587,
    是的,
    域名:[“gmail.com”、“googlemail.com”],
    认证:{
    用户:“您的gmail帐户”,
    通过:“您的密码*”
    }
    });  
    var mailpoptions={
    发件人:'from@gmail.com',
    致:'to@gmail.com',
    主题:req.body.subject,
    //文本:req.body.content,
    html:“”+req.body.conten
    
    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;
    
    host: 'smtp.gmail.com'
    
    var smtpTransport = nodemailer.createTransport({
        host: "smtp.gmail.com",
        port: 587,
        auth: {
            user: "username@gmail.com",
            pass: "app password"
        }
    });
    
    from: 'My Pro App Name <username@gmail.com>'
    
    npm install nodemailer  --save
    
    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");
            }
        });
    
    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);
    })