2013-11-09 346 views
50

我尝试使用nodemailer使用的NodeJS实现一个接触的形式,但它只能在本地并不在远程服务器上工作...Nodemailer与Gmail和的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('/'); 
     } 
    }); 
} 
+4

http://www.google.com/accounts/DisplayUnlockCaptcha(对于知名度,由良好的评论者张贴在下面)。只允许访问一次,让nodemailer自动登录,它会。 – laggingreflex

+3

在尝试了所有使用nodemailer通过gmail发送邮件后,下面的设置对我有用。 – faizanjehangir

回答

25

您应该使用XOAuth2 token来连接到Gmail。不用担心,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() 
     } 
    } 
    }; 

你需要去Google Cloud Console注册您的应用程序。然后,您需要为您想要使用的帐户检索访问令牌。你可以使用passportjs

这里是它的外观在我的代码:

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

有没有更简单的解决方案可以在带有GMail帐户的NodeJS中发送电子邮件? – tonymx227

+8

http://www.google.com/accounts/DisplayUnlockCaptcha - 这对我有用。 –

+1

http://stackoverflow.com/questions/24098461/nodemailer-gmail-what-exactly-is-a-refresh-token-and-how-do-i-get-one/24123550 – laconbass

1

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

编辑的package.json以反映更改然后

npm install 
+1

这是最好做**对于这种情况,npm update **。如果你想了解更多关于** npm update **和** npm install **的不同 - 请看这个答案 - http://stackoverflow.com/questions/12478679/npm-install-vs-update -whats-the-difference –

84

,我首先要到以下网址(同时连接与我想从发送邮件的帐户谷歌)解决了这个:

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

有我启用不够安全的应用。

完成

+1

干得好!它是工作,虽然我不认为这是最好的主意......我得到了我的第一封电子邮件..Thx – ackuser

+1

我有3天寻找解决方案... thx –

+0

应该标记为正确答案 –

3

如果使用快递,包裹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> 
4

对我来说这种方式工作,使用端口和安全(我有问题发送邮件使用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: '[email protected]', // sender address 
    to: '[email protected]', // 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); 
} 

所有的配置都列here(包括示例)

7

同样的问题发生在我身上了。我在localhost上测试了我的系统,然后部署到服务器(位于不同的国家),然后当我在生产服务器上尝试系统时,我看到了这个错误。我尝试了这些解决它:

  1. https://www.google.com/settings/security/lesssecureapps启用它,但它不是我的解决方案
  2. https://g.co/allowaccess我允许从外部访问的有限时间,这解决了我的问题。
+1

https: //g.co/allowaccess链接是为我修复的(已经启用lesssecureapps) - 谢谢! – JoeRocc

4

它使用createTransport中的“nodemailer-smtp-transport”模块进行解析。

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

var transport = nodemailer.createTransport(smtpTransport({ 
    service: 'gmail', 
    auth: { 
     user: '*******@gmail.com', 
     pass: '*****password' 
    } 
})); 
5
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: "[email protected]", 
    to: to, 
    subject: subject, 
    html: HTML 
} 
    , function (err, responseStatus) { 
     if(responseStatus) 
    console.log("checking dta", responseStatus.message); 
    callback(err, responseStatus) 
    }); 
}); 
} 

你必须在你的代码添加secureConnection类型。

2

所有的代码是好的,唯一留下的就是刚去链接https://myaccount.google.com/security

,并保持向下滚动,你会发现允许不够安全的应用的东西:ON,继续,你会发现没有错误。

9

简单的解决方案:

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

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

var mailOptions = { 
    from: '[email protected]', 
    to: '[email protected]', 
    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步:

这里https://myaccount.google.com/lesssecureapps去,使安全性较低的应用程序。如果不工作,那么

步骤2

去这里https://accounts.google.com/DisplayUnlockCaptcha并启用/继续,然后尝试。

我第1步本身并不如此工作,我不得不去步骤2

我还试图消除nodemailer-SMTP-运输包装和我吃惊的是它的工作原理。但后来当我重新启动我的系统时,它给了我同样的错误,所以我不得不去开启不太安全的应用程序(我的工作后禁用它)。

然后为了好玩,我只是试了一下(不太安全的应用程序),并挥发它再次工作!

+0

第1步和第2步非常有帮助。谢谢!在我看到您的解决方案之前,我尝试了step1,但没有成功,但是step2是一种​​魔法! – MissStack

2

非上述解决方案适用于我。我使用了documentation of NodeMailer中存在的代码。它看起来像这样:

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