none
Wie kann ich MX-Server Name und IP-Adresse eines beliebigen Remote EMail-Servers herausbekommen? RRS feed

  • Frage

  • Guten Tag,

    Folgendes Problem:

    Der Name eines EMail-Servers sei z. B: "securesmtp.t-online.de" wie kann ich dessen Daten mittels eines C++ Programms herausbekommen? Über ein DNS Lookup Programm im Internet habe ich folgende Einträge herausbekommen:
     10 sfwdallmx.t-online.de. \
      sfwdallmx.t-online.de.     > für smtp und pop3 Server gleich!
     [194.25.134.46]             /

    Damit habe ich zwar alles was im Einzelfall benötige, aber wie frage ich einen DNS-Server eines Internet/EMail Anbieters mittels C++ Programm dynamisch ab?
    Bei weiterem Suchen stieß ich auf die Windows API Funktion DnsQuery() und baute mir folgendes Win32 Consol-Testprogramm:
      #include "Winsock2.h"
      #include <Windns.h>
      #include <iostream>
     
      ...
      ...
      PDNS_RECORD pdr = NULL;
      PCSTR pOwnerDomain = "t-online.de";
      DNS_STATUS result = DnsQuery(pOwnerDomain,
                                   DNS_TYPE_MX,
                                   DNS_QUERY_STANDARD,
                                   NULL,
                                   &pdr,
                                   NULL);
      if(result)
      {
        cout << "DNS Fehler." << std::endl;
      }
      else
      {
        cout << "EMail Server von t-online.de is: "
             << pdr->Data.MX.pNameExchange << std::endl;
      }
     
      DnsRecordListFree(pdr, DnsFreeRecordList);
      ...
    Leider ließ sich das nicht compilieren:
            error LNK2019: _DnsFree und _DnsQuery_A
    Beide Funktionen sind aber in Windns.h deklariert!
    Daraufhin habe mir https://support.microsoft.com/en-us/kb/831226 angesehen und das dort angegebene kleine Testprogramm exakt nachgebaut. Leider ließ auch das sich nicht compilieren und brachte die gleichen Fehler!
    Weiß jemand, was da falsch ist oder fehlt? Muß da noch mittels #pragma irgendeine Bibliothek mit eingebunden werden? In den Dokumentationen habe ich nichts gefunden -- oder übersehen??!
    Klaus.

    M. Thaddaeus

    Mittwoch, 8. Juni 2016 14:29

Antworten

Alle Antworten

  • Du musst die dnsapi.lib linken. Entweder per Projekteinstellung oder per #pragma comment(lib, "dnsapi.lib").

    Rudolf

    Mittwoch, 8. Juni 2016 19:30
  • Guten Tag Rudolf,

    herzlichen Dank für Deinen Hinweis. Es hat sofort nach dem Einbinden der Bibliothek geklappt! Den Servernamen in den zurückgegebenen Daten mit pdr->Data.MX.pNameExchange zu finden war nun kein Problem, aber die IP-Adresse dieses Mail-Servers kann ich in dem Datengewirr nicht finden. Hast Du dafür auch einen Tip?

    Klaus.


    M. Thaddaeus

    Freitag, 10. Juni 2016 08:08
  • Hallo

    Also, da so ein MX-Eintrag auf eine ganz andere Domäne zeigen kann (Bsp: für die Domäne "dm1.de" könnte der MX "irgendwas.nichts.su" lauten), kann der DNS Server nicht gleich noch die IP dazu zurückgeben. Um vom Namen später die IP zu bekommen, musst du daher eine weitere Anfrage machen (A-Record oder AAAA). Entweder wieder mit der gleichen Funktion oder per getaddrinfo.

    Gruss,

    Rudolf

    Samstag, 11. Juni 2016 14:00
  • Hallo Rudolf,

    Dank für den Hinweis. Ich habe das mittels getaddrinfo() erledigt.

    Gruß
       Klaus.


    M. Thaddaeus

    • Als Antwort markiert m-thaddaeus Freitag, 24. Juni 2016 13:36
    Dienstag, 14. Juni 2016 15:05