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

7
我花了几天时间使用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个回答

6

大多数邮件提供商在接受电子邮件之前需要进行许多检查。这些检查旨在验证发送消息的服务器是否有权代表发件人发送。

例如:我的服务器可以发送一封电子邮件,称其来自“someone-special@somewhere-important.com”...这并不意味着我是“anywhere important”。

虽然您可能以前曾成功地使用其他技术(如PHP或Exchange Server)从SMTP服务器发送邮件,但规则已经发生了重大变化。 Gmail今年刚开始全面执行。

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

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

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

任何您想要作为发件人的域名,大多数主要提供商都需要满足这些要求才能接受您的邮件。


谷歌提供了一套很好的工具和指南,用于设置IP/域名。

访问谷歌MX记录检查器,输入您想用作发件人的域名/子域名,它将告诉您所有失败和通过的内容。


其他解决方案

  • 我使用sendgrid.com。他们提供了一个Node库,可以轻松地发送邮件。他们还提供了代理消息通过SMTP的能力。这意味着您可以利用标准方法来传递消息。您只需将“localhost”更改为他们提供的主机名即可。然而,如果这是一个新的设置,请选择API。
  • 托管您的电子邮件的人应该提供通过SMTP或API发送消息的能力。
  • 还有无数其他提供商,其中大多数允许低容量发件人免费发送邮件。

警告

我尝试了几年来跟上所有的变化,不可避免地,我继续遇到被屏蔽信息的障碍,而无法知道直到有人没有收到电子邮件。如果您发送的量较小,则应该能够使用第三方而无需付费。如果您发送的量很大,与您将遇到的无尽问题相比,他们的服务成本很便宜,即使您最初开始使用也是如此。

附言:我与任何电子邮件提供商或发件人都没有关联。我也要付费。


你知道如何使用Node.js实现类似于PHP的send_mail功能吗?而且可以在不通过Gmail登录的情况下发送邮件吗? - B''H Bi'ezras -- Boruch Hashem
3
完全不同意这个答案。作为一名独立开发者,我看到了一个危险的趋势正在形成——依赖于大型第三方提供商,他们可以轻易地充当大型科技电子邮件提供商的“审查代理”。他们没有权力规定人们发送什么信息或接收什么信息。这不是一个好的趋势,我们应该反对它。目前最好的选择是注册您的域名并从那里开始。如果大型科技公司想要阻止您的电子邮件,他们必须接受负面宣传。让他们公开说出来。 - generic3892372

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接