在飞行中压缩Outlook附件

时间:2014-07-23 20:24:50

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

我正在开发一个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等等......)

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

1 个答案:

答案 0 :(得分: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项目的关闭事件后发生此事件,   但在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的异常处理缺失,我不确定100%是否对Unload事件的签名进行了认证,但请尝试告诉我们。

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