?? 編寫(xiě)你的電子郵件軟件 (2000年7月25日).txt
字號(hào):
編寫(xiě)你的電子郵件軟件 (2000年7月25日)
本站更新 分類(lèi): 作者:中國(guó)程序員網(wǎng)站 推薦: 閱讀次數(shù):820
(http://www.codesky.net)
--------------------------------------------------------------------------------
如果你每天上網(wǎng),那么你肯定每天要使用電子郵件軟件,有沒(méi)有想過(guò)寫(xiě)一個(gè)屬于自己的電子郵件軟件,用
自己寫(xiě)的軟件來(lái)收信和發(fā)信,那種感覺(jué)肯定很好。
眾所周知,Delphi這個(gè)windows開(kāi)發(fā)平臺(tái)中的貴族可以開(kāi)發(fā)各個(gè)方面的應(yīng)用程序,當(dāng)然基于internet的程序
用它開(kāi)發(fā)也是得心應(yīng)手。
從Delphi3開(kāi)始,它自己的控件中就有了基于interent開(kāi)發(fā)的控件,不過(guò)這些控件不是Delphi本身的vcl控
件,而是ActiveX控件,這樣多多少少對(duì)于應(yīng)用程序的發(fā)布不是很方便。好在借助于Delphi強(qiáng)大的控件技術(shù),我
們可以從internet上找到很多免費(fèi)的vcl控件來(lái)幫助我們寫(xiě)電子郵件軟件,比較有名的是ics控件組和sakemai控
件組。Ics是一個(gè)全面的internet程序解決方案,而sakemail是專(zhuān)門(mén)用來(lái)開(kāi)發(fā)電子郵件軟件的控件。本文就是要
介紹如何使用sakemail控件來(lái)寫(xiě)支持POP3和SMTP協(xié)議的收信和發(fā)信程序。
一、下載和安裝
sakemail在很多著名的Delphi站點(diǎn)都可以下載sakemail控件,比如www.torry.ru。在Delphi中安裝sakemail
是很簡(jiǎn)單的,先將下載的zip文件釋放在你指定的目錄中,在Delphi中選擇打開(kāi)文件,設(shè)定文件類(lèi)型為dpk,然后
選擇目錄下的emaildak.dpk文件,選擇compile,然后install就行了。安裝完后,會(huì)在控件的internet頁(yè)中添加
4個(gè)相應(yīng)的控件。
二、收信程序
讓我們先來(lái)看看利用POP3協(xié)議收信的范例程序是如何來(lái)寫(xiě)的。
從這個(gè)設(shè)計(jì)時(shí)的畫(huà)面(如圖1)看到,收信主要利用sakemail的sakmsglist和sakpop控件。讓我們來(lái)看看關(guān)鍵的按鈕
“Connect and retrieve msgs”后面的代碼。
procedure TForm1.CntClick(Sender: TObject);
begin
//指定服務(wù)器
SakPOP1.Host := EditHost.text;
//指定用戶(hù)名稱(chēng)
SakPOP1.UserId := EditUserId.text;
//指定用戶(hù)密碼
SakPOP1.Passwd := EditPasswd.text;
StatusBar1.Panels[0].text := 'Wait a moment, please...';
SakPOP1.connect;//連接服務(wù)器
if SakPOP1.POPError then //連接服務(wù)器失敗
begin
MessageDlg( 'Connect failed. Maybe the server is down or not responding.',
mtError, [mbOk], 0);
exit;
end;
if not SakPOP1.login then //登陸服務(wù)器失敗
begin
ShowMessage('Unauthorized access...');
exit;
end;
//顯示共有多少電子郵件
showMessage( 'You have ' + intToStr( SakPOP1.Init) + ' new msg(s) of '
+intToStr( SakPOP1.MsgsCount));
BtnCancel.Enabled := true;
//接受電子郵件
sakPOP1.retrieveAllMessages( SakMsgList1);
BtnCancel.Enabled := false;
SakPOP1.quit; //退出POP3連接
if SakMsgList1.count > 0 then
begin
currentMsg := 0;
showCurrentMsg; //顯示當(dāng)前的電子郵件內(nèi)容
end;
StatusBar1.Panels[0].text := 'Done. ' + intToStr( SakMsgList1.count) +
' msgs retrieved.';
end;
在上面的程序中,我們已經(jīng)加入了比較詳細(xì)的注釋。利用sakemail的控件來(lái)收取信件基本上有以下
幾個(gè)步驟:
1.服務(wù)器連接的準(zhǔn)備工作。你需要制定服務(wù)器的域名、用戶(hù)名和密碼。用以下語(yǔ)句實(shí)現(xiàn):
SakPOP1.Host:=EditHost.text;
SakPOP1.UserId:=EditUserId.text;
SakPOP1.Passwd:=EditPasswd.text;
2.服務(wù)器連接。在這個(gè)階段如果一切正常,你只需要等待幾秒,但是如果服務(wù)器地址錯(cuò),
或者用戶(hù)名和密碼錯(cuò)誤,則會(huì)退出,需要重新連接。用以下語(yǔ)句實(shí)現(xiàn):SakPOP1.connect
3.獲得郵件的數(shù)量。這是通過(guò)語(yǔ)句SakPOP1.MsgsCount來(lái)獲得的。
3.從服務(wù)器將郵件傳送到本地。
顯示一封電子郵件由以下的過(guò)程完成:
//顯示當(dāng)前的郵件
procedure TForm1.showCurrentMsg;
var msg: TSakMsg;
i: integer;
begin
msg := SakMsgList1.items[ currentMsg];
labelMsgId.Caption := msg.MessageId;
labelInReplyTo.Caption := msg.InReplyTo;
labelFrom.caption := msg.From;
labelTo.caption := msg.SendTo;
labelSubject.caption := msg.Subject;
labelDate.caption := msg.Date;
labelReplyTo.Caption := msg.ReplyTo;
memo1.text := msg.Text.Text; {msg.Text is a StringList}
if msg.AttachedFiles.Count > 0 then
begin
comboBoxAttach.items.clear;
for i := 0 to msg.AttachedFiles.Count-1 do
comboBoxAttach.items.add( msg.AttachedFiles[ i].fileName);
comboBoxAttach.enabled := true;
comboBoxAttach.itemIndex := 0;
buttonSave.enabled := true;
end
else
begin
comboBoxAttach.enabled := false;
buttonSave.enabled := false;
end;
end;
從上面的過(guò)程我們可以看到顯示一個(gè)電子郵件的內(nèi)容的程序并不復(fù)雜,正文內(nèi)容直接交給memo
來(lái)顯示,如果有附件的話,讀出附件的數(shù)量,然后將其文件名寫(xiě)入combo box中。收信程序的
框架就大致如此了(如圖2)。下面我們來(lái)看看發(fā)信程序。
三、發(fā)信程序
單純的發(fā)信程序很簡(jiǎn)單,我們來(lái)看看“send”按鈕背后的代碼:
//發(fā)信
procedure TForm1.ButtonSendClick(Sender: TObject);
begin
screen.cursor := crHourGlass;
StatusBar1.Panels[0].Text := 'Wait a moment, please';
SakSMTP1.host := EditHost.text; //指定地址
SakMsg1.UserName := EditUserName.text;
//以下指定發(fā)送人有關(guān)信息
SakMsg1.From := EditFrom.text;
SakMsg1.SendTo := EditTo.text;
SakMsg1.Subject := EditSubject.text;
SakMsg1.Text.Assign( Memo1.Lines);//信件正文
SakSMTP1.connect;//連接服務(wù)器
if not SakSMTP1.SMTPError then
begin
BtnCancel.Enabled := true;
SakSMTP1.SendMessage( SakMsg1);
BtnCancel.Enabled := false;
SakSMTP1.quit;
StatusBar1.Panels[0].Text := SakSMTP1.ReplyString;
end;
screen.cursor := crDefault;
end;
發(fā)信有以下幾個(gè)步驟:
1.指定發(fā)送郵件相關(guān)的信息,比如服務(wù)器地址、發(fā)信人等。
2.服務(wù)器連接。
3.如果連接正常,發(fā)送電子郵件。
利用SakeMail我們可以看到發(fā)信的步驟是比較簡(jiǎn)單的。同時(shí)
sakemail的發(fā)信控件提供了很多的控件,比如發(fā)信前、發(fā)信
后、解碼過(guò)程中等,可以讓你很好的控制發(fā)信的整個(gè)過(guò)程。同樣收信控件也具
有相應(yīng)的這些事件。
四、電子郵件程序需要注意的其它問(wèn)題。
我們從以上的分析可以看出利用sakemail這個(gè)優(yōu)秀的電子郵件引擎,我們也可以寫(xiě)出具有自己
特色的電子郵件軟件或者讓自己的應(yīng)用程序輕易地具有電子郵件功能。不過(guò)如果你像要寫(xiě)一個(gè)真的
可以用的電子郵件軟件,至少還應(yīng)該具有以下的設(shè)計(jì)和功能:
1.對(duì)于電子郵件的儲(chǔ)存和查找功能。不能保存郵件的電子郵件軟件是沒(méi)有實(shí)際使用價(jià)值的,同樣
在這個(gè)信息爆炸的時(shí)代,你的程序必須具有良好的查詢(xún)功能,讓使用者快速地找到需要的信息。
2.多帳戶(hù)功能。越來(lái)越多的免費(fèi)電子郵件使得支持多帳戶(hù)功能成為我們選擇電子郵件軟件的一個(gè)
基本特性。多帳戶(hù)功能增加了程序設(shè)計(jì)的復(fù)雜性。
3.完備的郵件過(guò)濾功能。隨著越來(lái)越多的信息通過(guò)電子郵件的形式發(fā)送過(guò)來(lái),如果不能建立起一
套完備的過(guò)濾功能,那么有些重要的郵件一旦被疏忽,影響可能很大。所以你的電子郵件程序應(yīng)該具
有一點(diǎn)人工智能,能自動(dòng)過(guò)濾、自動(dòng)挑選甚至自動(dòng)恢復(fù)指定的電子郵件。
4.文件格式的支持。Html格式的電子郵件可以具有更好的表現(xiàn)形式,因此你應(yīng)該支持Html格式的
電子郵件。另外,因?yàn)楹芏嗟碾娮余]件附件是zip格式,如果你的電子郵件程序內(nèi)部直接支持察看zip
格式以及釋放操作,就更加錦上添花了。
以上簡(jiǎn)要概括地談了一些作者自己開(kāi)發(fā)Email程序的看法和經(jīng)驗(yàn),希望對(duì)于有興趣于開(kāi)發(fā)電子郵件
程序的朋友有所幫助。
本文來(lái)自中國(guó)程序員網(wǎng)站
--------------------------------------------------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -