gpt4 book ai didi

delphi - 查找邮件服务器是否存在电子邮件列表

转载 作者:行者123 更新时间:2023-12-03 15:53:06 27 4
gpt4 key购买 nike

是否有一种简单的方法可以使用 Delphi 来查找域是否有 MX 记录?我有一个电子邮件列表,我希望验证这些电子邮件是否有效,我想检查每个域并查看 MX 服务器是否存在。

谢谢。

编辑:我的电子邮件地址全部来自错误代码为5.4.0的退回电子邮件。但太多服务器不遵循任何标准,5.4.0 错误代码本身可能意味着太多。我不想错误地删除所有带有该错误代码的电子邮件地址,因此我认为更好的方法是首先检查域或 mx 记录是否不存在,然后确定删除它们。

最佳答案

您可以使用 Windows DnsQuery用于检查给定服务器名称的 MX 记录的 API。不幸的是,我没有找到标题的正确 Delphi 翻译,因此我自己做了部分(但可行)翻译。它只支持 MX 和 IpV4 A 记录,不支持其他记录。添加对 IpV6 地址的支持应该很简单。

这是我的翻译,包括一个简单的 ServerHasMxRecords(const ServerName:string):Boolean 函数,如果找到任何 MX 记录,该函数将返回 True:

unit DnsMxCheck;

interface

uses Windows, Classes;

type
DNS_STATUS = Integer;
IP4_ADDRESS = DWORD;

_DNS_RECORD_FLAGS = packed record
case Boolean of
True: (DW: DWORD);
False: (DNS_RECORD_FLAGS: DWORD);
end;

DNS_A_DATA = packed record
case Boolean of
True: (IpAddress: IP4_ADDRESS);
False: (Bytes:array[0..3] of Byte);
end;

DNS_MX_DATA = packed record
pNameExchange: PWChar;
wPreference: Word;
Pad: Word;
end;

_DNS_RECORD_DATA_UNION = packed record
case Integer of
0: (A: DNS_A_DATA);
1: (MX1, MX2, AFSDB1, AFSDB2, RT1, RT2: DNS_MX_DATA);
999: (Filler: array[0..1024] of Byte); // I have no idea what the true size of the record shoud be!
end;

PDNS_RECORD = ^DNS_RECORD;
DNS_RECORD = packed record
NextRecord: PDNS_RECORD;
pName: PWChar;
wType: Word;
wDataLength: Word;
Flags: _DNS_RECORD_FLAGS;
dwTtl: DWORD;
dwReserved: DWORD;
Data: _DNS_RECORD_DATA_UNION;
end;

const DNS_TYPE_A = $0001;
DNS_TYPE_MX = $000f;

function DnsQuery_W(lpstrName: PWChar; wType: Word; Options: DWORD; pExtra: Pointer; out ppQueryResultsSet: PDNS_RECORD; pReserved: Pointer): DNS_STATUS;stdcall;external 'dnsapi.dll';

function ServerHasMxRecords(const ServerName:string):Boolean;

implementation

function ServerHasMxRecords(const ServerName:string):Boolean;
var DNS_REC: PDNS_RECORD;
begin
if DnsQuery_W(PWChar(ServerName), DNS_TYPE_MX, 0, nil, DNS_REC, nil) = 0 then
begin
while Assigned(DNS_REC) do
begin
if DNS_REC.wType = DNS_TYPE_MX then
begin
Exit(True);
end;
DNS_REC := DNS_REC.NextRecord;
end;
end;
Result := False;
end;

end.

关于delphi - 查找邮件服务器是否存在电子邮件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6444102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com