Я пререкался по тому же вопросу пока ретро, соответствующее LINQ к SQL по DB прежней версии. Наша база данных является чем-то вроде громадины (150 таблиц) и после некоторого размышления и экспериментирования, я выбрал использовать несколько DataContexts. Рассматривают ли это, антишаблон еще неизвестно, но на данный момент он делает жизнь управляемой.
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.
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);
}
Я заметил, что вы пишете для Linux. Идоматический способ для обычной программы отправлять почту в Unix-подобных системах:
Оба способа предполагают, что локальная почтовая программа настроена на пересылку почты туда, куда она должна идти; на хорошо сконфигурированном Linux-сервере это справедливое предположение.
Если это не нравится, второй лучший способ для вашей программы - принять адрес локального почтового ретрансляционного сервера для использования и просто подключиться к нему сервер на порту 25.
Другими словами, по возможности используйте существующий почтовый ретранслятор для отправки почты. Эти почтовые ретрансляторы будут обладать всеми местными знаниями, которые могут потребоваться для вывода почты из сети, которую вы '
[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?
Взгляните на ldns из NLnet Labs. Эта библиотека обрабатывает пакеты низкого уровня и имеет собственный встроенный клиент-преобразователь.
Документация включает пример кода , который делает именно то, что вам нужно.