Отправка электронной почты с собственного сервера в интернет - PullRequest
9 голосов
/ 23 мая 2019

Я установил почтовый сервер на своем хосте.По сути, это SMTP-сервер, который прослушивает порт 25.

const recvServer = new SMTPServer({
  requireTLS: true,
  authOptional: true,
  logger: true,      
  onConnect(session, callback) {
    return callback();
  },

  onMailFrom(address, session, callback) {
    console.log('from', address, session);
    return callback();
  },    

  onData(stream, session, callback) {
    console.log('new msg');
    let message = '';
    stream.on('data', chunk => {
      message += chunk;
    });

    stream.on('end', () => {

      callback(null, 'Message queued');
      simpleParser(message)
        .then(parsed => {
          console.log(parsed);
          // here I wish to forward the message to outside gmail addresses
        })
        .catch(err => {
          console.log(ee)
        });

    });
  }    
});

recvServer.listen(25);

recvServer.on('error', err => {
  console.log(err.message);
});

Он отлично работает для получения писем извне, таких как gmail и т. Д.

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

Я знаю, что могу сделать это, используя SMTP-серверы Gmail, но затем мне нужны учетная запись и пароль Gmail.

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

Ответы [ 5 ]

4 голосов
/ 31 мая 2019

Вам нужен MTA (агент пересылки почты) для отправки электронного письма.

Итак, популярные опции: Postfix , вот руководство по настройке postfix в Ubuntu: https://help.ubuntu.com/community/Postfix

Или вы можете раскрутить контейнер докера, например: https://hub.docker.com/r/bytemark/smtp/

Затем вы можете использовать nodemailer для отправки электронных писем через postfix или Docker.

И, если вы хотите, есть изображение докера с полным стеком, включая все батареи: https://github.com/tomav/docker-mailserver

1 голос
/ 07 июня 2019

Эту функцию можно решить, создав учетную запись в SendGrid , а затем используя ее API Node.js для отправки электронных писем.

Это шаги: -

npm install @sendgrid/mail

А затем используйте следующий фрагмент кода: -

const mailer = require('@sendgrid/mail');
mailer.setApiKey(<YOUR_SENDGRID_API_KEY>);
const message = {
  to: 'xyz@gmail.com',
  from: 'abc@gmail.com',
  subject: 'hello world',
  text: 'hello world'
};
mailer.send(message);

Вы можете получить больше образцов и документации в их Github repo .

1 голос
/ 05 июня 2019

Как упомянул Sohail в ответе выше, вы можете использовать NodeMailer (https://nodemailer.com/about/) и его довольно просто. Ниже приведен простой фрагмент кода его использования. Кроме того, есть другие сервисы, которые предоставляют бесплатные уровни, если вы ищете для причудливых услуг (например, SendGrid (https://sendgrid.com/)).

асинхронная функция sendemail (электронная почта, хост, email_body) {

let transporter = nodemailer.createTransport({
    host: "mail.example.com.au",
    port: 465,
    secure: true, // true for 465, false for other ports
    auth: {
        user: "test@example.com.au", // generated ethereal user
        pass: "email_password" // generated ethereal password
    }
});

let emailBody = email_body // This is the body of your email which is more or less a String


let info = await transporter.sendMail({
    from: '" Name of sender" <test@example.com.au>', // sender address
    to: email, // list of receivers
    subject: "Email Subject", // Subject line
    text: emailBody, // plain text body
    // html:  // html body
});

console.log("Message sent: %s", info.messageId);

return true;

}

1 голос
/ 04 июня 2019

Технически вы можете использовать NodeMailer для отправки электронных писем.

"use strict";
const nodemailer = require("nodemailer");

// async..await is not allowed in global scope, must use a wrapper
async function main(){

  // Generate test SMTP service account from ethereal.email
  // Only needed if you don't have a real mail account for testing
  let testAccount = await nodemailer.createTestAccount();

  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    host: "smtp.ethereal.email",
    port: 587,
    secure: false, // true for 465, false for other ports
    auth: {
      user: testAccount.user, // generated ethereal user
      pass: testAccount.pass // generated ethereal password
    }
  });

  // send mail with defined transport object
  let info = await transporter.sendMail({
    from: '"Fred Foo ?" <foo@example.com>', // sender address
    to: "bar@example.com, baz@example.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world?", // plain text body
    html: "<b>Hello world?</b>" // html body
  });

  console.log("Message sent: %s", info.messageId);
  // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>

  // Preview only available when sending through an Ethereal account
  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
  // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}

main().catch(console.error);
0 голосов
/ 31 мая 2019

Для отправки электронной почты вам нужен почтовый клиент, а не сервер. Написание клиента обычно проще, чем написание сервера, так что вы можете это сделать. Если вы не хотите писать свой собственный, вы можете использовать MTA (например, Postfix), который будет содержать как клиента, так и сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...