Delphi 使用Indy的TidPOP3接收邮件

最近测试了下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的【代码插入】插件image_thumb2,对于delphi代码注释的着色并不是很彻底,所以,又手工修改了下,导致颜色不一致。

转载于:https://www.cnblogs.com/sensor/p/Indy-POP3.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值