我有一个smtp扫描程序(暴力多线程程序,使用之前定义的密码列表测试每个电子邮件帐户)。该程序是: Sanmao SMTP Mail Cracker 。
在此计划中引起我注意的一件事是为每封电子邮件分配smtp服务器地址的能力。
所有人都知道,通常smtp服务器地址的开头是:mail或smtp,后跟域名。
示例:
直到这一刻都很好。
但我看到一封包含以下域名的电子邮件: 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所建议。
答案 0 :(得分:2)
您需要执行DNS查询才能查找给定域的MX记录。这将告诉您其SMTP服务器的地址。
例如,您可以将Indy的TIdDNSResolver
组件用于此目的。