delphi电子邮件收发编程讲解与实例

本文介绍了如何在Delphi中使用NMPop控件接收电子邮件,并利用NMSMTP控件发送邮件。详细解释了控件属性、方法及事件的应用,并提供了完整的示例代码。
在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
例:
ifnotnmpop31.connectthen
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方法后,该属性返回检索到的邮件信息,它是一个类
包含了以下几部份:
lAttachments:这是个tstringlist对象:包含了接收到邮件的附件名称
lBody:这是个tstringlist对象:包含了接收到邮件的正文
lFrom:发件人的e_mail地址
lHead:这是个tstringlist对象,包含了邮件头的标题
lMessageID:邮件的识别号
lSubject:邮件的主题
10、password,port,userid
向pop3服务器提交的用户密码,协议端口,用户识别名
11、RemoteIP
pop3服务器的IP地址
12、ReportLevel
指示了与pop3服务器的通话状态信息?
13、Status
返回当前状态信息
14、Summary
是一个类,包含邮件的统计信息。其中包含了以下几部份:
lBytes邮件的字节数;
lFrom发件人的邮件地址
lMessageID邮件的编号
lSubject这是邮件的主题
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(Varhandled:Boolean)
登陆服务器时,用户名与密码不能通过,将触发该事件。
更正了后,如果将Handled参数设为True,将再登陆一次。
2、OnAuthenticationNeeded(Varhandled:Boolean)
如果某个操作需要验证用户的身份,将触发这个事件。
例:
procedureTform1.NMPOP31AuthenticationNeeded(Varhandled:Boolean);
varnewpass,newid:string;
begin
newpass:=NMPOP31.password;
newid:=NMPOP31.userid;
inputquery(‘AuthenticationNeed‘,’inputuserid’,newid);
inputquery(‘AuthenticationNeed‘,’inputpassword’,newpass);
NMPOP31.userid;:=newid;
NMPOP31.password:=newpass;
Handled:=true;
end;
3、OnConnect
当与服务器连接成功时将显示触发该事件。
4、OnConnectFailed
当与服务器连接失败时将显示触发该事件
5、OnConnectRequired(Varhandled: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:
程序如下:
procedureTfrmMail.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事件中实现。代码如下:

procedureTfrmMail.btnConnectclick(Sender:Tobject);
begin
NMPOP31.host:=edtip.text;
NMPOP31.port:=strtoint(edtport.text);
NMPOP31.userid:=edtuser.text;
NMPOP31.password:=edtpass.text;
NMPOP31.connect;
end;
登陆成功处理:
procedureTfrmMail.NMPOP31Connect(Sender:Tobject);
begin
showmessage(‘连接成功’);
end;
登陆成功失败处理:
procedureTfrmMail.NMPOP31Connect(Sender:Tobject);
begin
showmessage(‘连接失败’);
end;
登陆成功就可获得邮件信息了。按获得邮件按钮进行处理。
procedureTfrmMail.btnGetMailclick(Sender:Tobject);
begin
NMPOP31.list;
end;
用了list方法,当检索到信息时将触发OnList事件。这个事件的参数含有邮件大小等信息。将这些信息添加到listView控件中显示出来。
procedureTfrmMail.NMPOP31list(MSG,size:integer);
var
listitem1:tlistitem;
begin
listitem1:=listview1.items.add;
listitem1.caption:=intostr(msg);
listitem1.subitems.add(intostr(size));
end;
在实际使用过程中,有可能用户在没有登陆服务器之前就使去获取邮件信息了
这时NMPOP3将触发OnConnectionRequired事件。这时可在这里要求重新连
服务器。
procedureTfrmMail.NMPOP31ConnectionRequired(varhandled:boolean);
begin
handled:=true;
NMPOP31.connect;
end;
用户可在listview控件中选择要看的邮件。
procedureTfrmMail.Listview1Click(varhandled:boolean);
varindex,I:integer;
begin
iflistview1.selected:=nilthen
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;
其它信息显示
procedureTfrmMail.NMPOP31Success(sender:tobject);
begin
statusbar1.simpletext:=’操作成功’;
end;
procedureTfrmMail.NMPOP31Failure(sender:tobject);
begin
statusbar1.simpletext:=’操作失败’;
end;
procedureTfrmMail.NMPOP31ConnectionFailed(sender:tobject);
begin
showmessage(‘连接失败’);
end;
procedureTfrmMail.NMPOP31InvalidHoat(varhandled:boolean);
begin
showmessage(‘无效的主机’);
handled:=true;
end;
最后退出邮件服务器
procedureTfrmMail.btnDisConnectonClick(sender:tobject);
begin
NMPOP31.disconnect;
end;
procedureTfrmMail.NMPOP31Disconnect(sender:tobject);
begin
statusbar1.simpletext:=’断开连接’;
end;


发送邮件NMSMTP


SMTP协议自身命令

命令说明
HELO客户机用HELO命令向服务器标识身份
MAIL初始化邮件传输
RCPT在MAIL命令后,标识单个邮件接收人
NOOP无操作,服务器响应OK
DATARCPT之后(通常),表示所有邮件接收人已标识,初始化数据传输
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
是一个类,存储要发送的邮件信息。具体如下:
lFromName:发件人名称
lFromAdress:发件人email地址。
lReplayToAdress:回复地址
lOrgranization:发件人所在地址。
lLocalProgram:发件人所用的客户程序
lToAdress:是Tstringlist对象,收件人的接收地址。
lToCC:Tstringlist对象,抄送的email地址。
lToBCC:Tstringlist对象,密送的email地址。
lAttachments:Tstringlist对象,指定的附件。
lBody:Tstringlist对象,邮件正文。
lSubject:邮件主题。
lDate:邮件发送日期,为空指当前日期。
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
邮件发送成功触发该事件。

实例:
procedureTfrmSendMail.btnSendClick(Sender:Tobject);
begin
ifedtAdress.text=’’then
exit;
ifedtport.text=’’then
exit;
ifedtSendusertext=’’then
exit;
ifedtReceiver.text=’’then
exit;
NMSMTP1.host:=edtAdress.text;
NMSMTP1.port:=strtoint(edPort.text);
NMSMTP1.UserId:=edtSenduser.text;
NMSMTP1.conncet;
end;
procedureTfrmSendMail.NMSMTP1ConnectionFailed(Sender:Tobject);
begin
showmessage(‘连接失败’);
end;
procedureTfrmSendMail.NMSMTP1Connection(Sender:Tobject);
begin
sendmessage(Handle,WM_LOGIN,0,0);//自定义消息息传送。产生WM_LOGIN事件
end;
procedureTfrmSendMail.WMLOGIN(varMSG: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;
Delphi2010 实现邮件附件收发功能 TIdPOP3组件简介 TIdPOP3 是用来接收邮件服务器的邮件信息到用户端的一个组件。它实现了RFC 1939协议。 在使用TIdPOP3组件时需设置它的几个成员属性。 Host :指定邮件服务器,一般为pop3邮件服务器的地址,如 pop3.126.com。 Username :用户名,也就是邮箱名,如billanking2002@126.com。 Password :邮箱密码,在进行收发邮件时组件需要凭密码进行登录。 其它成员属性 Connected:返回它邮件服务器的连接状态,这true表示已经连接。 CheckMessages:邮件数,如果连接服务器成功,则可以获得服务器端的邮件数。 成员函数 procedure Connect(const ATimeout: Integer = IdTimeoutDefault); 服务器连接函数。参数为无效连接时等待的毫秒数。 function RetrieveHeader(const MsgNum: Integer; AMsg: TIdMessage): Boolean; 接收邮件头信息,它有两个参数,MsgNum表示在接收第几个邮件,从1开始,AMsg为邮件消息组件实例。 function Retrieve(const MsgNum: Integer; AMsg: TIdMessage): Boolean; 接收邮件主体信息,它 RetrieveHeader的参数是一样的。接收的邮件内容将保存在AMsg中。 function Delete(const MsgNum: Integer): Boolean; 删除邮件服务器中第几个邮件。从1开始。 procedure Disconnect; override; 关闭连接。 TIdMessage组件简介 TIdMessage用来支持邮件消息协议,如POP3,SMTP,NNTP等。TIdMessage支持多用途Internet邮件扩展(MIME)协议。 常用的TIdMessage的属性: Subject:邮件主题,这个字符串经过BASE64编码的。所以在使用时需对它进行解码。 MessageParts:这是TIdMessageParts类的一个实例,它用来存储邮件的信息。如邮件内容及附件信息。在进行解析时需要判断它是否为附件或文本,如果为附件时,其文件名是经过BASE64编码的。判断常量分别为TIdText , TIdAttachment。 Body:这是个字符串列表,包含构成该邮件的正文内容。 Form:发送邮件者的地址信息。 Recipients:收件人地址信息。 BccList:抄送地址列表。 CharSet:指示邮件信息中使用的字符集。 ContentType:指定MIME媒体数据类型,描述正文中包含的数据,使用户代理决定如何显示数据,常用的有text/html,text/xml。 TIdSMTP组件简介 TIdSMTP是TIdMessageClient派生出的一个简单邮件传输协议和SMTP客户端。 它的主要功能是发送邮件信息。 常用的属性: Host :SMTP邮件服务器的地址,如smtp.126.com。它上面的POP3地址不一样。 AuthenticationType:服务器认证类型,它有atNone,atLogin两种,即不需要认证和需要凭用户名和密码进行认证。 Username:用户名,这里TIdPOP3 有点不一样,即它不需要后缀,如billanking2002 Password:邮箱登录密码。如果AuthenticationType设置了atLongin则必须设置密码和用户名。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值