Ответ 1
Я решил это, перейдя по следующему URL-адресу (при подключении к Google с учетной записью, с которой я хочу отправить почту):
https://www.google.com/settings/security/lesssecureapps
Там я включил менее безопасные приложения.
Готово
Я пытаюсь использовать nodemailer для реализации формы контакта с помощью 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('/');
}
});
}
Я решил это, перейдя по следующему URL-адресу (при подключении к Google с учетной записью, с которой я хочу отправить почту):
https://www.google.com/settings/security/lesssecureapps
Там я включил менее безопасные приложения.
Готово
Для подключения к Gmail вам следует использовать токен XOAuth2. Не беспокойтесь, 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);
});
});
};
См. руководство пользователя nodemailer по подключению Gmail:
https://community.nodemailer.com/using-gmail/
-
Он работает для меня после этого:
Простое решение:
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-transport, и, к моему удивлению, он работает. но затем, когда я перезапустил свою систему, он дал мне такую же ошибку, поэтому мне пришлось пойти и включить менее безопасное приложение (я отключил его после моей работы).
то для удовольствия я просто попробовал его с выключенным (менее безопасным приложением) и vola, он снова работает!
У меня была та же проблема. Разрешение "менее безопасных приложений" в моих настройках безопасности Google заставило его работать!
Попробуйте отключить captchas в своей учетной записи gmail; вероятно, срабатывает на основе IP-адреса запрашивающего. Смотрите: Как использовать GMail как бесплатный SMTP-сервер и превзойти captcha
Я работаю таким образом, используя порт и безопасность (у меня были проблемы с отправкой электронной почты из 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);
}
все конфиги перечислены здесь (включая примеры)
То же самое случилось со мной. Я протестировал свою систему на локальном хосте, затем развернул ее на сервер (который находится в другой стране), а затем, когда я пытаюсь запустить систему на сервере, я увидел эту ошибку. Я попробовал их исправить:
Это решается с помощью nodemailer-smtp-transport
внутри createTransport.
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '*******@gmail.com',
pass: '*****password'
}
}));
Ни одно из перечисленных решений не помогло мне. Я использовал код, который существует в документации 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
}
});
Работал нормально:
1- установить nodemailer, пакет, если не установлен (введите cmd): npm install nodemailer
2- перейдите на страницу https://myaccount.google.com/lesssecureapps и включите Разрешить менее безопасные приложения.
3- написать код:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: '[email protected]',
pass: 'truePassword'
}
});
const mailOptions = {
from: '[email protected]', // sender address
to: '[email protected]', // 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- наслаждайся!
Если вы используете Express, express-mailer
wraps 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>
весь ваш код в порядке, только оставшиеся вещи просто идут по ссылке https://myaccount.google.com/security
и продолжайте прокрутку вниз, и вы найдете "Разрешить менее безопасные приложения: ВКЛ и продолжать", вы не найдете ошибки.
Просто добавьте "хост", он будет работать.
host: 'smtp.gmail.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: "[email protected]",
to: to,
subject: subject,
html: HTML
}
, function (err, responseStatus) {
if(responseStatus)
console.log("checking dta", responseStatus.message);
callback(err, responseStatus)
});
});
}
Вы должны добавить в код код secureConnection.
По какой-то причине простое использование менее безопасной конфигурации приложения не сработало для меня, даже с точки зрения безопасности. Мне пришлось сделать еще один шаг, который включает настройку IMAP:
Со страницы справки Google: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin
Я использовал старую версию nodemailer 0.4.1 и имел эту проблему. Я обновился до 0,5.15, и теперь все работает нормально.
Отредактировано package.json, чтобы отразить изменения, затем
npm install
Просто посетите эти: 1- Проверка подлинности Gmail, разрешающая низкоуровневые электронные письма, не принимает, прежде чем перезапустить браузер клиента. 2- Если вы хотите отправлять электронную почту с помощью nodemailer и не хотите использовать там протокол xouath2, вы должны написать в качестве защищенного соединения: 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: '[email protected]',
to:'[email protected]',
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;
Я нашел самый простой способ, описанный в этой статье, упомянутой в ответе Грега Т, - создать пароль приложения, который будет доступен после включения 2FA для учетной записи.
myaccount.google.com> Вход и безопасность> Вход в Google> Пароли приложений
Это дает вам альтернативный пароль для учетной записи, затем вы просто настраиваете nodemailer как обычную службу SMTP.
var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
auth: {
user: "[email protected]",
pass: "app password"
}
});
Хотя Google рекомендует Oauth2 как лучший вариант, этот метод прост и еще не упоминался в этом вопросе.
Дополнительный совет: я также обнаружил, что вы можете добавить имя своего приложения в адрес "от", и GMail не заменяет его просто адресом электронной почты учетной записи, как если бы вы пытались использовать другой адрес. то есть.
from: 'My Pro App Name <[email protected]>'
первая установка nodemailer
npm install nodemailer --save
импортировать в файл js
const nodemailer = require("nodemailer");
const smtpTransport = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "[email protected]",
pass: "password"
},
tls: {
rejectUnauthorized: false
}
});
const mailOptions = {
from: "[email protected]",
to: [email protected],
subject: "Welcome to ",
text: 'hai send from me'.
};
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
}
else {
console.log("mail sent");
}
});
работает в моем приложении
РЕКОМЕНДУЕМЫЕ
Вот полный список воспроизведения для отправки электронной почты с Nodejs, который включает в себя следующее:
Плейлист: https://www.youtube.com/playlist?list=PLurIMwd6GdCiv8ZhpqcwqpFM5Ez4JGago
Примеры Github: https://github.com/accimeesterlin/nodemailer-examples/tree/master/sendEmailWithGmail
Ниже работает для этого
У меня были те же проблемы, пока я не включил lesssecureapps
в своей учетной записи lesssecureapps
. Убедитесь, что у вас НЕ включена двухэтапная проверка, иначе она может не сработать.
этот поток помогает мне с моей проблемой
https://www.google.com/settings/security/lesssecureapps Включено, но это не мое решение https://g.co/allowaccess Я разрешил доступ извне в течение ограниченного времени, и это решило мою проблему.