# Printing MX records with Go DNS


> Now that the API seems to stabilize it is time to update these items.

We want to create a little program that prints out the MX records of domains, like so:

    % mx miek.nl
    miek.nl.        86400   IN      MX      10 elektron.atoom.net.

Or

    % mx microsoft.com 
    microsoft.com.  3600    IN      MX      10 mail.messaging.microsoft.com.

We are using my [Go DNS package](https://github.com/miekg/dns).
First the normal header of a Go program, with a bunch of imports. We 
need the `dns` package:

    package main

    import (
        "dns"
        "os"
        "fmt"
    )

Next we need to get the local nameserver to use:

    config, _ := dns.ClientConfigFromFile("/etc/resolv.conf")

Then we create a `dns.Client` to perform the queries for us. In Go:

    c := new(dns.Client)

We skip some error handling and assume a zone name is given. So we prepare our
question. For that to work, we need:

1. a new packet (`dns.Msg`);
2. setting some header bits (`dns.Msg.MsgHdr`);
3. define a question section;
4. fill out the question section: `os.Args[1]` contains the zone name.

Which translates into:

    m := new(dns.Msg)
    m.SetQuestion(dns.Fqdn(os.Args[1], dns.TypeMX)
    m.MsgHdr.RecursionDesired = true

Then we need to finally 'ask' the question. We 
do this by calling the `Exchange()` function.

    r, err := c.Exchange(m, config.Servers[0]+":"+config.Port)

Check if we got something sane. The following code snippet prints
the answer section of the received packet:

    if r != nil {
            if r.Rcode != dns.RcodeSuccess {
                    fmt.Printf(" *** invalid answer name %s after MX query for %s\n", os.Args[1], os.Args[1])
                    os.Exit(1)
            }
            // Stuff must be in the answer section
            for _, a := range r.Answer {
                    fmt.Printf("%v\n", a)
            }
    } else {
            fmt.Printf("*** error: %s\n", err.String())
    }

And we are done.

# Full source
The full source of `mx.go` can be found over at [github](https://github.com/miekg/dns/raw/master/_examples/mx/mx.go).
Compiling works with `go build`.

