关于邮件的一个问题?(所有分以奉上,请高手解答)在线等待回答 (135分)

A

asiasmm

Unregistered / Unconfirmed
GUEST, unregistred user!
就是如何证明一个信箱地址是存在的,我知道先通过DNS服务器查看邮件服务器是否存在,
如果服务器存在则进行用户确认,但是如何进行用户确认?如果确认多个用户怎么办?
(所有分以奉上,请高手解答/或者有没有这方面的原代码)
 
use "VRFY" comand
 
请详细点说行么?
 
真的希望有人能够回答你呀!咱也学两手!
 
use "VRFY" comand 这个命令好象不是通用的,有些服务器不支持。
请问有没有更直接的更有效的命令,并且通用?
 
这个我不会
 
好多的软件是通过伪装发信来实现的,就是说通过TCLIENTSOCKET连接服务器,然后假装
要用这个邮箱发信,如果没有这个邮箱,那么服务器会有反馈信息告诉你的。
具体的实现我就不知道了
 
这样只能测试一部分,多了就不行了
 
---------------------------------------------
下面是我收藏的资料,看能不能帮上你的忙! :)
-----------------------------------------------
一、实现原理
在Outlook Express中,可通过查看邮件的属性得到该邮件的头部资料。我们拿一封不是特快专递的普通邮件来进行剖析,下面是笔者一封邮件的头部资料:

Received: from sm1.163.com([202.108.44.203]) by peoplemail.com.cn(JetMail 2.5.3.0)
with SMTP id jm1ac3c063eec;
Thu, 29 Nov 2001 07:20:25 -0000
Received: from xubo (unknown [61.154.94.146])
by sm1.163.com (Postfix) with ESMTP id 99CF11C461061
for <cxubo@peoplemail.com.cn>;
Thu, 29 Nov 2001 15:12:49 +0800 (CST)
……
从该头部资料可以看出,邮件传递的路线是由xubo→sm1.163.com→peoplemail.com.cn,其中xubo是本人所在机器,邮件是经由sm1.163.com这个中转站才送到目的地的,而我们平常所说的邮件特快专递,就是把邮件直接送到目的地而不需要中转站。
如何才能知道目的地的地址呢?我们知道电子邮件的地址由用户名(username)和邮箱域名(address.com)两部分构成的,给域名服务器发送针对“address.com”的MX指令查询即可找到目的地的地址。被查出来的目的地可能不止一个,有时这些目的地是有优先级别之分的,分别对应着邮件的优先级别,你可以根据邮件优先级的不同对应发送,也可以任意选择其中一个发送,本文的示例将选择反馈回来的第一个目的地发送,读者可根据实际需要进行改进。

二、用到的核心组件
本文将采用Indy控件集进行域名查询、邮件发送部分的编程。INDY的全名是Internet Direct(也叫Winshoes),是一套开放源代码、跨平台、优秀的Internet控件集,它支持大部分流行的Internet协议。Delphi 6已经包含了该控件集,如果你使用的是Delphi 6以前的版本,请先到Indy主页http://www.nevrona.com/Indy/Download.html下载并安装该控件集。

三、窗口设计
向窗体上放置三个TEdit组件,一个TMemo组件,四个Tlabel组件,用到的Indy组件为TIdDNSResolver、TIdAntiFreeze、TIdSMTP、TIdMessage。其中TIdDNSResolver是用来向域名服务器发出查询请求并得到结果,TIdMessage用来构建邮件,TIdSMTP用来发送邮件,TidAntiFreeze可以确保Indy在工作时程序能响应来自外界的消息(注:Indy是以同步的方式进行工作的,在读或写操作完成之前,其它代码无法执行,加入TidAntiFreeze可以在每隔一段时间通过呼叫Application.ProcessMessage方法响应来自外界的消息。)
程序的界面如下图所示(箭头所指向的文字标识了该组件的名字):

四、程序代码(代码中包含了详细的说明)

……(前面一部分省略)
type
TForm1 = class(TForm)
IdDNSResolver: TIdDNSResolver;
IdAntiFreeze1: TIdAntiFreeze;
btnSend: TButton;
IdSMTP: TIdSMTP;
IdMsgSend: TIdMessage;
mmContent: TMemo;
Label1: TLabel;
edtTo: TEdit;
Label4: TLabel;
Label5: TLabel;
edtFrom: TEdit;
Label6: TLabel;
edtSubject: TEdit;
procedure btnSendClick(Sender: TObject);
private
{ Private declarations }
procedure GetMxList(AMxList: TStringList;
AQName: string);
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

{ 这个过程是用来得到邮件特快专递目的地服务器名称及优先级别数,参数AMXList是
用来接收结果值,AQName代表传递过来的域名 }
procedure TForm1.GetMxList(AMxList: TStringList;
AQName: string);
var
i: Integer;
begin

with IdDNSResolverdo

begin

Host := '202.101.107.55';
{ Host属性用来指定域名服务器的地址,此处为笔者所在地
的主域名服务器地址,你也可以指定任一可以快速访问到的Internet上域名服务器
地址,要知道自己所在地的域名服务器地址,win98下通过winipcfg命令,win2000下
通过ipconfig /all即可查出。}
ReceiveTimeout := 10000;
// 在指定的时间内得不到域名服务器的反馈,则视为失败。
ClearVars;
// 清除前一次查询所反馈回来的资源记录

{ 构建此次查询的头部结构 }
with DNSHeaderdo

begin

Qr := False;
// False 代表查询
Opcode := 0;
// 0代表标准域名查询
RD := True;
//域名服务器可以进行递归查询
QDCount := 1;
//查询的数量
end;


{ 构建要查询的问题 }
DNSQDList.Clear;
with DNSQDList.Adddo

begin

QName := AQName;
//要查询的域名
QType := cMX;
//QTYPE指定要查询的资源记录的种类,值为cMX代表邮件交换记录
QClass := cIN;
end;


ResolveDNS;
//向域名服务器发出请求

{ 从域名服务器接收反馈的结果,将反馈回来的邮件服务器名称放在AMXList列表的Name部分,
邮件服务器的优先级别数放在Value部分。 }
for i := 0 to DNSAnList.Count - 1do

AMxList.Add(DNSAnList.RData.MX.Exchange + '=' +
IntToStr(DNSAnList.RData.MX.Preference));
end;

end;


{ 单击"发送"按钮时发送专递邮件 }
procedure TForm1.btnSendClick(Sender: TObject);
var
MxList: TStringList;
i: Integer;
QName, ThoughAddress: string;
begin

{ 根据用户所填写的内容创建邮件 }
with IdMsgSenddo

begin

Body.Assign(mmContent.Lines);
//邮件正文
From.Address := Trim(edtFrom.Text);
//发件人地址
Recipients.EMailAddresses := Trim(edtTo.Text);
//收件人地址
Subject := edtSubject.Text;
//邮件主题
end;


{ 从输入的收件人地址中取出邮箱域名,利用前面的GetMxList过程得到目的地地址 }
QName := TrimRight(copy(edtTo.Text, Pos('@', edtTo.Text) + 1, Length(edtTo.Text)));
MxList := TStringList.Create;
try
GetMxList(MxList, QName);
ThoughAddress := MxList.Names[0];
{取反馈回来的第一个服务器为目的地,读者可
根据实际需要改进,比如说考虑到信件的优先级或当你选择的服务器因繁忙而暂时
不能处理你的信件时,换用其它服务器试试 }
finally
MxList.Free;
end;


{ 发送邮件 }
with IdSMTPdo

begin

Host := ThoughAddress;
// 将Host赋值为目的地,这就是特快专递与普通邮件的区别
Port := 25;
// smtp服务默认的端口为25
Connect;
//连接到服务器
try
Send(IdMsgSend);
//发送刚才创建的邮件
ShowMessage('发送完毕');
//发送完毕后提示
finally
Disconnect;
//断开服务器连接
end;

end;

end;


end.

 
基本上目前是没有办法实现。这些取决于对方的smtp服务器。
如果对方的smtp服务器没有提供用户验证或收信校对那就没有办法测出。
方法:
  可以直接向服务器提交邮件指令。
 
同意楼上,如果smtp服务器支持匿名发邮件的话,你很难有办法。
否则可以VRFY 的
 
是啊沒辦法的
 
想想人家做的'Email地址搜索'程序是怎么做的﹖我以前想了很久了﹗也沒有做出來﹗
用vrfy做﹗有的行﹐有的不行﹗速度也不快﹗然后我又用模擬發郵件的方式做﹗開60個線
程﹐慢的要死(程序有問題),而且也不准﹐我也用過外面的搜索Email的程序﹐比如我在
163申請了一個Email地址﹐用人家的程序搜不到﹗﹗多多少少有點像騙人的﹗不知道人家的
程序是怎么做的﹗﹗怪﹗﹗﹗那樣的爛東西還買錢﹗﹗﹗﹐大家繼續討論﹐我也想學點東西
﹗﹗﹗
 
问题已经解决,发例子到你的信箱了!
 

Similar threads

顶部