10

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

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

4

5 回答 5

20

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

基本的“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 示例

由于您将“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);
}
于 2009-07-07T16:39:23.497 回答
1

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

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

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

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

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

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

于 2009-07-08T10:26:00.170 回答
1

在 Linux 上:

host -t mx google.com
于 2014-10-06T14:03:00.960 回答
0

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

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

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

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

于 2009-07-08T12:04:03.357 回答
0

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

该文档包含完全符合您要求的示例代码。

于 2009-07-08T14:25:15.623 回答