怎样在delphi程序中判断一个email地址是否有效?(100分)

  • 主题发起人 主题发起人 chenziyi
  • 开始时间 开始时间
只能发 email 了,等服务器返回才知道无效
 
我见过有些软件,可以在程序中判别一个email地址是否有效,比如,有一个地址
abc@263.net,是不是可以连到smtp.263.net上去,用程序去测试它的返回信息。根据
返回信息去判断。
 
nmsmtp1.verify
 
to Jacky Zhao:
我也测试过verify命令,但是,有很多免费服务器对这个命令返回的值不正确。
 
其实据我所知,对一般的不太特别要求的E_mail地址,用字符串来判别。至于1要验证这个
E_mail 是否真的正确,那只有象上面Jacky zhao 的说法了。很难
 
有谁知道 SMTP中RCPT命令的用法吗?
 
RCPT <SP> TO:<forward-path> <CRLF>
此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个250 OK应答,
并存储向前路径。如果接收者未知,接收方会返回一个550 Failure应答。此过程
可能会重复若干次。
  <forward-path>不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一个
主机就是接收命令的主机。
eg:
RCPT TO:<Jones@Beta.ARPA>

 
to wsy205:
我这里有一段代码:其中smtp是一个smtp的客户端控件
//init smtp控件的属性 smtp.host:='smtp.263.net';
smtp.Connect;
try
smtp.Authenticate;
smtp.SendCmd('MAIL FROM:<'+'chenziyi@263.net'+'>',250);
myresult:= SMTP.SendCmd('RCPT TO:<' + 'czyjuan@263.net' + '>', [550,551,250]);
//////////////这里RCPT TO后的参数我不管怎么变,返回的值都是250,我的理解是
//如果czyjuan@263.net不是smtp.263.net上的邮件地址,他的返回值将是550,不知对否?
//如果要判断一个邮件地址是不是当前smtp服务器的地址,要怎样写?
if myresult=250 then showmessage('ok')
else
showmessage('error');
finally
SMTP.Disconnect;
end;
 
//////////////这里RCPT TO后的参数我不管怎么变,返回的值都是250,我的理解是
//如果czyjuan@263.net不是smtp.263.net上的邮件地址,他的返回值将是550,不知对否?
1、如果RCTP这个邮件操作完成才返回250;但如果这个邮箱地址未找到或不存在,
将会返回550,表示要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,
或不可访问)。出现了550错误并不是用来
判断收件人邮箱是否是当前SMTP服务器的邮箱地址。如果你把收件人邮箱改
成一个不存在的邮箱就会返回一个550
//如果要判断一个邮件地址是不是当前smtp服务器的地址,要怎样写?
2、只要比较一下邮件地址的域是否当前SMTP服务器所在的域即可
比如smtp.163.net的域是163.net,yourmail@163.net的域也是163.net则表明
yourmail@163.net是当前SMTP服务器的地址

Good Luck.
 
to wys205:
可能我的表达有误,我的本意是用程序去判断一个email地址是不是一个smtp服务器上
的有效地址,比如:czyjuan@263.net是smtp.263.net上的一个有效地址,但是
czyjuan84569877@263.net就不是一个有效地址,因为还没有注册。怎样解决这个问题?
//1、如果RCTP这个邮件操作完成才返回250;但如果这个邮箱地址未找到或不存在,
将会返回550,表示要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,
或不可访问)。出现了550错误并不是用来
判断收件人邮箱是否是当前SMTP服务器的邮箱地址。如果你把收件人邮箱改
成一个不存在的邮箱就会返回一个550
但是我把czyjuan@263.net改为czyjuan@26333.net,程序还是返回250,不知道为什么?
 
//可能我的表达有误,我的本意是用程序去判断一个email地址是不是一个smtp服务器上
//的有效地址,比如:czyjuan@263.net是smtp.263.net上的一个有效地址,但是
//czyjuan84569877@263.net就不是一个有效地址,因为还没有注册。怎样解决这个问题?
只能等待SMTP服务器返回信息才能知道是否有效。

//但是我把czyjuan@263.net改为czyjuan@26333.net,程序还是返回250,不知道为什么?
这里返回250只是表示你的请求被接受,因为域26333.net并不在本机,它不能判断是否存在
这样的域,只能向上级或其它主机去解析域名,如果域名不存在则返回错误信息,要真正
判断一个EMAIL地址是否有效,只能等SMTP服务器返回的信息才能知道
 
难 !就是在WEB上面,也只能是判断email内有没有@和.符出现,至于是否有效无法验证。。。
 
Jacky Zhao说得很对,就是利用这个了!

if nmsmtp1.verify(username) then
showmessage('用户存在!')
else
showmessage('用户不存在!')


原型为:
Declaration
function Verify(User: String) : Boolean;
 
有很多服务器是禁止VRFY命令的,主要是出于安全性考虑,这个命令我仔细测试过。
有些服务器响应,有些不响应。
所以,问题还没有解决,请大虾们帮忙。
 
多人接受答案了。
 
后退
顶部