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