Отправка электронной почты через Node.js с помощью nodemailer не работает

Я установил базовый сервер NodeJS (используя модуль nodemailer) локально (http://localhost:8080) только для того, чтобы проверить, действительно ли сервер может отправлять электронные письма.

Если я правильно понял параметр SMTP (пожалуйста, поправьте меня, если я ошибаюсь), я могу либо попытаться отправить электронное письмо с моего сервера кому-то прямо на адрес электронной почты, или. Я могу отправить электронной почты, по-прежнему используя Node.js, но через реальную учетную запись электронной почты (в данном случае мою личную учетную запись Gmail), то есть используя SMTP. Этот параметр требует, чтобы я заходил в эту учетную запись удаленно через NodeJS.

Итак, на сервере ниже я фактически пытаюсь использовать NodeJs для отправки электронной почты с моей личной учетной записи электронной почты на мою личную учетную запись электронной почты.

Здесь мой простой сервер:

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport("SMTP", {
    service: 'Gmail',
    auth: {
        user: '*my personal Gmail address*',
        pass: '*my personal Gmail password*'
    }
});

var http = require('http');
var httpServer = http.createServer(function (request, response)
{
    transporter.sendMail({
       from: '*my personal Gmail address*',
       to: '*my personal Gmail address*',
       subject: 'hello world!',
       text: 'hello world!'
    });
}).listen(8080);

Однако он не работает. Я получил электронное письмо от Google:

Учетная запись Google: попытка входа в аккаунт заблокирована Если это ты Вы можете переключиться на приложение Google, такое как Gmail, для доступа к вашей учетной записи (рекомендуется) или изменения ваши настройки в https://www.google.com/settings/security/lesssecureapps, чтобы ваша учетная запись не была более долгое время защищенными современными стандартами безопасности.

Я не мог найти решение этой проблемы на странице nodemailer GitHub. Кто-нибудь имеет решение/предложение?

Спасибо!: -)

Ответ 1

Ответ в сообщении от Google.

Для второй части проблемы и в ответ на

На самом деле я просто выполняю шаги с страницы github nodemailer, поэтому в моем коде нет ошибок.

Я отсылаю вас к странице github nodemailer, и этот фрагмент кода:

var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
    user: '[email protected]',
    pass: 'userpass'
}
});

Он немного отличается от вашего кода, в том, что у вас есть: nodemailer.createTransport("SMTP". Удалите параметр SMTP, и он работает (только что протестирован). Кроме того, зачем инкапсулировать его на http-сервере? следующие работы:

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
        user: 'xxx',
        pass: 'xxx'
    }
});

console.log('created');
transporter.sendMail({
from: '[email protected]',
  to: '[email protected]',
  subject: 'hello world!',
  text: 'hello world!'
});

Ответ 2

Для тех, кто на самом деле хочет использовать OAuth2/не хотите, чтобы приложение было "менее безопасным", вы можете достичь этого с помощью

  • Найдите "API Gmail" из консоли Google API и нажмите "Включить"
  • Следуйте инструкциям https://developers.google.com/gmail/api/quickstart/nodejs. В файле quickstart.js, изменив SCOPES var от ['https://www.googleapis.com/auth/gmail.readonly'] до ['https://mail.google.com/'] в файле quickstart js, предоставленном в соответствии с рекомендациями по устранению неполадок на https://nodemailer.com/smtp/oauth2/
  • После выполнения шагов в (2) сгенерированный файл JSON будет содержать атрибуты acessToken, refreshToken и expires, необходимые в Примеры OAuth2 для Nodemailer

Таким образом, вы можете использовать аутентификацию OAuth2 следующим образом

let transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
        type: 'OAuth2',
        user: '[email protected]',
        clientId: '000000000000-xxx0.apps.googleusercontent.com',
        clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',
        refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
});

вместо сохранения пароля gmail в текстовом виде и понижения безопасности в вашей учетной записи.

Ответ 3

Я просто установил свой домен на: smtp.gmail.com, и он работает. Я использую VPS Vultr.

код:

const nodemailer = require('nodemailer');
const ejs = require('ejs');
const fs = require('fs');

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: '[email protected]',
        pass: 'xxx'
    }
});

let mailOptions = {
    from: '"xxx" <[email protected]>',
    to: '[email protected]',
    subject: 'Teste Templete ✔',
    html: ejs.render( fs.readFileSync('e-mail.ejs', 'utf-8') , {mensagem: 'olá, funciona'})
};

transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error);
    }
    console.log('Message %s sent: %s', info.messageId, info.response);
});

мой шаблон ejs (e-mail.ejs):

<html>
    <body>
        <span>Esse é um templete teste</span>
        <p> gerando com o EJS - <%=mensagem%> </p>
    </body>
</html>

Удостовериться:

хорошего дня ;)

Ответ 4

Для цели отладки удобно реализовать функцию обратного вызова (они никогда не делают на странице gigub nodemailer), которая показывает сообщение об ошибке (если таковая имеется).

transporter.sendMail({
    from: from,
    to: to,
    subject: subject,
    html: text
}, function(err){
    if(err)
        console.log(err);
})

Это помогло мне решить мою проблему... Оказывает, что более новые версии работают неправильно:

"Похоже, у nodemailer 1.0 есть нарушения, поэтому вместо этого следует использовать 0,7: http://www.nodemailer.com/

Сообщение отправлено на nodemailer по состоянию на 12/17/15:

Не обновляйте Nodemailer от 0.7 или ниже до 1.0, так как есть нарушения. Вы можете продолжать использовать ветвь 0,7, если хотите. См. Документацию для 0.7 здесь.

Я нашел этот ответ здесь

Ответ 5

Вам нужен только пароль для приложения для google auth, а затем замените свой пароль Google в коде. перейдите сюда https://myaccount.google.com/apppasswords

пример кода:

const nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
    service: "Gmail",
    auth: {
      user: '[email protected]',
      pass: 'app password here'
    }
  });
transporter.sendMail(option, function(error, info){
    if (error) {
      console.log(error);
    } else {
      console.log('Email sent: ' + info.response);
    }
});

screenshot

Ответ 6

В то время как вышеприведенные ответы действительно работают, я хотел бы указать, что вы можете снизить уровень безопасности из Gmail с помощью следующих шагов TWO​​strong > .

ШАГ № 1

Учетная запись Google: попытка входа в систему заблокирована Если это вы, вы можете переключиться на приложение Google, такое как Gmail, для доступа к вашей учетной записи (рекомендуется) или изменить свои настройки на https://www.google.com/settings/security/lesssecureapps, чтобы ваша учетная запись больше не защищалась современными стандартами безопасности.

ШАГ № 2

В дополнение к включению Разрешить менее безопасные приложения вам также может потребоваться перейти на https://accounts.google.com/DisplayUnlockCaptcha и продолжить.

Ответ 7

попробуйте этот код для меня.

var http = require('http');
var nodemailer = require('nodemailer');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});

  var fromEmail = '[email protected]';
  var toEmail = '[email protected]';

  var transporter = nodemailer.createTransport({
    host: 'domain',
    port: 587,
    secure: false, // use SSL
    debug: true,
      auth: {
        user: '[email protected]',
        pass: 'userpassword'
      }
  });
   transporter.sendMail({
      from: fromEmail,
      to: toEmail,
      subject: 'Regarding forget password request',
      text: 'This is forget password response from your app',
      html: '<p>Your password is <b>sample</b></p>'
  }, function(error, response){
      if(error){
          console.log('Failed in sending mail');
          console.dir({success: false, existing: false, sendError: true});
          console.dir(error);
          res.end('Failed in sending mail');
      }else{
          console.log('Successful in sending email');
          console.dir({success: true, existing: false, sendError: false});
          console.dir(response);
          res.end('Successful in sending email');
      }
  });
}).listen(8000);
console.log('Server listening on port 8000');

ответ:

Successful in sending email
{ success: true, existing: false, sendError: false }
{ accepted: [ '[email protected]' ],
  rejected: [],
  response: '250 2.0.0 uAMACW39058154 Message accepted for delivery',
  envelope: 
   { from: '[email protected]',
     to: [ '[email protected]' ] },
  messageId: '[email protected]' }

Ответ 8

И установите модуль smtp в качестве зависимости:

npm install smtp

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
  service: 'gmail',
  type: "SMTP",
  host: "smtp.gmail.com",
  secure: true,
  auth: {
    user: '[email protected]',
    pass: 'YourGmailPassword'
  }
});

var mailOptions = {
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Sending Email to test Node.js nodemailer',
  text: 'That was easy to test!'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent');
  }
});

Перейти к https://myaccount.google.com/lesssecureapps и изменить его, потому что некоторые приложения и устройства используют менее безопасный знак в технологию, что делает Ваш счет более уязвимым. Вы можете отключить доступ к этим приложениям, которые мы рекомендуем, или включить доступ, если вы хотите использовать их, несмотря на риски.

Ответ 9

Это связано с nodemailer.

Я установил последнюю версию nodemailer и версию 8.1.1, установленную в моей системе. В systemjs.config.js я настроил nodemailer как "nodemailer": "npm: nodemailer/lib/nodemailer.js", даже я получаю ошибку.

как включить nodemailer в systemjs.config.js