我正在编写一个应用程序,要求我对 MX 记录进行 DNS 查找。我不确定是否有人有过从事此类工作的经验,但如果有,我们将不胜感激。
编辑:我要做的是一个将发送电子邮件警报的应用程序。问题是我需要让应用程序能够查找域的 MX 记录。
最简单的方法是简单地使用常用工具。
基本的“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);
}
我注意到您正在为 Linux 编写代码。常规程序在类 Unix 系统上发送邮件的惯用方式是:
两种方式都假定本地邮件程序被配置为将邮件传递到它必须去的地方;在配置良好的 Linux 机器上,这是一个合理的假设。
如果这不吸引人,那么第二好的方法是让您的程序接受要使用的本地邮件中继服务器的地址,然后在端口 25 上连接到该服务器。
换句话说,尽可能使用现有的邮件中继来发送您的邮件。这些邮件中继将拥有将邮件从您正在运行的网络中取出所需的所有本地知识 - 仅查找 MX 并尝试直接发送到目的地并不总是有效。
如果您已经阅读了所有内容,但仍想查找 MX 记录,请尝试使用adns 库,它会处理 DNS 解析中涉及的所有繁琐细节(相信我,这很繁琐,而且容易出错!) .
在 Linux 上:
host -t mx google.com
[免责声明:我曾经是 SnertSoft 产品的快乐 Beta 测试者,我仍在运行他们的一些产品]
实际上,手动执行此操作有其缺陷,例如,当您必须处理截断的响应并需要从 UDP 切换到 TCP 时。
SnertSoft的libsnert
(免费,需要点击许可)已经有一个 C 实现,用于返回条目向量。如果可能的话,尽量避免“不是在这里发明的”:)
您是否确实需要重新实现 MTA 而不是使用一些现有的解决方案?