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

Mah*_*han 6 javascript email mail-server node.js

我花了几天时间使用 node.js 实现我自己的邮件服务器。我使用诸如“smtp-server”之类的模块来创建 smtp 服务器,还使用“smtp-connection”来连接并向其发送邮件。但是我很困惑,因为我不知道如何从我的 smtp 服务器向 google 或 yahoo 等提供商的 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
}
Run Code Online (Sandbox Code Playgroud)

还有我的 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();
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

fac*_*ris 6

电子邮件在被大多数邮件提供商接受之前必须通过许多检查。这些检查尝试验证发送消息的服务器是否有权代表发件人发送。

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

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

我认为您当前的问题与节点无关,与大型提供商最近的更改无关。

需要进行的一些检查包括:

  • DKIM 密钥(DNS 记录)
  • SPF记录(DNS记录)
  • DMARK已设置。
  • 需要服务器的专用 IP 地址。
  • 您的服务器 IP 没有被列入黑名单。
  • 您的电子邮件内容会通过他们的过滤器。
  • 尝试使从您的服务器发送的电子邮件看起来像是来自访客或客户。
  • 还有许多其他的。

您想要“充当发件人”的任何域都必须具备这些功能,以便大多数主要提供商接受您的消息。


Google 有一套很棒的工具和演练来获取 IP/域设置。

访问Google MX 记录检查器并输入您要用作发件人的域/子域,它会告诉您失败和通过的所有内容。


替代解决方案

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

警告的话

我花了几年时间尝试跟上所有的变化,不可避免地,我继续遇到消息被阻止的障碍,直到有人没有收到电子邮件才知道。如果您的发送量较低,您应该能够使用第三方而无需付费。如果您的发送量很大,那么与您将遇到的无尽问题相比,即使您最初开始滚动,他们的服务成本也很便宜。

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

  • 完全不同意这个答案。作为一名独立开发人员,我看到一种危险的趋势正在形成 - 对大型第三方提供商的依赖,这些提供商可以轻松充当大型科技电子邮件提供商的“审查代理”。他们无权决定人们互相发送什么消息或人们接收什么消息。这不是一个好的趋势,我们应该与之抗争。目前...最好的选择是注册您的域名并从那里开始。如果大型科技公司想要阻止您的电子邮件,他们必须接受不良宣传。让他们大声说出来。 (3认同)