Und wieder ein weiteres kleinen Script, welches mir den Alltag etwas vereinfachen sollen. Um das Web etwas sicherer zu Spamfreier zu machen, gibt es Dienste wie spamhaus.org. Spamhaus zapft andere Blacklist-Anbieter an und verfügt somit über eine ewig lange Liste. Mailserver nutzen diese Liste, um schon beim Verbinden eines Servers zu erkennen, ob es sich dabei um potenziellen Spam bzw. Schädling handelt.

Gelegentlich kommt es vor, dass sich ein Client mit etwas infiziert und die externe IP somit auf der Blacklist landet. Sehr unpraktisch, wenn die Mailserver hinter der selben IP stehen. Spamhaus und andere Blacklisten bieten die Möglichkeit, IPs temporär runternehmen zu lassen. Nachteil an der Sache ist: man muss erst mal wissen, dass man überhaupt auf der Blacklist gelandet ist. Dies bekommt man meist viel zu spät mit.

Das folgende Script holt sich den MX-Record der Domain, löst dessen IP auf und prüft, ob die IP auf der Blacklist bei Spamhaus steht. Dies geschieht ebenfalls über DNS. Tritt bei einem der Schritte ein Problem auf, erhalte ich eine E-Mail.

var dns = require('dns'),
    nodemailer = require('nodemailer'),
    sendmailTransport = require('nodemailer-sendmail-transport');

var transport = nodemailer.createTransport(sendmailTransport());

var toEmail = 'user@host.de',
    fromEmail = 'blcheck@host.de',
    hosts = [
        '534f.de',
        'kuchen.io',
        'reddit.com',
        'google.de'
    ];

hosts.forEach(function(h) {
    dns.resolve(h, 'MX', function(err, addr) {
        if(err) {
            transport.sendMail({
                from: fromEmail,
                to: toEmail,
                subject: h + ' hat keinen MX-Eintrag.',
                text: h + ' hat keinen MX-Eintrag'
            });
            console.log(err);
            return;
        }

        addr.forEach(function(mx) {
            dns.lookup(mx.exchange, function(err, ip) {
                if(err) {
                    transport.sendMail({
                        from: fromEmail,
                        to: toEmail,
                        subject: mx.exchange + ' lässt sich vom DNS nicht auflösen.',
                        text: mx.exchange + ' lässt sich vom DNS nicht auflösen.'
                    });
                    console.log(err);
                    return;
                }

                console.log(h+' - '+mx.exchange + ' IP address: '+ ip);

                var revip = ip.split('.').reverse().join('.');

                dns.lookup(revip + '.zen.spamhaus.org', function(err, blip) {
                    if(err.code == "ENOTFOUND") {
                        console.log(h + ' ('+mx.exchange+' / ' +ip+ ') ist nicht auf der Blacklist.');
                        return;
                    }

                    transport.sendMail({
                        from: fromEmail,
                        to: toEmail,
                        subject: mx.exchange + '(' +ip+ ') ist auf der Blacklist!',
                        text: mx.exchange + ' ('+ip+') ist auf der Blacklist!'
                    });
                });
            });
        });
    });
});