代码之家  ›  专栏  ›  技术社区  ›  Suroot

从DNS服务器中提取MX记录

  •  9
  • Suroot  · 技术社区  · 15 年前

    我正在编写一个应用程序,该应用程序要求我对MX记录进行DNS查找。我不确定是否有人有做这类工作的经验,但如果你有,任何帮助都会受到感激。

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

    5 回复  |  直到 8 年前
        1
  •  19
  •   Great Turtle    15 年前

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

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

    然后只需解析这些常用工具的输出。

    编辑:Web套接字的简单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);
    }
    
        2
  •  1
  •   caf    15 年前

    我注意到你在为Linux写作。常规程序在类Unix系统上发送邮件的IDomatic方法是:

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

    这两种方法都假定本地邮件程序被配置为将邮件传递到它必须到达的位置;在配置良好的Linux设备上,这是一个公平的假设。

    如果这不吸引人,第二个最好的方法是让程序接受要使用的本地邮件中继服务器的地址,并只连接到端口25上的服务器。

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

    如果你已经读了所有的东西 仍然 要查找MX记录,请尝试 adns library 它处理了所有与DNS解析有关的繁琐细节(相信我,它 无聊,而且容易出错!).

        3
  •  1
  •   Patrick Hofman Wahid Bitar    10 年前

    Linux上:

    host -t mx google.com
    
        4
  •  0
  •   Volker Stolz    15 年前

    [免责声明:我曾经是一个快乐的测试人员,测试过斯内特索夫的产品,现在我仍在运行他们的一些产品]

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

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

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

        5
  •  0
  •   Alnitak    15 年前

    看一看 ldns 来自NLNET实验室。此库处理低级数据包处理,并内置有自己的解析程序客户端。

    文件包括 example code 这完全符合你的要求。

    推荐文章