- FOXMAIL使用了很长事件,感觉收发邮件功能很好,但是没有很好的和任务管理于客户管理结合。计划自己做一个工作日志管理系统,能管理每天的邮件以及客气等工作。所以首先要解决POP3的功能。
- 网上找到一个例子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了!