天天看點

delphi電子郵件收發程式設計講解與執行個體

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