2014-07-23 61 views
0

我正在開發一個Visual Studio擴展,它向VS添加一條命令,以便在Outlook中使用附件撰寫郵件。該附件是由擴展程序生成的簡單.csv文件。 因此,當用戶觸發該命令時,Outlook將打開一個窗口,其中包含已經創建的電子郵件並添加了附件。用戶可能只需點擊發送。在運行中壓縮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; 
     } 
    } 

更新 一旦電子郵件組成,則顯示具有由消息的前景窗口(它有已經設定的附件)。現在,用戶可能只是發送它,取消它或任何。他甚至可能會讓窗戶打開幾個小時(雖然這不常見),然後發送(甚至在VS關閉後)。同樣,我不希望在發送或取消消息後在磁盤上存在任何臨時存檔。

我添加了發送電子郵件的完整方法。沒有更多,但只有在用戶選擇我的擴展添加到它的新Visual Studio命令(工具 - >從本月發送TFS日誌)時才調用此方法。在按鈕處理程序之間有一個額外的方法,它只是爲這裏提供的一個參數設置(設置主題,logPath等...)

如果這是不可能的,那麼我也可以接受這樣的答案。

+0

請添加更多代碼。你真的在哪裏發送郵件?因爲這是您可以刪除壓縮文件的地方。 – flayn

+0

請看我更新的答案。 – flayn

回答

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缺失,和我對Unload事件的簽名不是100%肯定certaing ,但有一個嘗試,讓我們知道。

這不會處理在發送郵件之前Visual Studio關閉的情況! (我認爲這可能不可能。)

+0

當您將它附加到電子郵件而不是「.zip」時,它不會是「.gz」嗎? –

+0

是的,已更正。 – flayn

+0

執行壓縮(日誌)後,新的「log.gz」是否會存在磁盤上?如果是這樣,那麼這不是我想要的。我想確定,在用戶發送組合郵件後,磁盤上不會有不必要的文件。 –