最近用Indy的TIdPOP3和TIdMessage做一个邮件接收工具的时候,遇到接收邮件附件的问题:我用IdPop31.Retrieve接收完邮件后,对比WEB邮箱中的邮件信息,几个邮件明明是有附件的,但是我使用TIdMessage.AttachmentCount得到的值始终为0,这是为什么?还有就是接受附件,应该如何保存下来

解决方案 »

  1.   


    var
      filename:string;
    begin
      if idsmtp1.Connected then
        idsmtp1.Disconnect
      else
      begin
        idsmtp1.Host := 'smtp.usish.com';
        idsmtp1.Username := 'huang_xiao';
        idsmtp1.Password:='huang';
        idsmtp1.authenticationtype:=atlogin;
        idsmtp1.Port:=25;
        idsmtp1.Connect;
      end;
      idmessage1.From.Address:='[email protected]';
      idmessage1.Recipients.EMailAddresses:='[email protected]';
      idmessage1.From.Name:='THOMAS';
      idmessage1.Subject:='test';
      idmessage1.Body.Text:='hengheng';
      filename := 'c:\x.ods';
      TIdAttachment.Create(IdMessage1.MessageParts,filename);
      idsmtp1.Send(idmessage1);
    end;
    1、创建工程,在窗体中加入IdSMTP1、IdMessage1和IdPOP31(Indy控件标签组)控件各一个。        2、设置     IdSMTP1.Host := 'SMTP.163.com';(我用的是163检试,具体也可选择其它服务器)     IdSMTP1.Username := 'caoyan528';(此处即表示邮箱的帐号名,例如邮箱为:[email protected],则Username即为aaaaaa)     IdSMTP1.Password := 'XXXXXXXX';(此处即为邮箱的密码,如[email protected]邮箱密码为123456,则Password即为123456)。       3、设置IdMessage1.From.Address := '[email protected]';(注意,此处的邮箱地址应在smtp.163.com中存在且就为以上设置的Username),IdMessage1.Recipients.EMailAddresses := ‘[email protected]’(此处表示收件人地址,只要是任何一个存在的邮箱地址即可)   IdMessage1.Subject:= '第一个邮件客户端';(主题)具体源代码如下:procedure TForm1.Button4Click(Sender: TObject);
    var
       filename : String;   tmpEMailItem : TIdEMailAddressItem;
       // tmpEmailAdd :   TIdEmailAddressList;
    begin
       try
         IdSMTP1.Host := 'SMTP.163.com';     IdSMTP1.AuthenticationType := atLogin; //保证登录模式为Login
         IdSMTP1.Username := 'caoyan_528';
         IdSMTP1.Password := 'XXXXXX';
         filename := 'E:\邮件发送程序\2003-12-22_253_04.jpg';    //需要添加的附件文件
         TIdAttachment.Create(IdMessage1.MessageParts,filename);   //添加附件    IdMessage1.From.Address := '[email protected]';
         IdMessage1.Recipients.EMailAddresses:='[email protected]';     tmpEMailItem := IdMessage1.Recipients.Add;   //添加一个地址列表     tmpEMailItem.Text := '[email protected]'; //写一个收件人     idMessage1.BccList.Add.Text := '[email protected]';   //书写多个目标地址,实现群发     idMessage1.BccList.Add.Text := '[email protected]';   //书写多个目标地址,实现群发
         IdMessage1.Subject:= '第一个邮件客户端';
         IdMessage1.Body.Text := Memo1.Text;    //此处为邮件正文     IdMessage1.CharSet := 'gb2312';   //保证附件正文汉字的正常显示
         IdMessage1.Body.Assign(Memo1.Lines);    
         if IdSMTP1.AuthSchemesSupported.IndexOf('LOGIN')>-1 then
         begin
           IdSMTP1.AuthenticationType := atLogin; //连接前要保存为Login   上面己设,此处不必要
           IdSMTP1.Authenticate;
         end;     IdSMTP1.Connect();   //连接SMTP服务器
         IdSMTP1.Authenticate;
         IdSMTP1.Send(IdMessage1);   //向服务器发送邮箱
       finally
         IdSMTP1.Disconnect;   //断开与服务器的连接
       end;
    end;自此,memo1中所写的内容被当作邮件发送了出去。而filename所指的附件也一同被发送到了服务器。
    4、接收邮件收以上的流程图不难看出,接收邮件完全是POP3服务器来完成的,客户只需连接到POP3服务器即可下载邮件。具体做法如下:设置IdPOP31.Host := POP.163.com       IdPOP31.Username := 'caoyan_528';        IdPOP31.Password:= 'XXXXX';       (此处的设置与SMTP的设置相同)     源代码如下:procedure TForm1.Button5Click(Sender: TObject);
    var
       mailcount : integer;
       i : integer;
       tmp : string;
    begin
       IdPOP31.Connect();     //连接到POP3服务器
       mailcount := IdPOP31.CheckMessages;   //得到邮箱邮件的各数
       for i:=1 to mailcount do    //遍历每一封邮件
       begin
          IdMessage1.Clear;
          IdPOP31.retrieveHeader(i,IdMessage1);   //得到邮件的头信息
          tmp := IdMessage1.Subject;       //得到邮件的标题
          Memo1.Lines.Add(tmp);
          IdPOP31.Retrieve(i,IdMessage1);   //接收到邮件所有内容
          tmp := IdMessage1.Body.Text;    //邮件正文 
          memo1.Lines.Add(tmp);
       end;
       IdPOP31.Disconnect;    //断开连接
    end;
      

  2.   

    用这个 TIdAttachment.Create(IdMessage1.MessageParts,filename);
    这玩意有保存
    TIdAttachment(Message2000.MessageParts.Items[i]).SaveToFile()来收附件的
      

  3.   

    这还不好办?
     
      if   (IdMessage1.MessageParts.Items[i]   is   TIdAttachment)   then 
       begin   
        TIdAttachment(Message2000.MessageParts.Items[i]).SaveToFile()//是附件,存起来 
         inc(Attachmentcount);                                    //是附件统统给哥加起来。
       end 弱弱的问一句,上面给的方法成不成?
    就是那个用这个 TIdAttachment.Create(IdMessage1.MessageParts,filename);
    这玩意有保存
    TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile()来收附件的我希望你给我全分。我不容易啊。给你倒腾的,累啊。呵呵。
      

  4.   

    一半的分?唉。难道我那个方法不能求出总数?我惊讶。var  
      Attachmentcount:integer;                //保存附件个数
      
    if   (IdMessage1.MessageParts.Items[i]   is   TIdAttachment)   then 
       begin    
         inc(Attachmentcount);                //如果是附件那么Attachmentcount+1
       end 最后得到的Attachmentcount则是总数。
    然后你拿这个Attachmentcount随便做你要做的什么,你要做循环就去做啊
    for  i:=1 to Attachmentcount do
    begin
    //做你要做的。
    end;你可以得到这个数目之后再保存啊。没必要和我写的那个一样啊。变通,我们需要的是变通。if   (IdMessage1.MessageParts.Items[i]   is   TIdAttachment)   then 
       begin   
        TIdAttachment(Message2000.MessageParts.Items[i]).SaveToFile()//是附件,存起来 
       end 你觉得呢?