【问题标题】:Zipping outlook attachment on the fly即时压缩 Outlook 附件
【发布时间】:2014-09-25 18:03:55
【问题描述】:

我正在开发一个 Visual Studio 扩展,它向 VS 添加命令以在 Outlook 中编写带有附件的消息。附件是一个简单的 .csv 文件,也是由扩展程序生成的。 因此,当用户触发命令时,Outlook 会打开一个窗口,其中包含已编写的电子邮件并添加了附件。用户可能只是点击发送。

现在我被要求增加发送用 zip 压缩的日志的可能性。我想撰写带有已压缩附件的邮件,但我不希望在邮件发送(或取消)后保留任何临时 .zip 文件。我怎样才能做到这一点?

我编写邮件并打开 Outlook 窗口的代码:

using Microsoft.Office.Interop.Outlook;

...

    private static bool TrySendMethod1(string subject, string toAddr, string body, string logPath)
    {
        try
        {
            Application app = new Application();
            MailItem mailItem = app.CreateItem(OlItemType.olMailItem);
            mailItem.Subject = subject;
            mailItem.To = toAddr;
            mailItem.Body = body;
            if (logPath != null) mailItem.Attachments.Add(logPath);
            mailItem.Importance = OlImportance.olImportanceNormal;
            mailItem.Display(false);
            return true;
        }
        catch (System.Exception e)
        {
            return false;
        }
    }

更新 撰写完电子邮件后,将显示一个带有撰写邮件的 Outlook 窗口(它已设置附件)。现在,用户可能只是发送它、取消它或其他什么。他甚至可能将窗口打开几个小时(尽管这并不常见)然后发送(即使在 VS 已关闭之后)。同样,在发送或取消消息后,我不希望磁盘上存在任何临时存档。

我添加了发送电子邮件的完整方法。仅此而已,但是当用户选择我的扩展添加到其中的新 Visual Studio 命令时才调用此方法(工具 -> 发送 TFS 日志 -> 从本月开始)。按钮处理程序之间只有一个附加方法,它只是为此处提供的参数设置一些参数(设置主题、logPath 等...)

如果不可能,那我也可以接受这样的回答。

【问题讨论】:

  • 请添加更多代码。您实际上将邮件发送到哪里?因为这是您可以删除压缩文件的地方。
  • 请看我更新的答案。

标签: c# outlook office-interop email-attachments vspackage


【解决方案1】:

您可以使用以下方法压缩文件:

public static void Compress(FileInfo fileToCompress, string compressedFileName)
{
    using (FileStream originalFileStream = fileToCompress.OpenRead())
    {
       using (FileStream compressedFileStream = File.Create(compressedFileName)
            {
                using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
                {
                    originalFileStream.CopyTo(compressionStream);
                }
            }
    }
}

修改自:http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx

之后要删除文件,您可以附加到MailItem.Unload Event

此事件在 Outlook 项目的 Close 事件发生后发生, 但在 Outlook 项目从内存中卸载之前,允许 加载项以释放与对象相关的任何资源。虽然 事件在 Outlook 项目从内存中卸载之前发生,这 活动无法取消。

来源:http://msdn.microsoft.com/en-us/library/office/ff868564(v=office.15).aspx

那么你的 TrySendMethod1 可能看起来像这样

private static bool TrySendMethod1(string subject, string toAddr, string body, string logPath)
{
    try
        {
          Application app = new Application();
          MailItem mailItem = app.CreateItem(OlItemType.olMailItem);
          mailItem.Subject = subject;
          mailItem.To = toAddr;
          mailItem.Body = body;
          string compressedFileName = logpath + ".gz";
          CompressedStack(logpath, compressedFileName);
          if (logPath != null) mailItem.Attachments.Add( compressedFileName );
          mailItem.Importance = OlImportance.olImportanceNormal;
          mailItem.Display(false);
          mailItem.Unload += (e) => {File.Delete(compressedFileName);};
          return true;
      }
      catch (System.Exception e)
      {
          return false;
      }
  }

缺少File.Delete 的异常处理,我不确定Unload 事件的签名是否100% 确定,但请尝试让我们知道。

这不会处理在发送邮件之前关闭 Visual Studio 的情况! (我认为这甚至是不可能的。)

【讨论】:

  • 当您将其附加到电子邮件时,它不会是“.gz”,而不是“.zip”吗?
  • 执行 Compress(log) 后,新的“log.gz”是否会存在于磁盘的某个位置。如果是这样,那不是我想要的。我想确定的是,在用户发送撰写的邮件后,磁盘上没有不必要的文件。
  • 在您发送邮件之前,该文件必须存在。您需要在邮件发送后手动删除该文件。使用 fileToCompress.FullName + ".gz" 创建文件名是非常简单的方法,您也可以指定不同的文件名(例如作为参数)并稍后将其删除。
  • 我会向他解释,由于选择了路径选项,文件会在与原始文件相同的位置创建,并且可能会演示他如何选择不同的位置。不过,此代码有效。
  • @B.K.:他需要提供更多信息,他是如何发送邮件的。
猜你喜欢
  • 2010-11-27
  • 2016-11-30
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多