POP3相关

  1. FOXMAIL使用了很长事件,感觉收发邮件功能很好,但是没有很好的和任务管理于客户管理结合。计划自己做一个工作日志管理系统,能管理每天的邮件以及客气等工作。所以首先要解决POP3的功能。
  2. 网上找到一个例子http://topic.csdn.net/t/20020326/08/599785.html,挺详细的。

按照这个例子写的DEMO:

一:发送:例子:

procedure TForm1.Button1Click(Sender: TObject);

begin

try

if IDPOP31.Connected then

begin

IDPOP31.Disconnect;

end;

IDPOP31.Connect;

FMsgCount := IDPOP31.CheckMessages;

if FMsgCount > 0 then

RetrievePOPHeaders(FMsgCount);

IDPOP31.Disconnect ;

except

showmessage('接收邮件失败!')

end;

end;

   

procedure TForm1.RetrievePOPHeaders(intMsgCount : integer);

Var intIndex1: integer;

intIndex2: integer;

itm: TListItem;

StrSender ,StrName,StrSubject,StrContent : string;

bl_AttachFile :boolean;

ESize : integer;

begin

for intIndex1 := 1 to intMsgCount do

begin

// ShowFileStatus('正在接收第'+intToStr(intIndex1)+'封邮件...');

Msg.Clear;

IDPOP31.Retrieve(intIndex1, Msg);

StrSender := Msg.From.Address;

StrName := Msg.From.Name;

StrSubject := Msg.Subject;

LstAttachFile.Items.Clear;

ESize := IDPOP31.RetrieveMailBoxSize ;

for intIndex2 := 0 to Pred(Msg.MessageParts.Count) do

begin

if Msg.MessageParts.Items[intIndex2] is TIdAttachment then

begin

LstAttachFile.Items.Add( TIdAttachment(Msg.MessageParts.Items[intIndex2]).Filename);

TIdAttachment(Msg.MessageParts.Items[intIndex2]).SaveToFile(

'C:\'+TIdAttachment(Msg.MessageParts.Items[intIndex2]).Filename);

bl_AttachFile := true;

end

else

begin //body text

if Msg.MessageParts.Items[intIndex2] is TIdText then

begin

// Memo1.Clear;

Memo1.Lines.AddStrings(TIdText(Msg.MessageParts.Items[intIndex2]).Body);

end

end;

end;

// With AdoQryTemp do

// begin

// Close;

// Sql.CLear;

// Sql.Add('insert into EMailTbl(ESender,ESenderName,ESubject,EContent,EAttachFile,EState,EGetTime,ESize)');

// Sql.Add('Values('''+strSender +''','''+StrName +''','''+StrSubject+''','''+Memo1.Text +''','''+lstAttachFile.Items.Text+''',0,'''+DateToStr(Msg.Date)+''','+intToStr(ESize)+')');

// ExecSql;

// Close;

// end;

// IDPOP31.Delete(intIndex1);

end;

end;

注意:需要引用:IdMessage, IdAttachment, IdText

TForm1 = class(TForm)

IdPOP31: TIdPOP3;

Button1: TButton;

Msg: TIdMessage;

LstAttachFile: TListBox;

Memo1: TMemo;

procedure Button1Click(Sender: TObject);

private

FMsgCount: Integer;

procedure RetrievePOPHeaders(intMsgCount: integer);

{ Private declarations }

public

{ Public declarations }

end;

   

二:接收例子:

Try

if not IDSMTP1.Connected then

IDSMTP1.Connect;

if IDSMTP1.Connected then

begin

with IdMsgSend do

begin

Body.Assign(Content.Lines);

// From.Name := StrSenderName;

From.Name := 'barryhong';

// From.Address := StrSender;

From.Address := 'youname@vip.sina.com';

Recipients.Add;

// Recipients[0].Address := QRecName;

Recipients[0].Address := ' youname @vip.sina.com';

// Recipients.Add;

// Recipients[0].Address := JRecName;

// Recipients.Add;

// Recipients[0].Address := QRecName;

// Recipients.Add;

// Recipients[1].Address := JRecName;

// Subject := Title.Text;

Subject := Title.Text;

// ReplyTo.EMailAddresses := strsender;

ReplyTo.EMailAddresses := ' youname @vip.sina.com';

end;

IDSMTP1.Send(IDMsgSend);

end;

Except

if IDSMTp1.Connected then

IDSMTP1.Disconnect;

ShowMessage('发送邮件出错!');

end;

   

   

TForm2 = class(TForm)

Button1: TButton;

IdSMTP1: TIdSMTP;

IdMsgSend: TIdMessage;

Content: TMemo;

Title: TEdit;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

   

三:以上发送例子没有发送附件,从http://www.host01.com/article/software/Delphi/20060917183549165.htm找了一个发附件的例子,不过有点问题,可能是DELPHI2009和例子的版本不一致,稍微改动以后的代码如下:

procedure TForm2.Button2Click(Sender: TObject);

   

begin

StatusMemo.Clear;

//设置SMTP

// IdSMTP1.Host := ledHost.Text; //具体使用的SMTP,可以到你申请的邮箱所在的网站中去找

// IdSMTP1.Port := 25;

   

//设置邮件内容

// IdMsgSend.From.Address := ledFrom.Text;

// IdMsgSend.Recipients.EMailAddresses := ledTo.Text + ',' + ledCC.Text;

IdMsgSend.From.Address := ' youname @vip.sina.com';

IdMsgSend.Recipients.EMailAddresses := ' youname @sina.com' + ',' + 'z@sina.com';

   

IdMsgSend.Subject := Content.Text;

IdMsgSend.Body.Text := Content.Text;

   

if FileExists(ledAttachment.Text) then

begin

TIdAttachmentFile.Create(IdMsgSend.MessageParts, ledAttachment.Text);

end;

   

//发送邮件

try

try

IdSMTP1.Connect;

IdSMTP1.Send(IdMsgSend);

except on E:Exception do

StatusMemo.Lines.Insert(0, 'ERROR: ' + E.Message);

end;

finally

if IdSMTP1.Connected then

IdSMTP1.Disconnect;

end;

发送OK。

原来的例子问题在如下代码:

if FileExists(ledAttachment.Text) then
  TIdAttachment.Create(MailMessage.MessageParts,
  ledAttachment.Text);

DELPHI2009带的TIdAttachment是一个抽象类,其子类才有创建的时候传入文件名的功能。

 四.普通邮件收发问题都解决了,发现像GMAIL的邮箱是需要设置SSL的,如何处理?

DELPHI提供了一个控件叫IdSSLIOHandlerSocketOpenSSL

只要将这个控件放上去,什么属性都不要设置,直接和idPOP3或idSMTP连接就可以了。连接代码如下:

IOHandler := IdSSLIOHandlerSocketOpenSSL;

Host := 'smtp.gmail.com';

Port := 465;

UserName := younang@gmail.com';

Password := 'youpassword';

UseTLS := utUseImplicitTLS;

注意上面代码中的:设置IDHANDER以及usetls

然后运行后会提示缺少DLL,研究之后发现,这个SSL用的就是开源的OPENSSL

下面是IdSSLOpenSSL单元中的说明:

Indy OpenSSL now uses the standard OpenSSL libraries

for pre-compiled win32 dlls, see:

http://www.openssl.org/related/binaries.html

recommended v0.9.8a or later

直接到上面的网站上去下两个DLL:

libeay32.dll, ssleay32.dll就OK了!

原文地址:https://www.cnblogs.com/barryhong/p/1442430.html