从 DNS 服务器中提取 MX 记录

Posted

技术标签:

【中文标题】从 DNS 服务器中提取 MX 记录【英文标题】:Pulling MX record from DNS server 【发布时间】:2010-11-08 18:26:39 【问题描述】:

我正在编写一个应用程序,它要求我对 MX 记录进行 DNS 查找。我不确定是否有人有过从事此类工作的经验,但如果有,我们将不胜感激。

编辑: 我要做的是一个可以发送电子邮件警报的应用程序。问题是我需要让应用程序能够查找域的 MX 记录。

【问题讨论】:

您的实际问题是什么?目前它有点分散。另外,如果您有与手头问题相关的代码,请提供。 是的,很抱歉;我目前没有可用的代码,因为我正试图弄清楚如何编写代码。基本上我正在尝试编写一个应用程序来查找 MX 记录。 没问题。这可能会帮助你。 tools.ietf.org/html/rfc1035 感谢您的链接,我知道我可以做一些事情,例如发送 DGRAM,然后在 DGRAM 上监听响应,但这会很痛苦,因为我需要知道源端口听着,但如果 resolver(3) 没有成功,这似乎是最好的选择。 53 是 DNS 的默认值。它可能是另一个,但它适用于根 DNS 服务器。 【参考方案1】:

在 Linux 上:

host -t mx google.com

【讨论】:

【参考方案2】:

最简单的方法是简单地使用常用的工具。

基本的“挖掘”命令将通过此查询将记录返回给您:

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 示例

由于您将“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);

【讨论】:

抱歉造成混淆,我正在尝试查找将在 dig 中用于查找 MX 记录的代码。我知道存在 dig 和 nslookup,我的事情是我想编写一个无需外部应用程序即可进行这些查找的应用程序。 你可以在这里下载它的源代码:isc.org/downloadables/11 谢谢,我正在查看您之前发布的代码,看起来比较接近,更重要的是,resolver(3) 手册页在那里看起来非常有用。 我回复了包含代码的答案,因为您认为它很有用。 我知道已经晚了 :-),但我有机会在 2021 年遇到这个问题。您可能想用 res_search 替换 res_query。后者会将短名称扩展到 resolv.conf 中“搜索”条目中列出的路径。【参考方案3】:

看看来自 NLnet Labs 的 ldns。该库处理低级数据包处理,并内置了自己的解析器客户端。

该文档包括 example code,它完全符合您的要求。

【讨论】:

【参考方案4】:

[免责声明:我曾经是 SnertSoft 产品的快乐 Beta 测试者,我仍在运行他们的一些产品]

实际上手动执行此操作有其缺陷,例如当您必须处理截断的响应并需要从 UDP 切换到 TCP 时。

SnertSoft 的libsnert(免费,需要点击许可)已经有一个用于返回条目向量的 C 实现。如果可能的话,尽量避免“不是在这里发明的”:)

您是否确实需要重新实现 MTA 而不是使用某些现有解决方案?

【讨论】:

【参考方案5】:

我注意到您正在为 Linux 编写代码。常规程序在类 Unix 系统上发送邮件的惯用方式是:

在子进程中运行 /usr/bin/mail 并在其标准输入上发送邮件消息(参见邮件手册页);或 连接到 127.0.0.1:25 并向本地邮件守护程序提供要传递的消息。

这两种方式都假定本地邮件程序被配置为将邮件传递到它必须去的地方;在配置良好的 Linux 机器上,这是一个合理的假设。

如果这没有吸引力,第二好的方法是让您的程序接受要使用的本地邮件中继服务器的地址,然后在端口 25 上连接到该服务器。

换句话说,尽可能使用现有的邮件中继来发送您的邮件。这些邮件中继将拥有将邮件从您正在运行的网络中取出所需的所有本地知识 - 仅查找 MX 并尝试直接发送到目的地并不总是有效。

如果您已经阅读了所有内容并且仍然想查找 MX 记录,请尝试使用 adns library,它会处理 DNS 解析中涉及的所有繁琐细节(相信我,它乏味的,而且容易出错!)。

【讨论】:

以上是关于从 DNS 服务器中提取 MX 记录的主要内容,如果未能解决你的问题,请参考以下文章

这些是重复的还是冗余的 MX 和 A 记录?

如何查看linux系统 mx记录ns记录

DNS域名解析中A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR各项记录的作用

DNS域名解析中添加的各项解析记录

如果我更改 DNS MX 记录,我会丢失存储在 Webmail 中的现有电子邮件吗?

DNS解析流程