2013-11-09 15 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 (для обзора, опубликованного хорошим комментатором ниже). Просто разрешите доступ один раз и позвольте автозагрузчику автоматически войти в систему. – laggingreflex

+3

После попытки отправить почту через gmail с помощью nodemailer, следующий параметр работал для меня .. – 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

Есть ли более легкое решение для отправки электронной почты в NodeJS с учетной записью GMail? – 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 ** different - тогда, пожалуйста, см. Этот ответ - http://stackoverflow.com/questions/12478679/npm-install-vs-update -whats-the-difference –

84

Я решил эту проблему, перейдя по следующей ссылке (при подключении к Google с учетной записью я хочу отправить почту с):

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

Там я активировал менее защищенные приложения.

Совершено

+1

Молодцы! он работает, хотя я не думаю, что это лучшая идея ... Я получил свой первый адрес электронной почты ..Thx – ackuser

+1

У меня было 3 дня, чтобы найти решение ... thx –

+0

Должен быть отмечен как правильный ответ –

3

Если вы используете 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> 
12

У меня была такая же проблема. Allowing "less secure apps" в моих настройках безопасности Google заставило его работать!

4

Для меня работает таким образом, используя порт и безопасность (я имел проблемы для отправки сообщений электронной почты из Gmail с помощью PHP без настроек безопасности)

Я надеюсь, что кому-то поможет.

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

Такая же проблема случилось со мной тоже. Я протестировал свою систему на локальном хосте, затем развернул ее на сервер (который находится в другой стране), а затем, когда я пытаюсь запустить систему на сервере, я увидел эту ошибку.Я попытался это исправить:

  1. https://www.google.com/settings/security/lesssecureapps Enabled его, но это было не мое решение
  2. https://g.co/allowaccess я разрешен доступ извне в течение ограниченного времени, и это решить мою проблему.
+1

https: //g.co/allowaccess - это то, что исправлено для меня (уже включил lesssecureapps) - спасибо! – JoeRocc

4

Он разрешен с использованием модуля «nodemailer-smtp-transport» внутри createTransport.

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

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

Смотреть официальное руководство nodemailer, чтобы соединительный Gmail:

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

-

Это работает для меня после того, как это сделать:

  1. Включить менее безопасные приложения - https://www.google.com/settings/security/lesssecureapps
  2. Отключить Captcha временно, так что вы можете подключить новое устройство/сервер - https://accounts.google.com/b/0/displayunlockcaptcha
+3

Номер 2 решил мои беды. Я не мог найти эту ссылку в настройках учетных записей Google. Спасибо! – programstinator

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 и держать 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-транспортный пакет и к моему удивлению, он работает. но затем, когда я перезапустил свою систему, он дал мне такую ​​же ошибку, поэтому мне пришлось пойти и включить менее безопасное приложение (я отключил его после моей работы).

Тогда для удовольствия я просто попробовал это с выключенным (менее безопасным приложением) и vola, это сработало снова!

+0

Шаг 1 и 2 были очень полезными. Спасибо! Я попробовал step1, прежде чем увидел ваше решение и не работал, но с шагом 2 это волшебство! – 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 
    } 
}); 
Смежные вопросы