Отправка электронной почты с собственного сервера в Интернет

Я установил почтовый сервер на своем хосте. По сути, это 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 :)


person Alex    schedule 23.05.2019    source источник
comment
Обратите внимание: если вы хотите отправлять электронные письма на адрес Gmail, вам необходимо авторизовать свой сервер с помощью записей SPF, иначе Google отклонит ваши электронные письма.   -  person Moritz Roessler    schedule 05.06.2019
comment
Постфикс работает нормально. Если ваш сервер размещен у третьей стороны, вы обычно можете использовать их SMTP-серверы в качестве ретранслятора.   -  person Moritz Roessler    schedule 05.06.2019
comment
Алекс, у тебя есть ответ - если да, прими - если нет, то объясни!   -  person rivimey    schedule 07.06.2019


Ответы (5)


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

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

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

Затем вы можете использовать nodemailer для отправки писем через postfix или docker instance.

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

person Rami Jarrar    schedule 31.05.2019
comment
Пожалуйста, обратите внимание на MTA exim (exim.org) - это очень хорошо и легко настраивается. Создано Uni. Кембридж! - person rivimey; 07.06.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 ????" <[email protected]>', // sender address
    to: "[email protected], [email protected]", // 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: <[email protected]>

  // 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);
person Sohail    schedule 04.06.2019

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

async function sendemail (email, host, email_body) {

let transporter = nodemailer.createTransport({
    host: "mail.example.com.au",
    port: 465,
    secure: true, // true for 465, false for other ports
    auth: {
        user: "[email protected]", // 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" <[email protected]>', // 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;

}

person Abdollah Ebadi    schedule 05.06.2019

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

Это шаги: -

npm install @sendgrid/mail

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

const mailer = require('@sendgrid/mail');
mailer.setApiKey(<YOUR_SENDGRID_API_KEY>);
const message = {
  to: '[email protected]',
  from: '[email protected]',
  subject: 'hello world',
  text: 'hello world'
};
mailer.send(message);

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

person WaughWaugh    schedule 07.06.2019

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

person echawkes    schedule 31.05.2019