用Delphi实现邮件附件收发功能

北城以北 提交于 2020-03-03 08:11:50

很久没有发过博客了,不知道为什么没这个思想来博客上转转。今天把这个前段时间做的试验发上来。

   邮件与我们的工作生活息息相关,很多的信息传递都是通过邮件完成的。所以邮件对我们来说很重要,虽然可以每次登录邮箱进行操作,但邮件资料总是要通过网站登录,而且还要一个一个自己下载,这样操作在网速较慢时比较费力。现在有一些很邮件管理工具,如FOXMAIL等,这些工具功能相当完善了,但功能一多也就天花乱缀了,使用起来就不怎么爽心悦目了,么那如果我们能自己打造一个适合自己需要的邮件管理工具是一个挺不错的选择。

       经过测试,用DELPHI中的TIdPOP3  和TIdSMTP这两个组件完全能够对大部份邮件服务器进行邮件收发操作。

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则必须设置密码和用户名。

      

下面来看下程序源代码:

新建一个DELPHI工程,在窗口中加入TIdPOP3,TIdMessage,TIdSMTP三个组件

加入两个按钮,一个为收邮件,一个为发邮件。加入三个编辑框,一个为服务器地址,一个为用户名,一个为密码。和一个Memo,WebBrowser控件。

下面为其工程的源文件代码。

判断输入的字符串是不是为一个邮件地址。

function TForm1.IsEMail(EMail: String): Boolean;

var 

    s: String;

    ETpos: Integer;

begin 

    ETpos:= pos('@',EMail);    //主要判断有没有@符

    if ETpos> 1 then

    begin

        s:= copy(EMail,ETpos+1,Length(EMail));

        if (pos('.',s) > 1) and (pos('.',s) < length(s)) then Result:= true

        else Result:= false;

    end

    else Result:= false;

end;

 

BASE64编码转换,这个很重要,因为邮件的标题,及附近的文件名都是经过了编码转换的。

 

function TForm1.Base64Decode(strInput:string):string;

var

    strDecode : string;

    posStart : Integer;

    posEnd : Integer;

begin

    while pos('=?gb2312?b?',lowercase(strInput))>0 do

    begin

        try

            posStart:=pos('=?gb2312?b?',lowercase(strInput));

            posEnd:=pos('?=',lowercase(strInput));        

            strDecode:=strDecode+copy(strInput,1,posStart-1)+IdDecoderMIME1.DecodeString (copy(strInput,posStart+11,posEnd-posStart-11));

            strInput:=copy(strInput,posEnd+2,length(strInput)-posEnd-1);

        finally

            Application.ProcessMessages;

        end;

    end;

    strDecode := strDecode + strInput;

    result := strDecode;

end;

 

收邮件功能函数:

procedure TForm1.BitBtn1Click(Sender: TObject);

var

   i,j,mnnn,mailcount:integer;

   tmp:string;

 begin

      IdPOP31.Host := e_address.text;

    dPOP31.Username := e_username.text

    dPOP31.Password := e_password.text;

    while true do

    begin

        IdPOP31.Connect();                          //连接到POP3服务器

        if (IdPOP31.Connected = true) then

        begin

            break;

        end

        else begin

            IdPOP31.Password :='gozhyflkmcfs';

        end;

    end;

    mailcount := IdPOP31.CheckMessages;         //得到邮箱中邮件的个数

mnnn := 0;

for i:=1 to mailcount do                        /遍历每一封邮件

    begin

        IdMessage1.Clear;

        IdPOP31.retrieveHeader(i,IdMessage1);  //得到邮件的头信息

        tmp := IdMessage1.Subject;             //得到邮件的标题

        Memo1.Lines.Add('-----------------------------------------------------');

        tmp := Base64Decode(tmp);                //邮件标题BASE64解码

        memo1.Lines.Add(tmp);

        IdPOP31.Retrieve(i,IdMessage1);        //接收到邮件所有内容

        for j:=0 to idmessage1.MessageParts.Count-1 do

        begin

            try

if (IdMessage1.MessageParts.Items[j] is TIdAttachment) then

//匹配邮件条目是否是附件

                Begin tmp:=Base64Decode(TIdAttachment(IdMessage1.MessageParts.tems[j]).FileName);

                    tmp := 'C:\'+tmp;

                    deletefile(tmp);  TIdAttachment(IdMessage1.MessageParts.Items[j]).SaveToFile(tmp);    //以原有文件名保存附件在指定目录

                end

                else begin

                    if (idmessage1.MessageParts.Items[j] is TidText) then

                    begin

                          if  Message1.Body.Text<>'' then

                                  sethtml(WebBrowser1,tidtext(idmessage1.MessageParts.Items[j]).Body.text)

                            else memo1.Lines.Add(tidtext(idmessage1.MessageParts.Items[j]).Body.text);

                      end;

                 end;

            except

                continue;

            end;

        end;

        if checkbox1.Checked = true then

        begin

            try

                idpop31.Delete(i);       //删除收到的邮件

            except

                continue;

            end;

        end;

    end;

    idpop31.DisconnectSocket;

    IdPOP31.Disconnect;

end;

 

发送邮件功能函数:

 

procedure TForm1.BitBtn2Click(Sender: TObject);

var

    filename:string;

begin

    IdSMTP1.Host := e_address.text;

    idsmtp1.AuthenticationType := atLogin;         //{atNone,atLogin}

    IdSMTP1.Username := e_username.text;

IdSMTP1.Password := e_password.text;

filename := 'd:\comunition.rar1';

    TIdattachment.Create(IdMessage1.MessageParts,filename);    //加入附件

    filename := 'd:\comunition.rar';

    TIdattachment.Create(IdMessage1.MessageParts,filename);    //加入多个附件

    IdMessage1.From.Address := 'billanking2002@126.com';         //邮件来自哪里

    IdMessage1.Recipients.EMailAddresses:='billanking2002@hotmail.com; //收件人

idMessage1.BccList.Add.Text := 'billanking2002@hotmail.com';  //抄送地址列表

idMessage1.BccList.Add.Text := 'billanking2002@yahoo.com.cn';

    idMessage1.BccList.Add.Text := 'hyh@ctrl-tech.com';

 

    IdMessage1.Subject:= '邮件客户端';

    IdMessage1.Body.Text := Memo1.Text;   //此处为邮件正文

    IdMessage1.CharSet := 'gb2312';        //保证附件正文汉字的正常显示

    idmessage1.ContentType := 'text/html';   //超文本方式传输

    IdMessage1.Body.Assign(Memo1.Lines);

    if IdSMTP1.AuthSchemesSupported.IndexOf('LOGIN')>-1 then

    begin

        IdSMTP1.AuthenticationType := atLogin; 

//连接前要保存为Login  上面己设,此处不必要

        IdSMTP1.Authenticate;

    end;

    try

        IdSMTP1.Connect();           //连接SMTP服务器

        IdSMTP1.Authenticate;

        IdSMTP1.Send(IdMessage1);   //向服务器发送邮箱

    finally

        if IdSMTP1.Connected then IdSMTP1.Disconnect;    //断开与服务器的连接

    end;

end;

 

至此,邮件收发功能基本完成。要做一个功能完整的邮件收发管理工具,还需要加入邮件管理功能。这些功能主要是通过在本地操作文件实现。这样可以以自己的方式保管理这些邮件。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/billanking/archive/2010/12/18/6083616.aspx

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!