最近测试了下delphi的Indy控件包中的TIdPOP3接收邮件功能,由于有些邮件服务器必须支持加密方式,所以,本测试直接使用的是加密方式(SSL),如果不需要加密方式,只需要更改服务端口以及断开POP3控件的IOHandler即可。
使用中应该先连接服务器,然后在进行读取或者删除处理,之后要断开服务器。
程序代码如下:
{新的POP3邮件接收函数包,使用POP3的协议 对于没有加密(SLL)的端口为:110 如果使用SSL加密协议,端口号:995 函数包提供 连接,读取,删除,断开 四个函数 在使用前一定要先连接,连接好以后才可以进行读取,删除等操作,最后需要断开 直接使用加密的协议SSL. } unit uPOP3_Email; interface uses IdPOP3,IdMessage,IdBaseComponent,SysUtils, IdAttachment, Classes, IdSSLOpenSSL, IdText,Windows,IdExplicitTLSClientServerBase;
function ConnectPOP3Server(Host,Account,PSW : string; var ErrMsg : string) : Boolean; procedure DisconnectPOP3Server; function Mail_GetCount : Integer; // function Mail_Delete(Index : integer) : Boolean; {取得邮件标题信息函数 入口参数: Index : 对应的邮件索引号,从1开始 EmailTime : 邮件发送时间 EmailSubject: 邮件标题 EmailBody : 邮件的正式内容 EmailSendAddress : 发送者地址 ErrMsg : 返回错误信息 返回参数: True : 表示返回成功,False : 表示返回失败 } function Mail_GetEmailInfo(Index : integer; var EmailTime : TDateTime; var EmailSubject, EmailBody, EmailSendAddress, EmailAttachFileName, ErrMsg : string) : Boolean; var POP3 : TIdPOP3; OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL; IdMessage : TIdMessage; ConnectOK : Boolean; implementation function ConnectPOP3Server(Host,Account,PSW : string; var ErrMsg : string) : Boolean; begin if POP3.Connected then POP3.Disconnect; POP3.Host := Host; POP3.Username := Account; POP3.Password := PSW; try POP3.Connect; if POP3.Connected then Result := True; except on E: Exception do begin Result := False; ErrMsg := E.Message; end; end; ConnectOK := Result; end; procedure DisconnectPOP3Server; begin POP3.Disconnect; ConnectOK := False; end; function Mail_GetCountA : Integer; begin Result := 0; if not ConnectOK then Exit; try Result := POP3.CheckMessages; except on E: Exception do Result := -10; end; end; function Mail_Delete(Index : integer) : Boolean; begin Result := False; if not ConnectOK then Exit; try POP3.Delete(Index); Result := True; except on E: Exception do end; end; {取得邮件标题信息函数 入口参数: Index : 对应的邮件索引号,从1开始 EmailTime : 邮件发送时间 EmailSubject: 邮件标题 EmailBody : 邮件的正式内容 EmailSendAddress : 发送者地址 EmailAttachFileName : 附件文件名称,附件直接保存在当前目录下的TMP目录中 ErrMsg : 返回错误信息 返回参数: True : 表示返回成功,False : 表示返回失败 } function Mail_GetEmailInfo(Index : integer; var EmailTime : TDateTime; var EmailSubject, EmailBody, EmailSendAddress, EmailAttachFileName, ErrMsg : string) : Boolean; var Count,i : integer; FileName : string; begin Result := False; if not ConnectOK then Exit; try IdMessage.Clear; EmailBody := ''; if POP3.Retrieve(Index,IdMessage) then begin EmailSubject := IdMessage.Subject; EmailSendAddress := IdMessage.Sender.Text; EmailTime := IdMessage.Date; EmailSendAddress := IdMessage.From.Address; Count := IdMessage.MessageParts.Count; if Count = 0 then begin EmailBody := IdMessage.Body.Text end else begin for i := 0 to Count- 1 do begin if (IdMessage.MessageParts.Items[i] is TidText) then begin EmailBody := TidText(IdMessage.MessageParts.Items[1]).Body.Text; end; if (IdMessage.MessageParts.Items[i] is TIdAttachment) then begin EmailAttachFileName := TIdAttachment(IdMessage.MessageParts.Items[i]).FileName; FileName := ExtractFilePath(ParamStr(0)); ForceDirectories(FileName + '\TMP'); FileName := FileName + '\TMP\' + EmailAttachFileName; TIdAttachment(IdMessage.MessageParts.Items[i]).SaveToFile(FileName); Continue; end; end; end; Result := True; end; except on E: Exception do end; end; initialization POP3 := TIdPOP3.Create(nil); OpenSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); OpenSSLHandler.SSLOptions.Method := sslvTLSv1; POP3.IOHandler := OpenSSLHandler; POP3.Port := 995; POP3.UseTLS := utUseImplicitTLS; POP3.ReadTimeout := 1000 * 60 * 5; POP3.ConnectTimeout := 1000 * 60 * 5; IdMessage := TIdMessage.Create(nil); ConnectOK := False; finalization IdMessage.Free; POP3.Free; OpenSSLHandler.Free; end.
由于使用Live Writer的【代码插入】插件,对于delphi代码注释的着色并不是很彻底,所以,又手工修改了下,导致颜色不一致。