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

Delphi 如何仅基于电子邮件地址域以编程方式查找正确的smtp服务器地址?,delphi,smtp,Delphi,Smtp,我有一个smtp扫描器(蛮力多线程程序,使用前面定义的密码列表测试每个电子邮件帐户)。该程序是:三毛SMTP邮件破解程序 在这个程序中,有一件事引起了我的注意,那就是为每封电子邮件分配smtp服务器地址的能力 大家都知道,通常smtp服务器地址以“邮件”或“smtp域”开头 示例: 电子邮件:myname@gmail.com=>smtp地址:smtp.gmail.com 电子邮件:myname@bankrefah.ir=>smtp地址:mail.bankreah.ir 直到此刻一切都好 但

我有一个smtp扫描器(蛮力多线程程序,使用前面定义的密码列表测试每个电子邮件帐户)。该程序是:三毛SMTP邮件破解程序

在这个程序中,有一件事引起了我的注意,那就是为每封电子邮件分配smtp服务器地址的能力

大家都知道,通常smtp服务器地址以“邮件”或“smtp域”开头

示例:

  • 电子邮件:myname@gmail.com=>smtp地址:smtp.gmail.com
  • 电子邮件:myname@bankrefah.ir=>smtp地址:mail.bankreah.ir
直到此刻一切都好

但我看到了一封包含以下域的电子邮件:myname@hays.com.br程序将eu-smtp-inbound-2.mimecast.com指定为smtp服务器地址

现在我想知道如何在Delphi中以编程方式将smtp地址正确分配(“发现”)到任何电子邮件地址(就像在本程序中创建的一样)

多谢各位

更新:

在@Remy Lebeau的回答之后,我有一个基于的代码

但是什么也没有归还

如何解决

更新2:


插入一个著名的dns服务器(谷歌的8.8.8.8)后,代码正常工作,如@Remy Lebeau所建议的。

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


例如,您可以使用Indy的
TIdDNSResolver
组件实现此目的

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


例如,您可以使用Indy的
TIdDNSResolver
组件实现此目的

这是一个MX DNS查询。@SertacAkyuz,但所有smtp服务器地址都是MX类型?@SertacAkyuz,我找到了在某些域中可以找到正确smtp服务器地址的地方。如何在Delphi中编程?有什么想法吗?所有的邮件都是通过邮件交换器交换的。如果您修改该问题以询问编程方式,则可能可以修复该问题。@SertacAkyuz,完成。这是一个MX DNS查询。@SertacAkyuz,但所有smtp服务器地址都是MX类型?@SertacAkyuz,我发现在某些域中可以找到正确的smtp服务器地址。如何在Delphi中编程?有什么想法吗?所有的邮件都是通过邮件交换器交换的。如果您将问题修改为询问编程方式,则可能可以挽救该问题。@SertacAkyuz,done.ok我发现了,但正在生成一些编译错误。你有一些可以提供的代码示例吗?@Sormanne你没有说你使用的是什么版本的Indy,或者你遇到了什么错误。该示例代码实际上是Indy的
TIdSMTPRelay
组件使用的内部代码。请编辑您的问题,以显示您在自己的项目中遇到问题的实际代码,以及错误是什么。很好的观察此代码是Indy组件,您是对的:-)。那么,如何返回只包含正确smtp服务器地址的字符串?似乎上面的这个过程,只是用所有结果填写一个列表。@Sormanne你一直说你有错误,但你仍然没有显示错误的实际内容。至于要求DNS主机向其发送查询,如果您不希望调用方提供可用的DNS服务器,您可以要求操作系统提供可用的DNS服务器。上面的代码返回异常:(DNS未响应)。我找到了,但生成了几个编译错误。你有一些可以提供的代码示例吗?@Sormanne你没有说你使用的是什么版本的Indy,或者你遇到了什么错误。该示例代码实际上是Indy的
TIdSMTPRelay
组件使用的内部代码。请编辑您的问题,以显示您在自己的项目中遇到问题的实际代码,以及错误是什么。很好的观察此代码是Indy组件,您是对的:-)。那么,如何返回只包含正确smtp服务器地址的字符串?似乎上面的这个过程,只是用所有结果填写一个列表。@Sormanne你一直说你有错误,但你仍然没有显示错误的实际内容。至于要求DNS主机向其发送查询,如果您不希望调用方提供可用的DNS服务器,则可以向操作系统请求可用的DNS服务器。上面的代码返回异常:(DNS未响应)。
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;