我正在编写一个应用程序,要求我对MX记录进行DNS查找。我不确定是否有人有过这种工作的经验,但如果你这样做,我们将不胜感激。
编辑: 我想要的是一个将发送电子邮件警报的应用程序。问题是我需要让应用程序能够查找域的MX记录。
答案 0 :(得分:19)
最简单的方法是简单地使用常用工具。
基本的“dig”命令将通过此查询返回记录:
dig mx example.com
如果您只想要带有mx记录的行......
dig mx example.com | grep -v '^;' | grep example.com
dig可用于大多数linux / unix盒子。
如果你在Windows上,你可以使用nslookup
nslookup -type=mx example.com
然后只解析这些常用工具的输出。
由于您将“C”作为标记,我猜您正在寻找使用原始套接字进行MX查找的源代码。我从http://www.developerweb.net/forum/showthread.php?t=3550复制了这个。它可能更符合您的需求?
#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);
}
答案 1 :(得分:1)
我注意到你正在为Linux写作。常规程序在类Unix系统上发送邮件的惯用方法是:
两种方式都假设本地邮件程序配置为将邮件传递到它必须去的地方;在一个配置良好的Linux机器上,这是一个公平的假设。
如果这不具有吸引力,那么第二种最好的方法是让您的程序接受要使用的本地邮件中继服务器的地址,并且只需在端口25上连接到该服务器。
换句话说,尽可能使用现有的邮件中继来发送邮件。这些邮件中继将拥有将您的邮件运出网络所需的所有本地知识 - 只需查找MX并尝试直接发送到目的地并不总是有效。
如果您已经阅读了所有这些并且仍想要查找MX记录,请尝试adns library,它会处理DNS解析中涉及的所有繁琐细节(并相信我, 乏味,容易出错!)。
答案 2 :(得分:1)
在linux上:
host -t mx google.com
答案 3 :(得分:0)
[免责声明:我曾经是SnertSoft的一个快乐的测试版测试人员,我还在运行他们的几个产品]
实际上手工做这件事有其缺陷,例如:当你必须处理截断的响应并需要从UDP切换到TCP时。
SnertSoft的libsnert
(免费,需要点击许可)已经有一个C实现,用于返回一个条目向量。尽可能避免“不发明在这里”:)
您确实需要重新实现MTA而不是使用现有的解决方案吗?
答案 4 :(得分:0)
查看来自NLnet Labs的ldns。该库处理低级数据包处理,并内置自己的解析器客户端。
该文档包含example code,它完全符合您的要求。