Delphi ships with Indy, and those steps can be performed using Indy's TIdDNSResolver
and TIdSMTP
components, eg:
function VerifyEmail(const email: string): Boolean;
var
I: Integer;
domain: string;
begin
Result := False;
I := Pos('@', email);
if I = 0 then Exit;
domain := Copy(email, I+1, MaxInt);
IdDNSResolver1.Host := ... Host/IP of DNS server you want to query ...;
IdDNSResolver1.QueryType := [qtMX];
try
IdDNSResolver1.Resolve(domain);
except
Exit;
end;
for I := 0 to IdDNSResolver1.QueryResult.Count-1 do
begin
if IdDNSResolver1.QueryResult[I] is TMXRecord then
begin
IdSMTP1.Host := TMXRecord(IdDNSResolver1.QueryResult[I]).ExchangeServer;
try
IdSMTP1.Connect;
try
IdSMTP1.SendCmd('MAIL FROM:<labnol@labnol.org>', 250);
IdSMTP1.SendCmd('RCPT TO:<'+email+'>', [250, 251]);
Result := True;
Exit;
finally
IdSMTP1.Disconnect;
end;
except
end;
end;
end;
end;
Alternatively, use the TIdSMTP.Verify()
method instead, that way you don't have to fake an email just to discover if the recipient is accepted, eg:
function VerifyEmail(const email: string): Boolean;
var
I: Integer;
user, domain: string;
begin
Result := False;
I := Pos('@', email);
if I = 0 then Exit;
user := Copy(email, 1, I-1);
domain := Copy(email, I+1, MaxInt);
IdDNSResolver1.Host := ... Host/IP of DNS server you want to query ...;
IdDNSResolver1.QueryType := [qtMX];
try
IdDNSResolver1.Resolve(domain);
except
Exit;
end;
for I := 0 to IdDNSResolver1.QueryResult.Count-1 do
begin
if IdDNSResolver1.QueryResult[I] is TMXRecord then
begin
IdSMTP1.Host := TMXRecord(IdDNSResolver1.QueryResult[I]).ExchangeServer;
try
IdSMTP1.Connect;
try
IdSMTP1.Verify(user);
Result := True;
Exit;
finally
IdSMTP1.Disconnect;
end;
except
end;
end;
end;
end;