在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;