Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pulling MX record from DNS server

I am writing an application that is requiring me to do a DNS lookup for an MX record. I'm not sure if anyone has had experience doing this kind of work but if you do, any help would be appreciated.

EDIT: The thing that I'm going for is an application that will send an e-mail alert. The problem is I need to have the application be able to lookup the MX record for a domain.

like image 524
Suroot Avatar asked Jul 07 '09 16:07

Suroot


People also ask

What is an MX record in DNS?

A DNS 'mail exchange' (MX) record directs email to a mail server. The MX record indicates how email messages should be routed in accordance with the Simple Mail Transfer Protocol (SMTP, the standard protocol for all email). Like CNAME records, an MX record must always point to another domain.

What tool is used to retrieve DNS records?

The nslookup is a built-in command-line tool available in most Operating Systems. It is used for querying the DNS and obtaining domain names, IP addresses, and DNS resource record information.


1 Answers

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);
}
like image 76
Great Turtle Avatar answered Oct 10 '22 11:10

Great Turtle