Pulling MX record from DNS server Pulling MX record from DNS server linux linux

Pulling MX record from DNS server


The simplest method is to simply use commonly available tools.

The basic "dig" command will return the records to you via this query:

dig mx example.com

If you want just the lines with the mx records...

dig mx example.com | grep -v '^;' | grep example.com

dig is available on most linux / unix boxes.

If you're on windows you can use nslookup

nslookup -type=mx example.com

Then just parse the output of these common tools.

EDIT: Simple C example of sockets from the web

Since you put "C" as a tag, I guess you're looking for source code to do MX lookups using raw sockets. I copied this from http://www.developerweb.net/forum/showthread.php?t=3550. It may be more what you're looking for?

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <netinet/in.h>#include <resolv.h>int main (int argc, char *argv[]){    u_char nsbuf[4096];    char dispbuf[4096];    ns_msg msg;    ns_rr rr;    int i, j, l;    if (argc < 2) {        printf ("Usage: %s <domain>[...]\n", argv[0]);        exit (1);    }    for (i = 1; i < argc; i++) {        l = res_query (argv[i], ns_c_any, ns_t_mx, nsbuf, sizeof (nsbuf));        if (l < 0) {            perror (argv[i]);        } else {#ifdef USE_PQUERY/* this will give lots of detailed info on the request and reply */            res_pquery (&_res, nsbuf, l, stdout);#else/* just grab the MX answer info */            ns_initparse (nsbuf, l, &msg);            printf ("%s :\n", argv[i]);            l = ns_msg_count (msg, ns_s_an);            for (j = 0; j < l; j++) {                ns_parserr (&msg, ns_s_an, j, &rr);                ns_sprintrr (&msg, &rr, NULL, NULL, dispbuf, sizeof (dispbuf));                printf ("%s\n", dispbuf);            }#endif        }    }    exit (0);}


I notice that you're writing for Linux. The idomatic way for a regular program to send mail on Unix-like systems is either:

  • Run /usr/bin/mail in a subprocess and send it the mail message on its standard input (see the mail manpage); or
  • Connect to 127.0.0.1:25 and give the local mail daemon the message to deliver.

Both ways presume that the local mailer is configured to pass mail on to where it has to go; on a well-configured Linux box this is a fair assumption.

If that doesn't appeal, the second-best way is for your program to accept the address of a local mail relay server to use, and just connect to that server on port 25.

In other words, wherever possible, use an existing mail relay to send your mail on. Those mail relays will have all the local knowledge that might be necessary to get mail out of the network that you're running on - just looking up the MX and trying to send directly to the destination is not always going to work.

If you've read all that and you still want to look up MX records, try the adns library, it takes care of all the tedious details involved in DNS resolution (and believe me, it is tedious, and easy to get wrong!).


on linux:

host -t mx google.com