Pergunta

Eu estou escrevendo um aplicativo que está me exigindo para fazer uma pesquisa de DNS para um registro MX. Eu não tenho certeza se alguém já teve experiência fazendo este tipo de trabalho, mas se você fizer isso, qualquer ajuda seria apreciada.

EDIT: A única coisa que eu estou indo para é uma aplicação que irá enviar um alerta de e-mail. O problema é que eu preciso ter o aplicativo ser capaz de procurar o registro MX para um domínio.

Foi útil?

Solução

O método mais simples é simplesmente usar ferramentas comuns.

O comando básico "dig" retornará os registros para você via esta consulta:

dig mx example.com

Se você quiser apenas as linhas com os registros MX ...

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

escavação está disponível na maioria das caixas de Linux / Unix.

Se você estiver no Windows, você pode usar nslookup

nslookup -type=mx example.com

Em seguida, basta analisar a saída dessas ferramentas comuns.

EDIT: Exemplo simples C de tomadas a partir da web

Uma vez que você colocar "C" como uma marca, eu acho que você está procurando código fonte para fazer pesquisas MX usando soquetes brutos. Copiei isso http://www.developerweb.net/forum/showthread.php ? t = 3550 . Pode ser mais o que você está procurando?

#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);
}

Outras dicas

Eu noto que você está escrevendo para Linux. A maneira idomatic para um programa regular para enviar e-mails em sistemas Unix-like é:

  • Executar / usr / bin / mail em um subprocesso e enviá-lo a mensagem de correio na sua entrada padrão (veja a página de manual mail); ou
  • Conectar para 127.0.0.1:25 e dar o correio local daemon a mensagem para entregar.

Ambas as formas presumir que o mailer local está configurado para passar e-mail para onde tem que ir; em um Linux bem configurado caixa esta é uma suposição justa.

Se isso não apelar, a segunda melhor maneira é para o seu programa para aceitar o endereço de um servidor de correio de retransmissão local para uso, e apenas conectar ao servidor na porta 25.

Em outras palavras, sempre que possível, usar uma retransmissão de email existente para enviar seu e-mail on. Esses relés de correio terá todo o conhecimento local que pode ser necessário para receber mensagens fora da rede que está sendo executado em -. Olhando apenas o MX e tentando enviar diretamente para o destino nem sempre vai funcionar

Se você leu tudo isso e você ainda quiser procurar registros MX, tente o SNDA biblioteca, que cuida de todos os detalhes tediosos envolvidos na resolução de DNS (e acreditem, é tedioso, e fácil de errar!).

no Linux:

host -t mx google.com

[Disclaimer: Eu costumava ser um beta tester feliz de coisas de SnertSoft, e eu ainda estou correndo vários de seus produtos]

Na verdade fazendo isso com a mão tem suas armadilhas, por exemplo, quando você tem que lidar com uma resposta truncado e necessidade de mudança de UDP para TCP.

SnertSoft 's libsnert (livre, click-through-licença necessária) já tem uma implementação C para este retornando um vetor de entradas. Tente evitar "não inventado aqui", se possível:)

Você realmente tem reimplementar um MTA em vez de usar alguma solução existente?

Dê uma olhada ldns , de NLnet Labs. Este alças biblioteca baixo manuseio de pacotes nível e tem o seu próprio cliente resolvedor built-in.

A documentação inclui href="http://www.nlnetlabs.nl/projects/ldns/doc/tutorial1_mx.html" rel="nofollow noreferrer"> exemplo de código que faz exatamente o que você precisa .

scroll top