Skip to content

Instantly share code, notes, and snippets.

@mnazim
Forked from paularmstrong/verifyemail.js
Created June 28, 2012 19:14

Revisions

  1. @paularmstrong paularmstrong created this gist Jun 28, 2012.
    66 changes: 66 additions & 0 deletions verifyemail.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,66 @@
    var _ = require('underscore'),
    exec = require('child_process').exec,
    net = require('net'),
    email = process.argv.splice(2)[0],
    domain = email.split('@')[1];

    function verify(mxrecord) {
    console.log('connecting to', mxrecord);
    var conn = net.createConnection(25, mxrecord),
    commands = [
    'HELO ' + mxrecord,
    'mail from:<notifications@foobar.com>',
    'rcpt to:<' + email + '>'
    ],
    i = 0;

    conn.setEncoding('ascii');
    conn.on('connect', function () {
    console.log('connected successfully');
    });
    conn.on('data', function (data) {
    console.log(data)
    if (i >= commands.length) {
    if ((/ok\s|okay/).test(data.toLowerCase())) {
    console.log(email, 'appears to be valid');
    } else {
    console.error(data);
    }
    conn.end();
    return;
    }
    console.log(commands[i]);
    var message = conn.write(commands[i] + '\n');
    if (!message) {
    console.error('error sending last message');
    process.exit(1);
    }
    i += 1;
    });
    conn.on('error', function () {
    console.error('error', arguments);
    });
    conn.on('end', function () {
    process.exit(0);
    });
    }

    exec('nslookup -type=MX ' + domain, function (err, stdout, stderr) {
    var records = _.reject(stdout.split(/\n/), function (l) {
    return l.indexOf(domain) !== 0 || l.indexOf('exchanger') === -1;
    }).sort(function (a, b) {
    var a = a.split(/\s+/)[4],
    b = b.split(/\s+/)[4];
    return ~~a - ~~b;
    }),
    record;

    if (!records.length) {
    console.log('no records');
    console.log(records);
    process.exit(1);
    }
    record = _.last(_.first(records).split(/\s+/)).replace(/\.$/, '');

    verify(record);
    });