[转载]电子邮件收发编程讲解与实例
在delphi中TNMPop控件 -------接收电子邮件,pop3
pop3协议自身命令
命令 说明
USER 向pop3服务器器传递用户名
PASS 向pop3服务器器传递用户密码
STAT 获取当前用户的邮件数
LIST 获取邮件标号和大小
BETR 获取邮件的全部信息,包括邮件头和邮件内容
TOP 获取邮件头
DELE 删除指定的邮件
NOOP 空操作
QUIT 退出主机对话
控件属性
1、 AttachFilePath
指定附件存放路径,为空指当前路径
2、 BytesRecvd
收了多少个字节
3、 BytesTotal
本次传输总的字节数
4、 Connected
与pop3服务器建立了连接则返回true,否则为false
例:
if not nmpop31.connect then
begin
nmpop31.port:=110;
nmpop31.userid:=’username’;
nmpop31.password:=’userpassword’;
nmpop31.connect;
end;
5、 DeleteOnRead
如果属性为true时,则当邮件下载后从服务器删除掉
6、 host
服务器主机名或ip地址
7、 LocalIp
返回客户的IP地址,如果有多个,则只返回第一个。
8、 mailcount
返回邮件数
9、 mailmessage
调用了getmailmessage方法后,该属性返回检索到的邮件信息,它是一个类
包含了以下几部份:
l Attachments:这是个tstringlist对象:包含了接收到邮件的附件名称
l Body: 这是个tstringlist对象:包含了接收到邮件的正文
l From:发件人的e_mail地址
l Head: 这是个tstringlist对象,包含了邮件头的标题
l MessageID:邮件的识别号
l Subject:邮件的主题
10、password,port,userid
向pop3服务器提交的用户密码,协议端口,用户识别名
11、RemoteIP
pop3服务器的IP地址
12、ReportLevel
指示了与pop3服务器的通话状态信息?
13、Status
返回当前状态信息
14、Summary
是一个类,包含邮件的统计信息。其中包含了以下几部份:
l Bytes邮件的字节数;
l From 发件人的邮件地址
l MessageID邮件的编号
l Subject这是邮件的主题
15、TimeOut
单位毫秒数,当Socket在这里所指定时间内没有响应,将会触发异常。
16、TransactionReply
返回上次命令执行结果。
******************************************************************
控件方法:
1、 Abort
中止此次接收,且断开与Pop3服务器的连接。
2、 Connect
与Pop3服务器的连接,但事先设好host,port,userid,password属性。
例:
Nmpop31.host:=”mail.wofoo.com”;
Nmpop31.port:=110;
Nmpop31.reportlevel:=1;
Nmpop31.timeout:=1000;
Nmpop31.connect;
3、 DeleteMessage(MailNumber:integer)
从Pop3服务器删除一个邮件号为MailNumber的邮件。注:这里并没有真正删除,当在断开边接之前调用reset,将被恢复。
4、 Disconnect
断开与Pop3服务器的连接。
5、 GetMailMessage(MailNumber:integer)
从Pop3服务器下载一个邮件号为MailNumber的邮件
6、 GetSummary(MMailNumber:integer)
得到一个邮件信息,其邮件号为MailNumber。
7、 List
从邮件服务器检索一个列表。该列表包含每一封邮件的编号和字节数,列表中的每一项将触发一个Onlist事件。
8、 Reset
将恢复服务器中所有标记为已删除的邮件。
**************************************************************
控件事件:
1、 OnAuthenticationFailed (Var handled:Boolean)
登陆服务器时,用户名与密码不能通过,将触发该事件。
更正了后,如果将Handled参数设为True,将再登陆一次。
2、 OnAuthenticationNeeded(Var handled:Boolean)
如果某个操作需要验证用户的身份,将触发这个事件。
例:
procedure Tform1.NMPOP31 AuthenticationNeeded(Var handled:Boolean);
var newpass,newid:string;
begin
newpass:= NMPOP31 .password;
newid:= NMPOP31.userid;
inputquery(‘Authentication Need ‘,’ input userid’,newid);
inputquery(‘Authentication Need ‘,’ input password’ ,newpass);
NMPOP31.userid;:=newid;
NMPOP31.password:=newpass;
Handled:=true;
end;
3、 OnConnect
当与服务器连接成功时将显示触发该事件。
4、 OnConnectFailed
当与服务器连接失败时将显示触发该事件
5、 OnConnectRequired (Var handled:Boolean)
Pop控件大多数方法是在与服务器连接成功后才会有意思。如果调用方法时与服务器连接不成功时,将触发该事件。此时应重新调用connect方法,且将Handled参数设为True;
6、 OnDisconnect
当与服务器断开连接时将触发该事件,如果要访问VCL控件,最好先判断它存不存在。
7、 OnFailure
如果删除该邮件出错时,触发该事件。
8、 OnInvalidHost
与主机连接时发现指定主机名不存在,触发该事件。
9、OnList
当程序调用list过程时,每检索到一项将会触发该事件一次。MSG参数是邮
件编号,Size参数是邮件字节数。
10、OnPacketRecvd
每收到一个数据块时,将触发一次该事件。可用BytesTotal和BytesRecvd属性显示邮件接收进度。
11、OnReset
当程序调用Reset过程恢复已经有删除标记的邮件时,触发该事件。
12、OnRetrieveStar
当程序调用GetMailMessage过程或GetSummary过程开始检索数据时将会触发该事件。
13、OnRetrieveEnd
当程序调用GetMailMessage过程或GetSummary过程检索数据成功时将会触发该事件
实例1:
程序如下:
procedure TfrmMail.FormCreate(Sender:Tobject);
begin
//服务器信息
edtIP.text:=’mail.wofoo.com’
edtPort.text:=’110’;
//用户信息
edtUser.text:=’mis’;
edtpass.passwordchar:=’*’;
edtpass.text:=’123’;
//其它
edtmail.text:=’’;
edtsubject.text:=’’;
memo1.lines.clear;
//pop3控件参数设置
NMPOP31.deleteonread:=false;
NMPOP31.timeout:=5000;
NMPOP31.deleteonread:=false;
NMPOP31.Reportlevel:=Status_Basic;
//显示其它选项
memo1.scrollbars:=ssboth;
end;
首先要登陆服务器,在btnConnect的onclick事件中实现。代码如下:
procedure TfrmMail. btnConnect click(Sender:Tobject);
begin
NMPOP31.host:=edtip.text;
NMPOP31.port:=strtoint(edtport.text);
NMPOP31.userid:=edtuser.text;
NMPOP31.password:=edtpass.text;
NMPOP31.connect;
end;
登陆成功处理:
procedure TfrmMail. NMPOP31 Connect (Sender:Tobject);
begin
showmessage(‘连接成功’);
end;
登陆成功失败处理:
procedure TfrmMail. NMPOP31 Connect (Sender:Tobject);
begin
showmessage(‘连接失败’);
end;
登陆成功就可获得邮件信息了。按获得邮件按钮进行处理。
procedure TfrmMail. btnGetMailclick(Sender:Tobject);
begin
NMPOP31.list;
end;
用了list方法,当检索到信息时将触发OnList事件。这个事件的参数含有邮件大小等信息。将这些信息添加到listView控件中显示出来。
procedure TfrmMail. NMPOP31list (MSG,size:integer);
var
listitem1:tlistitem;
begin
listitem1:=listview1.items.add;
listitem1.caption:=intostr(msg);
listitem1.subitems.add(intostr(size));
end;
在实际使用过程中,有可能用户在没有登陆服务器之前就使去获取邮件信息了
这时NMPOP3将触发OnConnectionRequired事件。这时可在这里要求重新连
服务器。
procedure TfrmMail. NMPOP31ConnectionRequired (var handled:boolean);
begin
handled:=true;
NMPOP31.connect;
end;
用户可在listview控件中选择要看的邮件。
procedure TfrmMail. Listview1Click(var handled:boolean);
var index,I:integer;
begin
if listview1.selected:=nil then
exit;
//获取所选的标识
index:=strtoint(listview1.selected.capton);
//获取邮件
NMPOP31.GetMessage(index);
//获取邮件信息
edtmail.text:=nmpop31.mailmessage.from;
edtsubject.text:= nmpop31.mailmessage.subject;
memo1.lines.assign(nmpop31.mailmessage.body);
end;
其它信息显示
procedure TfrmMail. NMPOP31Success (sender:tobject);
begin
statusbar1.simpletext:=’操作成功’;
end;
procedure TfrmMail. NMPOP31Failure (sender:tobject);
begin
statusbar1.simpletext:=’操作失败’;
end;
procedure TfrmMail. NMPOP31ConnectionFailed (sender:tobject);
begin
showmessage(‘连接失败’);
end;
procedure TfrmMail. NMPOP31InvalidHoat(var handled:boolean);
begin
showmessage(‘无效的主机’);
handled:=true;
end;
最后退出邮件服务器
procedure TfrmMail. btnDisConnectonClick(sender:tobject);
begin
NMPOP31.disconnect;
end;
procedure TfrmMail. NMPOP31Disconnect (sender:tobject);
begin
statusbar1.simpletext:=’断开连接’;
end;
发送邮件NMSMTP
SMTP协议自身命令
命令 说明
HELO 客户机用HELO命令向服务器标识身份
MAIL 初始化邮件传输
RCPT 在MAIL命令后,标识单个邮件接收人
NOOP 无操作,服务器响应OK
DATA RCPT之后(通常),表示所有邮件接收人已标识,初始化数据传输
HELP 客户机可使用此命令查询服务器支持什幺命令
QUIT 会话结束
NMSMTP
属性
1、 ClearParams属性
为真时,邮件发送完毕会把PostMessage属性的值清空
2、 EncodeType
指定邮件编码方式。uuMIME—MIME 编码;unCode---UUEncoding编码
3、 FinalHeader
指定最后的消息头标。
4、Host
SMTP服务器的主机名或IP地址。
5、LocalIP
返回客户机的IP地址,若有多个只返回一个。
6、Port
指定服务器的端口
7、PostMessage
是一个类,存储要发送的邮件信息。具体如下:
l FromName:发件人名称
l FromAdress:发件人email地址。
l ReplayToAdress:回复地址
l Orgranization:发件人所在地址。
l LocalProgram:发件人所用的客户程序
l ToAdress:是Tstringlist对象,收件人的接收地址。
l ToCC: Tstringlist对象,抄送的email地址。
l ToBCC: Tstringlist对象,密送的email地址。
l Attachments: Tstringlist对象,指定的附件。
l Body: Tstringlist对象,邮件正文。
l Subject:邮件主题。
l Date:邮件发送日期,为空指当前日期。
9、 ReplayNumber
只读属性,返回smtp服务器响应应答信息。
10、status
当前状态信息。
11、Timeout
毫秒级别的单位,如果规定时间Socket没有响应,触发异常。
12、TransactionReply
返回上一次命令的执行结果。
13、UserID
指定的用户名。
控件方法
1、 Abort
中止发送,断开与smtp服务器的连接
2、 ClearParameters
清空PostMessage。
3、 Connect
登陆SMTP服务器,注意要先设好host,port属性。Host非法触发OnValidHost事件,连接失败触发OnConnectFalied事件。如果连接成功触发OnConnect事件。
4、 DisConnect
断开与服务器的连接。触发OnDisconnect事件。
5、 ExpandList(MailList:string):Boolean;
该过程在SMTP服务器上检索一个邮件列表,如果有触发OnMailListReturn事件,可以取得这个邮件列表。
6、 SendMail
发送邮件,事先要设好host,port,PostMessage
7、 Verify(UserName:string):Boolean;
检验用户名是否合法,合法为True;
事件:
1、 OnAttachmentNotFound
如果没找到postMessage所指定的邮件,该事件触发,同时有传进附件名的参数。
2、OnAuthenticationFailed
当SMTP需要用户名和口令才能发送,而事先没给用户名和密码或给出的有错,该事件触发。
3、OnConnect
与服务器连接成功后,触发该事件。
4、 OnConnectFailed
与服务器连接失败,触发该事件。
5、 OnDisconnect
断开与服务器连接触发该事件。
6、 OnEnacodeStart
当附件开始编码时,触发该事件
7、 OnEnacodeEnd
当附件编码结束时,触发该事件。参数FileName,初编码的附件。
8、 OnFailure
当邮件发送不成功时,触发该事件
9、 OnHeaderIncomplete
发送邮件时,当postmessage给出的头标信息不完整时,触发
10、OnHostResolved与OnIvalidHost
当服务器的主机名找到触发该事件,否则触发OnIvalidHost
11、OnMailListReturn
当程序调用ExpandList,每检索到一个email地址,就触发该事件一次。
12、OnRecipientNotFound
如果PostMessage所指定的收件人不成再时,触发该事件。
13、OnSendStart
邮件发送开始触发该事件。
14、OnSuccess
邮件发送成功触发该事件。
实例:
procedure TfrmSendMail.btnSendClick(Sender:Tobject);
begin
if edtAdress.text=’’ then
exit;
if edtport.text=’’ then
exit;
if edtSendusertext=’’ then
exit;
if edtReceiver.text=’’ then
exit;
NMSMTP1.host:=edtAdress.text;
NMSMTP1.port:=strtoint(edPort.text);
NMSMTP1.UserId:=edtSenduser.text;
NMSMTP1.conncet;
end;
procedure TfrmSendMail. NMSMTP1 ConnectionFailed(Sender:Tobject);
begin
showmessage(‘连接失败’);
end;
procedure TfrmSendMail. NMSMTP1 Connection (Sender:Tobject);
begin
sendmessage(Handle,WM_LOGIN,0,0);//自定义消息息传送。产生WM_LOGIN事件
end;
procedure TfrmSendMail. WMLOGIN (var MSG:TWM);//处理自定义消息
begin
//这里发送邮件。
NMSmTP1.postmessage.fromadress:=edtuserMail.text;
NMSmTP1.postmessage.fromname:=edtsenderuser.text;
NMSmTP1.postmessage.subject:=edtsubject.text;
NMSmTP1.postmessage.toadress.add(edtreceiver.text);
NMSmTP1.postmessage.attachments.addstrings(listbox1.items);
NMSmTP1.postmessage.body.assign(memo1.lines);
NMSMTP1.SENDMAIL;
NMSMTP1.DISCONNCET;
end;
|