起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 172|回复: 2

【结贴】帮忙看看,代码怎么写能让邮件同时另存多个附件。**

[复制链接]
发表于 2008-1-17 11:48:22 | 显示全部楼层 |阅读模式
2918的邮件开源后就看了下代码,想让附件另存为时能和上传一样一次另存为多个附件,代码已经找到,但能力太差,不知如何下手,请帮帮忙~~
上传的代码:
procedure TMAILEDITFORM.actNewAttachmentExecute(Sender: TObject);
var
  I: Integer;
  lOpenDialog: TMailOpenDialog;
begin
  lOpenDialog := TMailOpenDialog.Create(Self);
  try
    lOpenDialog.Filter := '所有文件(*.*)|*.*';
    lOpenDialog.Options := lOpenDialog.Options + [TOpenOption.ofAllowMultiSelect, TOpenOption.ofFileMustExist];
    if lOpenDialog.Execute then
    begin
      for I := 0 to lOpenDialog.Files.Count - 1 do
        msgMail.AddAttachment(lOpenDialog.Files[I]);
      SetModified;
      RefreshAttachs;
    end;
    BringWindowToTop(Handle);

    // todo 以下两个过程,解决98下不能刷新的问题。
    if Assigned(FTextEdit) then
      FTextEdit.Refresh;
    if Assigned(FDHTMLEdit) then
      FDHTMLEdit.Refresh;
  finally
    lOpenDialog.Free;
  end;
end;

另存为的代码:
procedure TMAILEDITFORM.actSaveAsAttachmentExecute(Sender: TObject);
var
  lSaveDialog: TMailSaveDialog;
  mi: TMessageItem;
  lStream: TStream;
begin
  mi := lvwAttachments.Selected.Data as TMessageItem;
  lSaveDialog := TMailSaveDialog.Create(Self);
  try
    lSaveDialog.Filter := '所有文件(*.*)|*.*';
    lSaveDialog.Options := lSaveDialog.Options + [TOpenOption.ofOverwritePrompt];
    if mi.FileName = '' then
      lSaveDialog.FileName := mi.ContentName
    else
      lSaveDialog.FileName := mi.FileName;
    if lSaveDialog.Execute then
    begin
      lStream := TFileStream.Create(lSaveDialog.FileName, Classes.fmCreate);
      try
        mi.GetContent(lStream);
      finally
        lStream.Free;
      end;
    end;
    BringWindowToTop(Handle);
  finally
    lSaveDialog.Free;
  end;
end;

上传的代码有个for循环,不晓得是不是在另存为的时候也写个循环语句就好了,不过还是不会加啊?
谢谢拉~~
回复

使用道具 举报

发表于 2008-1-17 14:30:41 | 显示全部楼层
修改的比较多,楼主备份下以前的代码哦


procedure TMAILEDITFORM.actSaveAsAttachmentExecute(Sender: TObject);
var
  lSaveDialog: TMailSaveDialog;
  mi: TMessageItem;
  lStream: TStream;
  i:integer;
  tmpFileName,dir:string;
  lMailAttachment: TMailAttachment;
begin

  if  lvwAttachments.SelCount=1 then
  begin
      mi := lvwAttachments.Selected.Data as TMessageItem;
      lSaveDialog := TMailSaveDialog.Create(Self);
      try
        lSaveDialog.Filter := '所有文件(*.*)|*.*';
        lSaveDialog.Options := lSaveDialog.Options + [TOpenOption.ofOverwritePrompt];
        if mi.FileName = '' then
          lSaveDialog.FileName := mi.ContentName
        else
          lSaveDialog.FileName := mi.FileName;
        if lSaveDialog.Execute then
        begin
          lMailAttachment := TMailAttachment.Create;
          lStream := TFileStream.Create(lSaveDialog.FileName, Classes.fmCreate);
          try
            mi.GetContent(lStream);
            if (mi.AttachmentIndex > 0) and (lStream.Size = 0) then
            begin
              lMailAttachment.Index := mi.AttachmentIndex;
              MailSystem.LoadMailAttachment(MailGUID, lMailAttachment);
              lMailAttachment.Content.Position := 0;

              lStream.CopyFrom(lMailAttachment.Content, lMailAttachment.Content.Size);

            end

          finally
            lStream.Free;
          end;
        end;
        BringWindowToTop(Handle);
      finally
        lSaveDialog.Free;
      end;
  end
  else begin
   if Business.Forms.FileCtrl.SelectDirectory('选择目录', '',dir) then
   begin
     // lSaveDialog := TMailSaveDialog.Create(Self);

        for i:=0 to lvwAttachments.Items.Count-1 do
        begin
             if   lvwAttachments.Items.Selected then
             begin
                mi := lvwAttachments.Items.Data as TMessageItem;
                if mi.FileName = '' then
                   tmpFileName:=mi.ContentName
                else
                    tmpFileName:=mi.FileName;
                tmpFileName:=dir+'\'+tmpFileName;
                if sysutils.FileExists(tmpFileName) then
                begin
                   if Forms.Application.MessageBox(tmpFileName+#13'文件已经存在是否覆盖?','提示',Borland.Delphi.Windows.MB_ICONWARNING+Borland.Delphi.Windows.MB_OkCancel)=Borland.Delphi.Windows.idok then
                      sysutils.DeleteFile(tmpFileName)
                   else
                     continue;
                end;
                lMailAttachment := TMailAttachment.Create;
                lStream := TFileStream.Create(tmpFileName, Classes.fmCreate);
                try
                  mi.GetContent(lStream);
                  if (mi.AttachmentIndex > 0) and (lStream.Size = 0) then
                  begin
                    lMailAttachment.Index := mi.AttachmentIndex;
                    MailSystem.LoadMailAttachment(MailGUID, lMailAttachment);
                    lMailAttachment.Content.Position := 0;

                    lStream.CopyFrom(lMailAttachment.Content, lMailAttachment.Content.Size);

                  end

                finally
                  lStream.Free;
                end;
             end;
         end;

         BringWindowToTop(Handle);
     end;
  end;
end;

//2008年最新修改的哦!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-17 16:01:20 | 显示全部楼层
呵呵,作了下是否多选的判断:)

测试了一下,其中下面一句好像有点问题:
tmpFileName:=dir+''+tmpFileName;
正确的好像应该是:
tmpFileName:=dir+'/'+tmpFileName;
其他应该差不多了

此帖可结拉~~
.                                                                                                                                                                                        .
.                                                                                                                                                                                        .
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-5 15:26 , Processed in 0.043725 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表