从自己的服务器发送电子邮件到互联网

时间:2019-05-23 20:02:45

标签: javascript node.js smtp nodemailer

我已经在主机上设置了电子邮件服务器。它基本上是一个侦听端口25的SMTP服务器。

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地址。

我知道我可以使用Gmail SMTP服务器来做到这一点,但随后我需要一个Gmail帐户和密码。

我希望能够使用自己的服务器发送电子邮件,就像yahoo使用自己的服务器而非gmail帐户将邮件发送到gmail一样:)

5 个答案:

答案 0 :(得分:1)

您需要MTA(邮件传输代理)才能发送电子邮件。

因此流行的选项是: Postfix ,这是如何在ubuntu上设置Postfix的指南:https://help.ubuntu.com/community/Postfix

或者您可以启动一个类似https://hub.docker.com/r/bytemark/smtp/

的Docker容器

然后,您可以使用ArrayList通过后缀或docker实例发送电子邮件。

如果您想要一个完整的docker镜像,则包括所有电池:https://github.com/tomav/docker-mailserver

答案 1 :(得分:1)

从技术上讲,您可以使用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);

答案 2 :(得分:1)

如上述答案中的Sohail所述,您可以使用NodeMailer(https://nodemailer.com/about/)及其相当简单的方法。以下是使用它的简单代码段。此外,如果您正在寻找更高级的服务,还有其他服务可提供免费套餐(例如SendGrid(https://sendgrid.com/)。)。

异步函数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: "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;

}

答案 3 :(得分:1)

您可以通过在SendGrid中创建一个帐户,然后使用其Node.js api发送电子邮件来解决此功能。

这些步骤是:-

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中获得更多示例和文档。

答案 4 :(得分:0)

要发送电子邮件,您需要一个电子邮件客户端,而不是服务器。编写客户端通常比编写服务器容易,因此您可以这样做。如果您不想自己编写,则可以使用MTA(如Postfix),它将同时包含客户端和服务器。