从Delphi3开始,它自己的控件中就有了基于interent开发的控件,不过这些控件不是Delphi本身的vcl控件,而是ActiveX控件,这样多多少少对于应用程序的发布不是很方便。好在借助于Delphi强大的控件技术,我们可以从internet上找到很多免费的vcl控件来帮助我们写电子邮件软件,比较有名的是ics控件组和sakemai控件组。Ics是一个全面的internet程序解决方案,而sakemail是专门用来开发电子邮件软件的控件。本文就是要介绍如何使用sakemail控件来写支持POP3和SMTP协议的收信和发信程序。一、下载和安装
  sakemail在很多著名的Delphi站点都可以下载sakemail控件,比如www.torry.ru。在Delphi中安装sakemail是很简单的,先将下载的zip文件释放在你指定的目录中,在Delphi中选择打开文件,设定文件类型为dpk,然后选择目录下的emaildak.dpk文件,选择compile,然后install就行了。安装完后,会在控件的internet页中添加4个相应的控件。二、收信程序
让我们先来看看利用POP3协议收信的范例程序是如何来写的。
从这个设计时的画面(如图1)看到,收信主要利用sakemail的sakmsglist和sakpop控件。让我们来看看关键的按钮“Connect and retrieve msgs”后面的代码。
procedure TForm1.CntClick(Sender: TObject);
begin
//指定服务器
SakPOP1.Host := EditHost.text;
//指定用户名称
SakPOP1.UserId := EditUserId.text;
//指定用户密码
SakPOP1.Passwd := EditPasswd.text;StatusBar1.Panels[0].text := 'Wait a moment, please...';
SakPOP1.connect;//连接服务器
if SakPOP1.POPError then //连接服务器失败
begin
MessageDlg( 'Connect failed. Maybe the server is down or not responding.',
mtError, [mbOk], 0);
exit;
end;
if not SakPOP1.login then //登陆服务器失败
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; //显示当前的电子邮件内容
end;
StatusBar1.Panels[0].text := 'Done. ' + intToStr( SakMsgList1.count) + ' msgs retrieved.';
end;
在上面的程序中,我们已经加入了比较详细的注释。利用sakemail的控件来收取信件基本上有以下几个步骤:
1.服务器连接的准备工作。你需要制定服务器的域名、用户名和密码。用以下语句实现:
SakPOP1.Host:=EditHost.text;
SakPOP1.UserId:=EditUserId.text;
SakPOP1.Passwd:=EditPasswd.text;
2.服务器连接。在这个阶段如果一切正常,你只需要等待几秒,但是如果服务器地址错,或者用户名和密码错误,则会退出,需要重新连接。用以下语句实现:SakPOP1.connect3.获得邮件的数量。这是通过语句SakPOP1.MsgsCount来获得的。
3.从服务器将邮件传送到本地。
显示一封电子邮件由以下的过程完成:
//显示当前的邮件
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;
从上面的过程我们可以看到显示一个电子邮件的内容的程序并不复杂,正文内容直接交给memo来显示,如果有附件的话,读出附件的数量,然后将其文件名写入combo box中。收信程序的框架就大致如此了(如图2)。下面我们来看看发信程序。三、发信程序
单纯的发信程序很简单,我们来看看“send”按钮背后的代码:
//发信
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;
//以下指定发送人有关信息
SakMsg1.From := EditFrom.text;
SakMsg1.SendTo := EditTo.text;
SakMsg1.Subject := EditSubject.text;
SakMsg1.Text.Assign( Memo1.Lines);//信件正文
SakSMTP1.connect;//连接服务器
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;
发信有以下几个步骤:
1.指定发送邮件相关的信息,比如服务器地址、发信人等。
2.服务器连接。
3.如果连接正常,发送电子邮件。
利用SakeMail我们可以看到发信的步骤是比较简单的。同时sakemail的发信控件提供了很多的控件,比如发信前、发信后、解码过程中等,可以让你很好的控制发信的整个过程。同样收信控件也具有相应的这些事件。四、电子邮件程序需要注意的其它问题。
  我们从以上的分析可以看出利用sakemail这个优秀的电子邮件引擎,我们也可以写出具有自己特色的电子邮件软件或者让自己的应用程序轻易地具有电子邮件功能。不过如果你像要写一个真的可以用的电子邮件软件,至少还应该具有以下的设计和功能:
  1.对于电子邮件的储存和查找功能。不能保存邮件的电子邮件软件是没有实际使用价值的,同样在这个信息爆炸的时代,你的程序必须具有良好的查询功能,让使用者快速地找到需要的信息。
  2.多帐户功能。越来越多的免费电子邮件使得支持多帐户功能成为我们选择电子邮件软件的一个基本特性。多帐户功能增加了程序设计的复杂性。
  3.完备的邮件过滤功能。随着越来越多的信息通过电子邮件的形式发送过来,如果不能建立起一套完备的过滤功能,那么有些重要的邮件一旦被疏忽,影响可能很大。所以你的电子邮件程序应该具有一点人工智能,能自动过滤、自动挑选甚至自动恢复指定的电子邮件。
  4.文件格式的支持。Html格式的电子邮件可以具有更好的表现形式,因此你应该支持Html格式的电子邮件。另外,因为很多的电子邮件附件是zip格式,如果你的电子邮件程序内部直接支持察看zip格式以及释放操作,就更加锦上添花了。