Nodemailer с Gmail и NodeJS

Я пытаюсь использовать 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('/');
        }
    });
}

person tonymx227    schedule 09.11.2013    source источник
comment
google.com/accounts/DisplayUnlockCaptcha (для наглядности опубликовано хорошим комментатором внизу). Просто разрешите доступ один раз и позвольте nodemailer автоматически войти в систему, и он будет.   -  person laggingreflex    schedule 21.10.2014
comment
После того, как я попробовал все для отправки почты через Gmail с помощью nodemailer, у меня сработал следующий параметр ..   -  person faizanjehangir    schedule 16.08.2015
comment
Если вам интересно, откуда берется опция service (когда я заходил на эту страницу), скрытая страница документации - это здесь. Я называю это скрытым, потому что его нет в меню, если вы не находитесь на этой странице. И логотип другой.   -  person x-yuri    schedule 24.04.2021


Ответы (21)


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

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

Там я включил менее безопасные приложения.

Выполнено

person brafdlog    schedule 26.11.2014
comment
Отличная работа! он работает, хотя я не думаю, что это лучшая идея ... Я получил свое первое электронное письмо .. Спасибо - person ackuser; 31.03.2015
comment
без включения этого он не будет работать даже в локальной среде. он четко упомянул, что он работает в локальной среде и не работает на удаленном сервере. какое решение для этого? - person Adithya Sai; 05.03.2019
comment
это не может вам помочь, если у вас есть двухфакторная аутентификация в вашей учетной записи Gmail. - person sasha romanov; 01.06.2019
comment
метод с низким уровнем безопасности был временным, и я не мог использовать его в производстве, но я нашел статью, которая упростила использование OAuth для аутентификации в Gmail [здесь] [1] с помощью примера кода, и он отлично работает вот ссылка - person sahli bessam; 06.09.2020
comment
Это не подходящее решение для производства. - person EuberDeveloper; 25.03.2021

См. Официальное руководство 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
person Greg T    schedule 25.01.2017
comment
Номер 2 решил мои проблемы. Я не мог найти эту ссылку в настройках учетных записей Google. Спасибо! - person programstinator; 25.04.2017
comment
То же самое. Раньше я делал №1 и получал письма, работающие на localhost, перешел на продакшн, и ничего не работало. # 2 исправлена ​​моя проблема с производством. Спасибо - person John; 09.01.2020

Простое решение:

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

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

person Zaheen    schedule 08.08.2017
comment
Шаги 1 и 2 были очень полезны. благодарю вас! Я попробовал шаг 1, прежде чем увидел ваше решение, и не работал, но с шагом 2 это волшебство! - person MissStack; 26.09.2017
comment
smptTransport не является функцией - person JWiley; 26.08.2018
comment
Я пробовал использовать оба способа, которыми вы поделились с нами, но снова и снова получаю одну и ту же ошибку {Ошибка: подключите ETIMEDOUT 74.125.68.108:465 в TCPConnectWrap.afterConnect [as oncomplete] (net.js: 1097: 14) errno: ' ETIMEDOUT ', код:' ECONNECTION ', системный вызов:' connect ', адрес: '74 .125.68.108', порт: 465, команда: 'CONN'} - person Anwar Hussain; 03.05.2019
comment
Сначала пришлось выйти из Gmail по умолчанию. Gmail по какой-то причине не позволяет изменить учетную запись по умолчанию и не позволяет выполнить второй шаг с выбранной учетной записью. - person Hasan Sefa Ozalp; 01.11.2020
comment
Обновление 2020: Nodemailer больше не требует пакета nodemailer-smtp-transport; он встроен. Теперь вы можете использовать приведенный выше код с объектом в качестве аргумента для createTransport вместо smtpTransport({}) в качестве аргумента - person J.E.C.; 01.12.2020

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

Вот как это выглядит в моем коде:

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);
      });
  });
};
person Laurent Perrin    schedule 09.11.2013
comment
Есть ли более простое решение для отправки электронной почты в NodeJS с учетной записью GMail? - person tonymx227; 12.11.2013
comment
stackoverflow.com/questions/24098461/ - person laconbass; 05.05.2015
comment
Можете ли вы объяснить, что делает Passport.authorize и почему вам нужна область видимости, callbackurl и т. д., почему вы не можете просто сделать это с помощью clientId и secret? - person Ismail; 08.11.2018
comment
passport.authorize похож на passport.authenticate, за исключением того, что он не пытается обновить текущий сеанс. Вам нужно передать callbackURL, потому что после подтверждения OAuth Google должен знать, куда перенаправить пользователя, чтобы рукопожатие было завершено. - person Laurent Perrin; 09.11.2018
comment
Это должно быть правильным решением, когда вы работаете на производстве. - person EuberDeveloper; 18.05.2021

Работали нормально:

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- наслаждайтесь!

person Mohammad Masoudzadeh    schedule 24.10.2018
comment
Спасибо! Это было действительно полезно. - person Dominique; 27.12.2020
comment
пожалуйста, Доминик. - person Mohammad Masoudzadeh; 09.01.2021

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

person Daniel says Reinstate Monica    schedule 08.04.2015

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

  1. https://www.google.com/settings/security/lesssecureapps Включил, но это не было моим решением
  2. https://g.co/allowaccess Я разрешил доступ извне в течение ограниченного времени, и это решило мою проблему.
person Ahmet Can Güven    schedule 28.10.2016
comment
Ссылка g.co/allowaccess была тем, что исправило это для меня (я уже включил lesssecureapps) - спасибо! - person ; 07.02.2017

Ни одно из вышеперечисленных решений не помогло мне. Я использовал код, который существует в документации 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
    }
}); 
person Hamid    schedule 27.08.2017
comment
Спасибо дружище ! :) thissss --- ›host: 'smtp.gmail.com', порт: 465, secure: true, работал у меня - person Praveen Vishnu; 06.12.2018
comment
@PraveenVishnu Нет проблем, если вы проголосуете за этот ответ, его увидят больше людей. Это могло бы помочь и им. - person Hamid; 10.01.2019
comment
привет, я знаю, что это уже старый, но не могли бы вы, где вы взяли serviceClient, privateKey и accessToken? Спасибо. - person Aljohn Yamaro; 12.07.2020
comment
@AljohnYamaro Почта предоставит его. В моем случае это был Gmail. Вы можете узнать больше здесь: stackoverflow.com/questions/36214968/ - person Hamid; 14.07.2020

Попробуйте отключить капчу в своем аккаунте Gmail; вероятно, запускается на основе IP-адреса запрашивающей стороны. См .: Как использовать GMail в качестве бесплатный SMTP сервер и преодоление капчи

person sfnd    schedule 30.01.2014

Для меня работает так, используя порт и безопасность (у меня были проблемы с отправкой писем из 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);
}

все конфигурации перечислены здесь (включая примеры)

person Angel M.    schedule 25.06.2016

Я нашел самый простой метод, описанный в этой статье, упомянутой в Ответ Грега Т заключался в создании пароля приложения, который становится доступным после включения двухфакторной аутентификации для учетной записи.

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]>'
person scipilot    schedule 29.06.2018
comment
Всегда использую this1. Вам нужно установить 2-заводскую аутентификацию, чтобы установить пароль приложения. Напротив, менее надежно. - person gdfgdfg; 04.04.2020

Это решается с помощью модуля nodemailer-smtp-transport внутри createTransport.

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

var transport = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '*******@gmail.com',
        pass: '*****password'
    }
}));
person Girish Rathod    schedule 24.12.2016
comment
что, если в моем пароле есть специальные символы, такие как @, нужно ли преобразовать их в% 40? - person Siddharth Choudhary; 13.04.2021

По какой-то причине просто разрешение менее безопасной конфигурации приложения не сработало для меня даже с капчей. Мне пришлось сделать еще один шаг, который включил конфигурацию IMAP:

Со страницы справки Google: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • В правом верхнем углу нажмите "Настройки".
  • Щелкните "Настройки".
  • Щелкните вкладку Пересылка и POP / IMAP.
  • В разделе «Доступ по протоколу IMAP» выберите Включить IMAP.
  • Щелкните Сохранить изменения.
person mel3kings    schedule 06.08.2018

Если вы используете Express, express-mailerwrapsnodemailer очень красиво и очень просто:

//# 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>
person malix    schedule 22.12.2014

весь ваш код в порядке, только то, что осталось, просто перейдите по ссылке https://myaccount.google.com/security

и продолжайте прокручивать вниз, и вы найдете Разрешить менее безопасные приложения: ВКЛЮЧИТЬ и удерживайте, вы не обнаружите ошибок.

person Y. Joy Ch. Singha    schedule 27.06.2017

Просто добавь «хост», и все заработает.

host: 'smtp.gmail.com'

Затем включите «менее безопасные приложения», щелкнув ссылку ниже

https://myaccount.google.com/lesssecureapps

person Milan Panigrahi    schedule 03.05.2018

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.

person aaditya    schedule 07.02.2017

Я использовал старую версию nodemailer 0.4.1 и столкнулся с этой проблемой. Я обновился до 0.5.15, и теперь все работает нормально.

Отредактировал package.json, чтобы отразить изменения, затем

npm install
person user1071182    schedule 16.12.2013
comment
В этом случае лучше выполнить обновление npm. Если вы хотите узнать больше о различиях между npm update и npm install, просмотрите этот ответ - stackoverflow.com/questions/12478679/ - person Anthony Akentiev; 01.07.2015

Просто обратите внимание на них: 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: '[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;
person Hamit YILDIRIM    schedule 15.03.2018
comment
smtpTransport используется дважды, какой из них какой? - person Biranchi; 10.01.2019
comment
На самом деле, это очень ясно.Первый предназначен для создания настроек smtpTransport, а второй - для отправки почты, используя эти настройки, и теперь он отлично работает в firebase. - person Hamit YILDIRIM; 24.02.2019
comment
Почему вы дважды использовали var для smtpTransport? - person Biku7; 15.12.2020
comment
Я не мог вспомнить слишком много времени, но вы видите, что это другой объем. Функция стрелки делает другую область видимости. Это очень простая техническая информация. - person Hamit YILDIRIM; 15.12.2020

первая установка 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");
        }
    });

работаю в моем приложении

person arul mb    schedule 10.08.2018

Есть еще один вариант использования SendGrid для бесперебойной доставки электронной почты. В большинстве случаев Nodemailer дает сбой при отправке почты, что может происходить довольно часто.

Nodemailer можно найти по ссылке.

person Himanshu Joshi    schedule 17.06.2021
comment
Я не думаю, что это ответ на вопрос. - person Adithya Sreyaj; 17.06.2021