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

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

Если я правильно понимаю опцию SMTP (пожалуйста, поправьте меня, если я ошибаюсь), Я могу либо попытаться отправить электронное письмо с моего сервера на чью-то учетную запись электронной почты напрямую, или Я могу отправить электронное письмо, все еще используя узел.js, но через фактическую учетную запись электронной почты (в данном случае мой личный аккаунт Gmail), i.e использование SMTP. Эта опция требует, чтобы я вошел в этот acount удаленно через 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. У кого-нибудь есть решение/предложение ?

спасибо! :-)

8 ответов


ответ находится в сообщении от google.

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

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

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

var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
    user: 'gmail.user@gmail.com',
    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: 'xxx@gmail.com',
  to: 'xxx@gmail.com',
  subject: 'hello world!',
  text: 'hello world!'
});

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

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

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

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

вместо того, чтобы хранить пароль gmail в открытом тексте и понижать уровень безопасности в вашей учетной записи.


Я просто установил свой домен в: 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: 'xxx@gmail.com',
        pass: 'xxx'
    }
});

let mailOptions = {
    from: '"xxx" <xxx@gmail.com>',
    to: 'yyy@gmail.com',
    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 (электронная почта.EJS по):

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

убедитесь, что:

  • установить ejs:npm установить ejs --save
  • установить nodemailer: npm установить nodemailer --сохранить
  • ping для smtp.gmail.com работает:пинг smtp.gmail.com
  • изменить xxx@gmail.com на ваш адрес электронной почты gmail
  • изменить yyy@gmail.com на электронную почту, которую вы хотите отправить по электронной почте
  • включить менее безопасные приложения
  • временно отключить Captcha

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


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

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 здесь."

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


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

Шаг #1

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

Шаг #2

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


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

пример кода:

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

screenshot


попробуйте этот код его работать на меня.

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

  var fromEmail = 'akarthi@xyz.com';
  var toEmail = 'akarthi@xyz.com';

  var transporter = nodemailer.createTransport({
    host: 'domain',
    port: 587,
    secure: false, // use SSL
    debug: true,
      auth: {
        user: 'fromEmail@xyz.com',
        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: [ 'akarthi@xyz.com' ],
  rejected: [],
  response: '250 2.0.0 uAMACW39058154 Message accepted for delivery',
  envelope: 
   { from: 'akarthi@xyz.com',
     to: [ 'akarthi@xyz.com' ] },
  messageId: '1479809555147-33de4987-29d605fa-6ee150f1@xyz.com' }

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

npm install smtp

var nodemailer = require('nodemailer');

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

var mailOptions = {
  from: 'xyz.khan704@gmail.com',
  to: 'azran.khan704@gmail.com',
  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 и изменить его ON потому что Некоторые приложения и устройства используют менее безопасную технологию входа, что делает вашу учетную запись более уязвимой. Вы можете отключить доступ к этим приложениям, которые мы рекомендуем, или включить доступ, если вы хотите использовать их, несмотря на риски.