【问题标题】:Sending email from own server to the internets从自己的服务器发送电子邮件到互联网
【发布时间】:2019-10-10 10:33:53
【问题描述】:

我已经在我的主机上设置了一个电子邮件服务器。它基本上是一个侦听端口 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 发送邮件一样 :)

【问题讨论】:

  • 请注意,如果您想向 Gmail 地址发送电子邮件,您需要使用 SPF 记录授权您的服务器,否则 google 将拒绝您的电子邮件。
  • 后缀工作正常。如果您的服务器由第三方托管,您通常可以使用他们的 SMTP 服务器作为中继
  • Alex - 你有答案吗 - 如果有,请接受 - 如果没有,请解释!

标签: javascript node.js smtp nodemailer


【解决方案1】:

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

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

或者您可以启动一个 docker 容器,例如:https://hub.docker.com/r/bytemark/smtp/

那么你就可以使用nodemailer通过postfix或者docker instance来发送邮件了。

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

【讨论】:

  • 请考虑 exim (exim.org) MTA - 它非常好,而且易于配置。由统一创建。剑桥!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      正如上述答案中提到的 Sohail,您可以使用 NodeMailer (https://nodemailer.com/about/),而且相当简单。下面是使用它的简单代码sn-p。此外,如果您正在寻找更高级的服务,还有其他提供免费套餐的服务(例如 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;
      

      }

      【讨论】:

        【解决方案5】:

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

        这些是步骤:-

        npm install @sendgrid/mail
        

        然后使用以下代码 sn -p :-

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

        【讨论】:

          猜你喜欢
          • 2015-10-28
          • 1970-01-01
          • 2020-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-10
          • 2014-12-18
          相关资源
          最近更新 更多