Получение по запросу MX записывает с сервера DNS

Я пререкался по тому же вопросу пока ретро, соответствующее LINQ к SQL по DB прежней версии. Наша база данных является чем-то вроде громадины (150 таблиц) и после некоторого размышления и экспериментирования, я выбрал использовать несколько DataContexts. Рассматривают ли это, антишаблон еще неизвестно, но на данный момент он делает жизнь управляемой.

9
задан JasonMArcher 9 March 2015 в 06:37
поделиться

4 ответа

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);
}
19
ответ дан 4 December 2019 в 10:05
поделиться

Я заметил, что вы пишете для Linux. Идоматический способ для обычной программы отправлять почту в Unix-подобных системах:

  • Запустить / usr / bin / mail в подпроцессе и отправить ему почтовое сообщение на стандартный ввод (см. Man-страницу mail); или
  • Подключитесь к 127.0.0.1:25 и дайте локальному почтовому демону сообщение для доставки.

Оба способа предполагают, что локальная почтовая программа настроена на пересылку почты туда, куда она должна идти; на хорошо сконфигурированном Linux-сервере это справедливое предположение.

Если это не нравится, второй лучший способ для вашей программы - принять адрес локального почтового ретрансляционного сервера для использования и просто подключиться к нему сервер на порту 25.

Другими словами, по возможности используйте существующий почтовый ретранслятор для отправки почты. Эти почтовые ретрансляторы будут обладать всеми местными знаниями, которые могут потребоваться для вывода почты из сети, которую вы '

1
ответ дан 4 December 2019 в 10:05
поделиться

[Disclaimer: I used to be a happy beta tester of SnertSoft's stuff, and I'm still running several of their products]

Actually doing this by hand has its pitfalls, e.g. when you have to handle a truncated response and need to switch from UDP to TCP.

SnertSoft's libsnert (free, click-through-license required) already has a C implementation for this returning a vector of entries. Try to avoid "not-invented-here" if possible :)

Do you indeed have to reimplement an MTA instead of using some existing solution?

0
ответ дан 4 December 2019 в 10:05
поделиться

Взгляните на ldns из NLnet Labs. Эта библиотека обрабатывает пакеты низкого уровня и имеет собственный встроенный клиент-преобразователь.

Документация включает пример кода , который делает именно то, что вам нужно.

0
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: