Nodemailer отправляет электронную почту без транспорта smtp

Я пытаюсь отправлять электронные письма через nodemailer без транспорта SMTP. Итак, я сделал это:

var mail = require("nodemailer").mail;

mail({
    from: "Fred Foo ✔ <[email protected]>", // sender address
    to: "******@gmail.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world ✔", // plaintext body
    html: "<b>Hello world ✔</b>" // html body
});

Но когда я бегу, то понимаю:

> node sendmail.js
Queued message #1 from [email protected], to [email protected]
Retrieved message #1 from the queue, reolving gmail.com
gmail.com resolved to gmail-smtp-in.l.google.com for #1
Connecting to gmail-smtp-in.l.google.com:25 for message #1
Failed processing message #1
Message #1 requeued for 15 minutes
Closing connection to the server

Error: read ECONNRESET
    at errnoException (net.js:901:11)
    at TCP.onread (net.js:556:19)

Я на windows 7 32.

РЕДАКТИРОВАТЬ. Похоже, это ошибка, связанная с Windows, так как она работала в Linux.

ИЗМЕНИТЬ №2

В оболочке git, если я введу telnet smtp.gmail 587, он заблокируется здесь:

220 mx.google.com ESMTP f7...y.24 -gsmtp

person Vinz243    schedule 11.04.2014    source источник
comment
Убедитесь, что вы разрешили соединение через порты, которые подключаются к gmail smtp, сначала проверьте telnet smtp.gmail.com 587   -  person Risto Novik    schedule 15.04.2014
comment
Я работаю в Windows, поэтому команда telnet не работает.   -  person Vinz243    schedule 15.04.2014
comment
Пользователи Windows: D, вы можете включить его social.technet.microsoft.com/wiki/contents/articles/. Или используйте другой клиент, например Putty.   -  person Risto Novik    schedule 16.04.2014
comment
ни у кого нет anwser? Я не хочу тратить 100 репутации ...   -  person Vinz243    schedule 19.04.2014


Ответы (7)


Из вашего примера выходных данных кажется, что он подключается к неправильному порту 25, открытые SMTP-порты Gmail - это 465 для SSL и 587 для других TLS.

Nodemailer определяет правильную конфигурацию на основе домена электронной почты, в вашем примере вы не установили объект транспортера, поэтому он использует настроенный порт по умолчанию 25. Чтобы изменить порт, укажите в настройках тип.

Вот небольшой пример, который должен работать с Gmail:

var nodemailer = require('nodemailer');

// Create a SMTP transport object
var transport = nodemailer.createTransport("SMTP", {
        service: 'Gmail',
        auth: {
            user: "[email protected]",
            pass: "Nodemailer123"
        }
    });

console.log('SMTP Configured');

// Message object
var message = {

    // sender info
    from: 'Sender Name <[email protected]>',

    // Comma separated list of recipients
    to: '"Receiver Name" <[email protected]>',

    // Subject of the message
    subject: 'Nodemailer is unicode friendly ✔', 

    // plaintext body
    text: 'Hello to myself!',

    // HTML body
    html:'<p><b>Hello</b> to myself <img src="cid:note@node"/></p>'+
         '<p>Here\'s a nyan cat for you as an embedded attachment:<br/></p>'
};

console.log('Sending Mail');
transport.sendMail(message, function(error){
  if(error){
      console.log('Error occured');
      console.log(error.message);
      return;
  }
  console.log('Message sent successfully!');

  // if you don't want to use this transport object anymore, uncomment following line
  //transport.close(); // close the connection pool
});
person Risto Novik    schedule 19.04.2014
comment
спасибо, сработало ... Но я не хочу входить в систему. И если я изменю его с SMTP на прямой, он скажет мне, что он был успешно отправлен, но я ничего не получаю ... - person Vinz243; 20.04.2014
comment
Что вы имеете в виду, говоря, что не хотите входить в систему? SMTP-сервер gmail требует этого, если вы хотите отправлять электронную почту без аутентификации, вы можете настроить свой собственный SMTP-сервер. - person Risto Novik; 20.04.2014
comment
Я хотел использовать прямой транспорт, чтобы установить поддельный адрес, например [email protected] - person Vinz243; 20.04.2014
comment
над транспортным объектом создана поддержка в v0.7.1. В последней версии v2.7.0 для создания транспортного объекта используйте var transporter = nodemailer.createTransport('smtps://user%40gmail.com:[email protected]'); - person Rohan Khude; 20.01.2017

используйте nodemailer 0.7.1.
если вы ранее установили nodemailer, удалите его с помощью

npm remove nodemailer

теперь установите его

npm install [email protected]

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

var mail = require("nodemailer").mail;

mail({
    from: "Fred Foo ✔ <[email protected]>", // sender address
    to: "[email protected], [email protected]", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world ✔", // plaintext body
    html: "<b>Hello world ✔</b>" // html body
});
person barley    schedule 05.05.2016
comment
Если вас действительно не интересует сохранение учетных данных электронной почты в коде, тогда хорошо подойдет nodemailer 0.7.1 с приведенным выше фрагментом кода. Спасибо! - person Dipin Krishnan; 13.06.2017
comment
можно ли это сделать с помощью nodemailer 2.7.2? Если нет, возможно ли, чтобы обе версии сосуществовали для других модулей в одном проекте, которые в этом нуждаются? - person Michael; 08.08.2017
comment
Возврат к версии 0.7.1 работает, но сообщение электронной почты не зашифровано. Как зашифровать сообщение? - person Neutrino; 04.01.2018

Похоже, у текущего nodemailer больше нет возможности отправлять почту без smtp. Я бы порекомендовал взглянуть на библиотеку sendmail, которая НЕ нужна любой smtp / auth для отправки электронной почты. Это дает вам опыт, аналогичный использованию sendmail в Linux.

const sendmail = require('sendmail')();

sendmail({
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Hello World',
  html: 'Hooray NodeJS!!!'
}, function (err, reply) {
  console.log(err && err.stack)
  console.dir(reply)
})

Вы также можете включить silent, чтобы сделать его менее подробным: const sendmail = require('sendmail')({silent: true});. Следует отметить, что отправителем не могут быть те домены, для которых действует DMARC политика, например [email protected].

person LeOn - Han Li    schedule 25.09.2017
comment
как мне заставить sendmail отправлять прямо на хост в адресе? например Я использовал прямой, потому что в противном случае я получаю ошибку queryMx ENODATA, но теперь с sendmail я снова вижу эту ошибку. - person Michael; 21.11.2017
comment
@Michael не уверен в этом, вы можете сначала сделать dig или nslookup для своего mx-сервера. - person LeOn - Han Li; 21.11.2017
comment
ах, хорошо, я вижу проблему. но ах! аргумент err - это не то, что я могу легко проанализировать, чтобы определить, является ли ошибка 4xx - я должен повторить это сам, не так ли? - person Michael; 21.11.2017
comment
@Michael Возможно, в объекте err есть ошибка. Подробности не помню. debug или console.log on err даст вам полную картину этого объекта. :) - person LeOn - Han Li; 21.11.2017
comment
Я 2 дня боролся с nodemailer и emailjs, пока не нашел это! Обратите внимание, что Gmail помещает эти письма в вашу папку для спама, потому что они не могут проверить отправителя, но, по крайней мере, он работает со всеми возрастающими проверками безопасности. - person Nancy; 26.05.2018
comment
Пакет sendmail использует nodemailer mailcomposer для вложения, который устарел. - person amarinediary; 28.07.2021

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

Включение отладки

var nodemailer = require("nodemailer"),
  transport = nodemailer.createTransport('direct', {
    debug: true, //this!!!
  });

transport.sendMail({
    from: "Fred Foo ✔ <[email protected]>", // sender address
    to: "******@gmail.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world ✔", // plaintext body
    html: "<b>Hello world ✔</b>" // html body
}, console.error);
person vodolaz095    schedule 11.04.2014
comment
Я отключил брандмауэр Windows, и он ничего не изменил. Как включить отладку? - person Vinz243; 11.04.2014

Кажется, это возможно в nodemailer. Не уверен, что этого не было, когда были предоставлены другие ответы. Как описано здесь: https://nodemailer.com/transports/sendmail/ вы можете использовать встроенный в sendmail, если он доступен для отправки. Я тестировал это для себя и отлично работает. Очевидно, что у SMTP есть преимущества, но сказать, что это невозможно, неверно.

person Brian F Leighty    schedule 08.08.2018

У вас должен быть SMTP-сервер, почтовый сервер, который пересылает электронные письма от вашего имени. Поэтому либо настройте свой собственный SMTP-сервер, такой как Haraka, либо предоставьте учетные данные для Nodemailer для подключения к одному, например. Gmail, MSN, Yahoo. Даже я начал изучать NodeJs и пытался включить функцию электронной почты в свой проект, и это была та же проблема, с которой я столкнулся.

person dv3    schedule 09.02.2015
comment
По этой причине я хотел использовать Direct. Кстати, для отправки писем нет необходимости иметь надлежащую электронную почту. Вот почему вы можете отправлять электронные письма кому-то с его адресом электронной почты, даже если вы не знаете его учетные данные. - person Vinz243; 10.02.2015
comment
Но тогда служба-получатель (SMTP-сервер) не будет просто отклонять вашу почту или спамить ее. Он ожидает получать электронные письма из достоверного источника. - person dv3; 10.02.2015
comment
Электронных писем без ответа не существует - person Vinz243; 10.02.2015

когда вы в настройках, он позволяет отправлять письма. https://www.google.com/settings/security/lesssecureapps, с которым работал меня

person pitu    schedule 03.06.2015