2014-02-07 42 views
2

我有一個C#程序,通過檢索附件和將電子郵件分類到子文件夾來管理資源郵箱。最近客戶希望向我們發送簽名電子郵件時出現了一個問題,因此當程序檢索其附件時,會保存名爲「smime.p7m」的文件而不是文件附件。在Outlook中查看電子郵件時,此文件不存在,只有我們想要的附件。但是,單步執行代碼時,電子郵件對象中列出的附件僅包含此.p7m文件。EWS:從簽名電子郵件中檢索附件

我已經從電子郵件中檢索了MIME內容,但它只是字節。當我在文本編輯器中查看.p7m文件時,我會在底部文件(最終挑逗)中看到我想要的文件內容!如何獲取原始附件而無需解析.p7m文件中的感興趣內容?

交換服務器是2010 SP2,這一切都是通過使用EWS託管API的C#程序發生的。

回答

3

可以使用EnvelopedCMS類從加密附件中獲取MIME。假設您的安全上下文可以訪問密鑰。

byte[] content = ...The byte[] from the smime.p7m attachment ... 
var encrypted = new EnvelopedCms(); 
encrypted.Decode(content); 
encrypted.Decrypt(); 
byte[] unencryptedButRawMimeEntity = encrypted.ContentInfo.Content; 

這將允許您獲取未加密的MIME實體(沒有傳輸標題的原始電子郵件)。

如果消息進行簽名,所述解密的MIME實體將與一個SMIME Type部首等於signed-data另一個單個附件。您可以使用SignedCMS類重複上述過程,以顯示其內容。應該省略Decrypt調用。

然後您必須解析/解碼MIME以提取其正文和附件。

執行此操作的代碼顯然位於System.Net.Mime命名空間,但Microsoft無論出於何種原因都未提供公共入口點。我讀過其他地方,你可以使用反射來訪問它。這樣做的缺點是,它不被支持,非公開接口在後來的框架版本中可能會發生變化。 this question中的代碼顯示如何處理quoted-printable傳輸編碼。

或者,您可以像我一樣編寫或借用您自己的MIME解析器。不幸的是,由於IP,我不能給你代碼。

當時我無法找到一個簡單的選擇。現在我很想嘗試下面鏈接的NuGet包,並節省一些痛苦。從OpenPOP.Net開始。


您可以使用code in this project爲靈感,看看第三方選項this question,或嘗試these packages上的NuGet。

+0

謝謝Jodrell。我將看看OpenPOP.Net,看看我需要的是什麼。然後,我會發布任何積極的結果,我覺得:) – grantathon

2

您應該檢查出MimeKit(MIME解析器+ S/MIME和PGP支持)和MailKit(如果您需要SMTP,POP3和/或IMAP)。

我已經寫了一些關於如何在GitHub項目主頁上的文檔中使用MimeKit的解密和簽名驗證API的示例。

1

使用OpenPOP。NET,可通過NuGet和EWS託管API訪問我能夠檢索嵌入在感興趣的某個電子郵件的MIME內容中的附件。我用

System.Exchange.WebServices.Data.Item email = new System.Exchange.WebServices.Data.Item(myEmail); 
OpenPop.Mime.Message message = new OpenPop.Mime.Message(email.MimeContent.Content); 
List<OpenPop.Mime.MessagePart> validMessageParts = message.FindAllAttachments().Where(x => x.FileName.Contains(".csv") == true || x.FileName.Contains(".xlsx") == true || x.FileName.Contains(".xls") == true).ToList<MessagePart>(); 

foreach (MessagePart messagePart in validMessageParts) 
{ 
    if (messagePart != null) 
    { 
    using (FileStream fileStream = new FileStream(savingPath + messagePart.ContentDisposition.FileName, FileMode.Create, FileAccess.ReadWrite)) 
    { 
     messagePart.Save(fileStream); 
    } 
    } 
} 

將所有csv,xlsx和xls保存在一個特定的電子郵件中到我選擇的目錄中。

+0

作者不是在問「簡單」附件處理。用戶正在詢問如何處理在對象模型中顯示爲附件的簽名/加密電子郵件。 –