选取某一文件夹的所有文件做为邮件的附件如何实现?那个状态就像用鼠标选取文件右键选发送到FOXMAIL后跳出的窗体。大侠们帮忙啊!来的发洋财了!

解决方案 »

  1.   

    to ahpei(菩萨) :是代码还是控件?如何实现呢?
      

  2.   

    to aiunong(凡) :一般发邮件可以实现,就想如何用程序完成以上的操作!
     
    大侠们帮忙啊!
      

  3.   

    pop3中MailMessage特性中Attachments包含了接受到的附件名称,这是一个TStringList对象。
    例如:
    if pop3.mailmessage.attachments.text<>'' then
    showmessage('附件:'+#10#13+pop3.mailmessage.attachments.text);
    ======================
    pop3.MailMessage.Attachments.Count
    pop3.MailMessage.Attachments.Strings[i] 
     
      

  4.   

    to cg1120(代码最优化-§新年祝福你,好运伴着你§) :非常感谢回复!
    这个代码不太明白,能产生我要的效果吗?让我试试!稍等我先触发一下!
      

  5.   

    用的时候先
    attachments.clear;
    不要重复发送。
    而且opendialog可以选择多个文件的。
      

  6.   

    to  beata88(!!@恭喜发财!钱包拿来!!@) 
    不知仁兄有没有看过photoshop6,选打开文件时,显示的若干图形文件,可单选,也可多选,像按了ctrl或shift.我想最好有那样的效果。或着把某个指定文件夹中的所有文件都选上,有没有办法解决呢?
      

  7.   

    to cg1120(代码最优化-§新年祝福你,好运伴着你§) 
    :好象提示没有定义pop3,如何定义啊?
      

  8.   

    非常感谢大家的回复!
    to  to cg1120(代码最优化-§新年祝福你,好运伴着你§) 、
    ahpei(菩萨) :帮忙啊!再给点提示吧!
      

  9.   

    to ahpei(菩萨) :谢谢!我马上下载一个INDY组件去!
      

  10.   

    delphi自带就有indy组件啊,老兄!!
      

  11.   

    to ahpei(菩萨) : 仁兄多亏我回头看了一眼,我还搜的起劲呢!谢谢啦!我再找找!
      

  12.   

    再给你贴一些关于indy组件与DHtml组件:
    这是我以前的项目查询来的,还有很多。你搜索一下。Internet构件Indy与blocking套接字调用模式 
    作者:  评价:  上站日期: 2002-05-07  
    内容说明:  
    来源:  ---------------------------------------------------------------Indy采用blocking模式
    Indy采用blocking套接字调用模式。blocking调用类似于读写文件。在进行读写
    时,调用的方法在操作完成后才会返回。不同之处在于,网络通讯中的blocking
    套接字方法调用可能会花更长的时间,因为远端数据并非时时准备好等待存取(
    最快不会超过网络或modem处理数据的速度)。
    例如,如果要连接远端,简单地调用connect方法,然后等待返回。如果不连接失
    败,则引发一个异常。Blocking无罪
    人们一直不分青红皂白地攻击blocking套接字。与流行的说法相反,blocking套
    接字并非一种罪恶。当Winsock被(从Unix)“移植”到Windows平台,很快有问题发生。在Unix上,
    问题很容易解决(类似多线程,不过在Unix上使用独立process代替线程)。Unix
    客户端与服务器能够处理process,这些process使用blocking套接字。
    Windows3.x不能处理、更不支持多线程。使用blocking接口将会“锁死”用户界
    面,使程序不响应。于是,异步扩展特性被增加到WinSock,让Windows3.x可以使
    用WinSock,而不会锁死。不过这需要不同的编程方法。因为Windows3.x存在的缺
    点而导致blocking套接字不能很好地运作,所以Microsoft和其它一些厂商不遗余
    力地攻击blocking套接字。Win32支持多线程。但在此时,大家的想法已经改变了(比如,开发者坚信
    blocking是不好的),而且这种情况无法逆转。所以,对blocking套接字的责难
    一直继续。实际上,blocking套接字是Unix实现套接字的唯一方法。blocking套接字也拥有
    其它的优点,而且更有利于实现线程化、安全性更高。目前在Unix上也增加了一
    些non-blocking套接字特性。但是,它们以与在Windows中截然不同的方式工作。
    没有使用标准,且应用范围不广泛。在Unix上,blocking套接字仍旧在几乎每个
    socket应用中存在,且将继续如此。blocking的好处
    1、易于编程--blocking非常易于编程。所有代码能以有序的形式存在于同一位
    置。
    2、易于移植--由于Unix采用blocking套接字,用blocking套接字的程序更易于
    移植到Unix平台。Indy利用该特点,实现了多平台单代码的解决方案。
    3、在线程中工作顺利--blocking套接字是串行的,很容易在线程中使用。blocking的缺点
    1、客户端用户界面“死锁”--blocking套接字调用在完成工作之后才返
    回。如果在程序主线程中进行此类调用,应用程序将不能正常处理用户界面
    消息。这就使用户界面“死锁”,因为在blocking套接字调用把控制权返回
    给应用程序消息循环之前,update、repaint和其它消息不能被正常处理。
    TIdAntiFreeze
    Indy使用一个特殊的组件来解决用户界面死锁问题。把TIdAntiFreeze加入程
    序,就可以随意在程序中进行标准的blocking Indy调用,而用户界面也不会死锁。
    TIdAntiFreeze工作原理:在内部定时停止堆栈调用、然后调用Application.ProcessMessages。
    在外部,对Indy的调用继续阻塞,和没使用TIdAntiFreeze一样正常。线程化
    在blocking套接字中几乎总是使用线程。Non-blocking套接字也可以被线程
    化,不过需要额外的处理。而且,相对于blocking套接字而言毫无优势。在
    编写blocking套接字服务器时,线程化非常重要。在编写高级的blocking客
    户端时也是如此。线程化的优点
    1、优先级--可以调整独立线程优先权。可以为每个服务器任务或是连接配
    给适当的CPU时间。
    2、封闭性--可保持所有连接,连接之间不会互相干扰。
    3、安全性--每个线程可拥有不同的安全属性。
    4、多处理器--线程化能自动利用多处理器优势。
    5、非串行化--线程化提供真正的并行可能性。假若不线程化,则所有请求
    都需要一个单独线程来处理。于是需要把任务切割为多个小块以提高运行速
    度。如果某个任务锁住或者执行较慢,其它线程必须等待它结束。任务块结束
    后,后一个任务块才能被处理,如此类推。而在线程化的条件下,每个任务均
    可作为整个任务来执行,操作系统自动分配CPU时间。
     
    线程Pooling
    线程的创建与破坏极耗资源。对于短时连接的服务更是如此。此类服务创建线
    程、在很短时间内使用、然后摧毁它。这样,线程会频繁地创建和毁坏。拿
    time server或web server来做例子,客户端发送简单的请求,服务器返回简单
    回复。使用浏览器浏览一个网页时,有可能需要与服务器进行上百次的连接和
    断开操作。线程pooling可以减轻痛苦。它并不在需要时创建和毁坏线程,而是
    从已经创建但未使用的列表(pool)中“借出”线程。当线程不再需要,将被抛
    回缓冲池,而不会摧毁。缓冲池中的线程被标记为未活动,所以并不消耗CPU循环。
    缓冲池的大小可以调整,以适合系统需求。
    Indy支持线程pooling。可以用TIdThreadMgrPool组件利用线程pooling。数以百计的线程
    对于一个忙碌的服务器,可能需要数以百计、千计的线程。人们普遍误解如此
    多的线程将立刻使系统当掉。其实不然。
    对于多数服务器而言,线程存在期的多数时间用于等待数据。在等待blocking
    调用时,线程是不活动的。所以,在一个拥有500个线程的服务器中,可能只有
    50个同时活动的线程。在我的系统上,330个线程只耗费1%的CPU时间。线程与全局Section
    当线程需要存取数据时,都必须获取对数据的控制权以保护数据完整性。对于
    初学线程编程的人士,这恐怕有些头疼。不过多数服务器并不需要全局数据。
    每个线程执行隔离的任务。Indy之道
    Indy与你所熟悉的其它Winsock组件不同。如果你曾经使用过其它组件,最好
    是彻底忘记它们是如何工作的。几乎所有其它组件都是non-blocking,以异
    步方式调用。你需要对事件进行回应,设置状态机,且常常要进行等待循环。
    例如,使用其它组件,当进行连接时,必须等待connect事件发生,或者循环
    至被告知已连接。而在Indy中,你简单调用connect,然后等待它返回。如果
    连接失败,则引发一个异常。使用Indy非常相似于操作文件。代码可以放置于
    一个地方,而无需切割到各种事件代码中。Indy有何不同
    简述
    1、使用blocking调用
    2、不依赖事件--Indy拥有事件(处于提供信息的考虑),但并非必须。
    3、被设计为支持线程--无需进行额外的线程化工作。细节
    Indy不光是使用blocking调用,而且也表现为blocking方式。典型的Indy调用:
    with IndyClient do begin
      Connect; Try
    // 你的代码
      finally Disconnect; end;
    end;
    其它组件大概会这样调用:
    procedure TFormMain.TestOnClick(Sender: TComponent);
    begin
      with SocketComponent do begin
        Connect; try
          while not Connected do begin
          if IsError then begin
            Abort;
          end;
          Application.ProcessMessages;
     
          OutData := 'Data To send';
          while length(OutData) >  0 do begin
            Application.ProcessMessages;
          end;
        finally Disconnect; end;
      end;
    end;
     
    procedure TFormMain.OnConnectError;
    begin
      IsError := True;
    end;
     
    procedure TFormMain.OnRead;
    var
      i: Integer;
    begin
      i := SocketComponent.Send(OutData);
      OutData := Copy(OutData, i + 1, MaxInt);
    end;Indy天生支持线程。在Windows中用Indy编写服务器或客户端与在Unix平台
    上编写服务器或客户端相似,甚至更加简单。
    典型的Unix服务器有一个或多个“监听”进程,查找客户端请求。对于每个
    客户端,都要创建一个新进程。
    Indy以简单的方式工作。Windows能较好地处理线程。Indy服务器为每个客户
    端锁定一个线程。
    Indy服务器建立一个与主线程分离的监听线程。监听线程等待客户端请求。
    对于每个连接的客户端,产生一个新线程为其服务。然后,在线程上下文中
    引发适当的事件。 
     ----------------------------------
    使用INDY发信给多个人:
    mailto:[email protected][email protected]&[email protected]
    -----------------------------
    我用INDY中的idSMTP只要在
    idMessage1.Recipients.EMailAddresses:=Edit1.Text;
    再在Edit1.Text:='[email protected],[email protected]', 将收件人用','隔开即可
      

  13.   

    -----------------------------
    unit smtpprg;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, IdMessageClient, IdSMTP, IdMessage,IdStackConsts;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Edit4: TEdit;
        Panel1: TPanel;
        Edit5: TEdit;
        Edit6: TEdit;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Label7: TLabel;
        Memo1: TMemo;
        Button1: TButton;
        IdSMTP1: TIdSMTP;
        CheckBox1: TCheckBox;
        Memo2: TMemo;
        Button2: TButton;
        IdMessage1: TIdMessage;
        procedure Button1Click(Sender: TObject);
        procedure IdSMTP1Connected(Sender: TObject);
        procedure IdSMTP1Status(axSender: TObject; const axStatus: TIdStatus;
          const asStatusText: String);
        procedure IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
          const AWorkCount: Integer);
        procedure IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
          const AWorkCountMax: Integer);
        procedure IdSMTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      if checkbox1.Checked then IdSMTP1.AuthenticationType := atLogin
            else IdSMTP1.AuthenticationType := atNone;
      IdSMTP1.Host:=edit1.Text;
      IdSMTP1.Port:=25;
      IdSMTP1.UserId:=edit2.Text;
      IdSMTP1.Password:=edit3.Text;    IdSMTP1.Connect;
       with IdMessage1  do
        begin
         body.Clear;
         Body.Add(memo1.Lines.Text);//内容
         From.Text := edit6.Text;
         Recipients.EMailAddresses :=edit4.Text;//收件人
         Subject:=edit5.Text;//主题   end;
       IdSMTP1.Send(IdMessage1);
       IdSmtp1.Disconnect;end;procedure TForm1.IdSMTP1Connected(Sender: TObject);
    begin
      memo2.Lines.Add('已经连接到服务器');
      //IdMessage1.Body:=memo2.Lines;
    end;procedure TForm1.IdSMTP1Status(axSender: TObject;
      const axStatus: TIdStatus; const asStatusText: String);
    begin
      memo2.Lines.Add(asStatusText);
    end;procedure TForm1.IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      memo2.Lines.Add(inttostr(AWorkCount));
    end;procedure TForm1.IdSMTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      memo2.Lines.Add(inttostr(AWorkCountMax));
    end;procedure TForm1.IdSMTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      Memo2.Lines.Add('end');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      IdSMTP1.Disconnect;
    end;procedure TForm1.FormCreate(Sender: TObject);
    beginend;end. 
    来自:yanghaijun 时间:2002-1-30 23:35:00 ID:896752 这是我用的代码,邮件可以发送出去,但是接收时却无法收到具体的内容,其它
    的,但我用FoxMail却能收到,我该如何收呢?但FoxMail收的时候却只把它当成
    纯文本而不是HTML文档,怎么办?
      With IDSMTP1 do
      begin
        Host:='127.0.0.1';
        Port:=25;
        Connect;
        IDMessage1.From.Address:='[email protected]';
        IDMessage1.From.Name:='yanghaijun';
        IDMessage1.Recipients.EMailAddresses:='[email protected]';
        IDMessage1.Subject:='test';    tls:=TStringList.Create;
        tls.Add('<HTML><Head><Title>test</Title>');
        tls.Add('</Head><Body BGColor="#00CCFF">');
        tls.Add('Hello!</BODY></HTML>');
        IDMessage1.Body.Clear;
        IDMessage1.Body.Add(tls.text);
        Send(IDMessage1);
        tls.Free;
        Disconnect;
      end;
    ------------------------------------------------
      

  14.   

    unit Email;interfaceuses
      Windows, Messages, SysUtils, Classes, Controls, Forms,
      Dialogs, IdMessage, IdTCPConnection, IdTCPClient, IdMessageClient,
      IdSMTP, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent,
      IdUDPBase, IdUDPClient, IdDNSResolver, StdCtrls;type
      TEmailForm = class(TForm)
        MSGLabel: TLabel;
        MessageLabel: TLabel;
        Button1: TButton;
        IdDNSResolver: TIdDNSResolver;
        IdAntiFreeze1: TIdAntiFreeze;
        IdSMTP: TIdSMTP;
        IdMsgSend: TIdMessage;
        procedure Button1Click(Sender: TObject);
        function SendMail() : Boolean;
      private
        procedure GetMxList(AMxList: TStringList; AQName: string);
        { Private declarations }
      public
        { Public declarations }
      end;var
      EmailForm: TEmailForm;implementation{$R *.dfm}procedure TEmailForm.Button1Click(Sender: TObject);
    begin
       Close;
    end;{发送专递邮件 }
    function TEmailForm.SendMail() : Boolean;
    var
      MxList: TStringList;
      i: Integer;
      QName, ThoughAddress: string;
    begin
      { 根据用户所填写的内容创建邮件 }
      with IdMsgSend do
      begin
    //    Body.Assign(mmContent.Lines); //邮件正文
    //    From.Address := Trim(edtFrom.Text);  //发件人地址
    //    Recipients.EMailAddresses := Trim(edtTo.Text);  //收件人地址
    //    Subject := edtSubject.Text; //邮件主题
      end;  { 从输入的收件人地址中取出邮箱域名,利用前面的GetMxList过程得到目的地地址 }
    //  QName := TrimRight(copy(edtTo.Text, Pos('@', edtTo.Text) + 1, Length(edtTo.Text)));
      MxList := TStringList.Create;
      try
        GetMxList(MxList, QName);
        ThoughAddress := MxList.Names[0]; {取反馈回来的第一个服务器为目的地,读者可
          根据实际需要改进,比如说考虑到信件的优先级或当你选择的服务器因繁忙而暂时
          不能处理你的信件时,换用其它服务器试试 }
      finally
        MxList.Free;
      end;  { 发送邮件 }
      with IdSMTP do
      begin
        Host := ThoughAddress; // 将Host赋值为目的地,这就是特快专递与普通邮件的区别
        Port := 25; // smtp服务默认的端口为25
        Connect; //连接到服务器
        try
          Send(IdMsgSend); //发送刚才创建的邮件
          ShowMessage('发送完毕'); //发送完毕后提示
        finally
          Disconnect; //断开服务器连接
        end;
      end;
    end;procedure TEmailForm.GetMxList(AMxList: TStringList; AQName: string);
    { *****************************************************************************
      这个过程是用来得到邮件特快专递目的地服务器名称及优先级别数,参数AMXList是用
     来接收结果值,AQName代表传递过来的域名
      *****************************************************************************}
    var
      i: Integer;
    begin
      with IdDNSResolver do
      begin
        Host := '202.101.107.55';{ Host属性用来指定域名服务器的地址,此处为笔者所在地
           的主域名服务器地址,你也可以指定任一可以快速访问到的Internet上域名服务器
           地址,要知道自己所在地的域名服务器地址,win98下通过winipcfg命令,win2000下
           通过ipconfig /all即可查出。}
        ReceiveTimeout := 10000;// 在指定的时间内得不到域名服务器的反馈,则视为失败。
        ClearVars;// 清除前一次查询所反馈回来的资源记录{ 构建此次查询的头部结构 }
        with DNSHeader do
        begin
          Qr := False; // False 代表查询
          Opcode := 0; // 0代表标准域名查询
          RD := True; //域名服务器可以进行递归查询
          QDCount := 1; //查询的数量
        end;    { 构建要查询的问题 }
        DNSQDList.Clear;
        with DNSQDList.Add do
        begin
          QName := AQName; //要查询的域名
          QType := cMX; //QTYPE指定要查询的资源记录的种类,值为cMX代表邮件交换记录
          QClass := cIN;
        end;    ResolveDNS; //向域名服务器发出请求    { 从域名服务器接收反馈的结果,将反馈回来的邮件服务器名称放在AMXList列表的Name部分,
          邮件服务器的优先级别数放在Value部分。 }
        for i := 0 to DNSAnList.Count - 1 do
          AMxList.Add(DNSAnList[i].RData.MX.Exchange + '=' +
            IntToStr(DNSAnList[i].RData.MX.Preference));
      end;
    end;end.
    ------------------------------------------------
    打开DELPHI运行菜单Component->Import ActiveX Control菜单,然后导入DHTML Edit 
    Control For IE5(我用的是98第二版,所以是IE5。其路径是c:\program files\Common 
    Files\Microsoft Shared\Triedit\Dhtmled.ocx)。然后再用这个组件显示一个程序,这个组
    件设计时是灰色的,但是程序运行起来效果就对了。其实这个东东就是OutLook Express写邮件窗
    口编辑器的内核。
    wjiachun所说的CAKK主页上的那个东东就是这个ActiveX编程的VB&VC的例子(我下载过),大小
    有8兆多,如果你的网速很快的话,那么下载一份还是比较值的。
    这里有件事情不得不说,DELPHI运行包括这个ACTIVEX控件程序的速度我是实在不敢恭维,慢死
    了。另外也比较爱也错。
    ------------------------------------------------
      

  15.   

    to  ahpei(菩萨): 太感谢了!你如此热心,我有点不知说什麽好了,够朋友!