如何构建本地node.js邮件服务器

时间:2016-09-20 19:41:12

标签: javascript node.js email mail-server

我花了几天时间使用node.js实现自己的邮件服务器。我使用的模块如" smtp-server"用于创建smtp服务器以及" smtp-connection"连接并发送邮件给它。但我感到困惑,因为我不知道如何从我的smtp服务器向谷歌或雅虎提供商smtp服务器发送邮件。

任何人都可以帮助我吗?

以下是我的代码以获取更多信息:

我的index.js文件:

var SMTPServer = require('smtp-server').SMTPServer;
var port = 9025;


var serverOptions = {
    name: "smtp-interceptor",
    onConnect: onConnect,
    onAuth: onAuth,
    onData: onData
};

var server = new SMTPServer(serverOptions);

server.listen(port, 'localhost', function () {
    console.log('SMTP server is listening on port ' + port);
});

function onConnect(session, callback) {
    console.log('Connected');
    return callback(); // Accept the connection
}

function onData(stream, session, callback) {
    stream.pipe(process.stdout); // print message to console
    console.log('Session \n', session.envelope);
    stream.on('end', callback);
}

function onAuth(auth, session, callback){
   if(auth.username !== 'Mahan' || auth.password !== 'Tafreshi') {
        return callback(new Error('Invalid username or password'));
   }
   callback(null, {user: 123}); // where 123 is the user id or similar property
}

我的connection.js文件:

var SMTPConnection = require('smtp-connection');

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

var connection = new SMTPConnection({
    host: 'localhost',
    port: 9025,
    secure: false
});

connection.connect(function (){
    console.log('Connceted to SMTP server');
    var auth = {
        user: 'Mahan',
        pass: 'Tafreshi'
    };

    connection.login(auth, function (err) {
        if(err)
            return console.log('Login Failed \n', err);
        console.log('Login Successful');

        var envelope = {
            from: "testapp@testapplocal.com",
            to: "mahantp19@gmail.com"
        };

        var message = 'Test message1';

        connection.send(envelope, message, function (err, info) {
            if(err)
                return console.log('Error : ' + err);
            console.log('Message sent');
            console.log('Accepted  : ' + info.accepted);
            console.log('Rejected  : ' + info.rejected);
            console.log(info.response);

            connection.quit();
            console.log('Quit connection');
            connection.close();
        });
    });
});

1 个答案:

答案 0 :(得分:2)

在大多数邮件提供商接受电子邮件之前,必须通过许多检查。这些检查试图验证发送邮件的服务器是否已授权代表发送方发送。

IE:我的服务器可以发送一封电子邮件,说它来自“ someone-special@somewhere-important.com” ...这并不意味着我在任何地方都重要/ em>”。

虽然您过去可能已经成功使用其他技术(例如PHP或Exchange Server)从SMTP服务器发送邮件,但规则已发生了很大变化。 Gmail今年才开始全面实施。

我认为您当前的问题与节点无关,与大型提供商的最新变化无关。

一些需要的检查包括:

  • DKIM Keys(DNS记录)
  • SPF Record(DNS记录)
  • DMARK已设置。
  • 服务器的专用IP地址是必需的。
  • 您的服务器IP未列入黑名单。
  • 您的电子邮件内容通过了其过滤器。
  • 试图让服务器发送的电子邮件似乎来自访客或客户。
  • 还有很多。

您要“充当发件人”的任何域都必须具有这些位置,大多数主要提供商都可以接受您的消息。


Google提供了很多有关IP /域名设置的工具和演练。

访问Google MX Record Checker,然后输入要用作发件人的域/子域,它将告诉您所有失败和失败的信息。


替代解决方案

  • 我使用sendgrid.com。他们有一个节点库,使发送邮件非常容易。它们还使我能够通过SMTP代理邮件。这意味着您可以利用标准方法来传递消息。您只需将其提供的主机名更改为“ localhost”。但是,如果这是新设置,请使用API​​。
  • Whomever托管您的电子邮件应该可以让您通过SMTP或API发送邮件
  • 其他供应商的供应商络绎不绝,其中大多数都允许低流量发件人免费发送。

警告语

我尝试了几年,以适应所有更改,并且不可避免地,我继续遇到无法访问邮件的障碍,直到有人没有收到电子邮件之前,我才知道。如果您发送的流量较小,则您应该能够使用第三方,而无需为此付费。如果您要发送大量邮件,则与最初遇到的无尽问题相比,其服务成本低廉。

PS。我与任何电子邮件提供商或发件人没有任何隶属关系。我也付钱给他们。