如何以编程方式查找仅基于电子邮件地址域的正确smtp服务器地址?

时间:2017-10-08 20:11:50

标签: delphi smtp

我有一个smtp扫描程序(暴力多线程程序,使用之前定义的密码列表测试每个电子邮件帐户)。该程序是: Sanmao SMTP Mail Cracker

Files of program

在此计划中引起我注意的一件事是为每封电子邮件分配smtp服务器地址的能力。

所有人都知道,通常smtp服务器地址的开头是:mail或smtp,后跟域名。

示例:

  • 电子邮件: myname@gmail.com => smtp地址: smtp.gmail.com
  • 电子邮件: myname@bankrefah.ir => smtp地址: mail.bankrefah.ir

直到这一刻都很好。

但我看到一封包含以下域名的电子邮件: myname@hays.com.br ,并且已分配的程序 eu-smtp-inbound-2 .mimecast.com 作为smtp服务器地址。

现在我想知道如何在Delphi中以编程方式正确地(“发现”)将smtp地址分配给任何电子邮件地址(就像在此程序中所做的那样)。

谢谢。

更新

回答@Remy Lebeau后,我的代码基于other answer

function ResolveMx(email: string; dnsHost: string): string;
var
  DNS: TIdDNSResolver;
  I, J: Integer;
  sDomain: string;
  Record_: TResultRecord;
  Txt: TTextRecord;
  Srv: TSRVRecord;
  MX: TMXRecord;
begin
  DNS := TIdDNSResolver.Create(nil);
  try
    J := Pos('@', email);
    if (J > 0) then
      sDomain := Copy(email, Succ(J), Length(email))
    else
      sDomain := email;
    DNS.WaitingTime := 3000;
    DNS.QueryType := [qtTXT, qtService, qtMX];
    DNS.Host := dnsHost;

    try

      DNS.Resolve(sDomain);
    except
      on e: exception do
        Form1.mmo1.Lines.Add(e.message);
    end;

    for I := 0 to DNS.QueryResult.Count - 1 do
    begin
      Record_ := DNS.QueryResult[I];
      case Record_.RecType of
        qtTXT:
          begin
            Txt := TTextRecord(Record_);
            // use Txt.Text as needed...
          end;
        qtService:
          begin
            Srv := TSRVRecord(Record_);
            // use Srv.OriginalName, Srv.Service, Srv.Protocol, etc as needed...
          end;
        qtMX:
          begin
            MX := TMXRecord(Record_);
            Result := MX.ExchangeServer;
          end
      else
        // something else...
      end;
    end;
  finally
    DNS.Free;
  end;
end;

但没有任何回报。

如何解决?

UPDATE2:

在插入知名的dns服务器(Google的 8.8.8.8 )后,代码正常工作,如@Remy Lebeau所建议。

1 个答案:

答案 0 :(得分:2)

您需要执行DNS查询才能查找给定域的MX记录。这将告诉您其SMTP服务器的地址。

例如,您可以将Indy的TIdDNSResolver组件用于此目的。