zoukankan      html  css  js  c++  java
  • 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了!

  • 相关阅读:
    简而言之C语言:“char类型省空间”只是一个传说
    原来曾经有人支持过我,感动!
    编程的“武林秘籍”
    没有一种语言解决所有问题
    简而言之C语言:const声明
    关于代码的些许感想
    树莓派上搭建arduino命令行开发环境
    IOT设备的7大安全问题
    OsmocomBB软件实现栈概况
    Win7以上 32/64位系统隐藏托盘图标
  • 原文地址:https://www.cnblogs.com/barryhong/p/1442430.html
Copyright © 2011-2022 走看看