2016-03-01 15 views
0

,根據它們的文件名保存電子郵件附件某些Outlook VBA代碼的失敗的嵌入式位圖圖像上,當它試圖訪問的FileName屬性「附件」。如何測試Outlook附件的FileName屬性

我該如何檢測? FileName屬性應該是一個字符串,但沒有這些測試捕獲它:

If objAtt.FileName = "" Then .... 
If objAtt.FileName = vbNullString Then .... 

但每次試圖訪問該屬性引發運行時錯誤:

Outlook cannot perform this action on this type of attachment.

我寧願不要如果可能,請使用DisplayName屬性。

而且,看來我可以根據自己的文件類型屬性的值過濾附件,但我一直沒能找到一個列表,這些整數值與文件類型關聯。

建議表示讚賞。

回答

1

FileName屬性只適用於經常olByValue類型的附件。在你的情況下,你最有可能處理的是一個olOLE類型的附件,它實際上是一個序列化的嵌入式OLE對象 - 該流存儲了Outlook用來表示圖像的位圖(或圖元文件)以及原始應用程序的實際數據創建數據(MSPaint?)可用於編輯它。

OLE附加數據被存儲在的IStorage接口格式。數據的實際格式取決於用於創建它的應用程序(MSPaint,Excel等)。 Outlook對象模型不允許使用附件保存此類附件.SaveAsFile

根據您使用的語言(C++或Delphi最好),您需要打開PR_ATTACH_DATA_OBJ屬性作爲IStorage,然後提取數據(IAttach :: OpenProperty(PR_ATTACH_DATA_OBJ,IID_IStorage,...))。看看該消息OutlookSpy - 點擊即時聊天按鈕,進入GetAttachmentTable選項卡上,雙擊該OLE附件,請選擇PR_ATTACH_DATA_OBJ,點擊右鍵,IAMPIProp :: OpenProperty。

如果使用Redemption是一個選項,它提取了十的附件數據或使最流行的格式(MSPAINT,的Excel,Word,PDF等):

set Session = CreateObject("Redemption.RDOSession") 
Session.MAPIOBJECT = Application.Session.MAPIOBJECT 
set OutlookMsg = Application.ActiveExplorer.Selection.Item(1) 
set Msg = Session.GetRDOObjectFromOUtlookObject(OutlookMsg) 
for each attach in Msg.Attachments 
    attach.SaveAsFile "c:\temp\" & attach.FileName 
next 
+0

感謝。這是非常豐富的。目前我僅限於VBA,我需要做的就是避免這些「附件」並捕獲特定的類型/擴展;希望不訴諸使用DisplayName。 – mmmbeer

+1

只需選中Attachment.Type屬性 - https://msdn.microsoft.com/en-us/library/office/microsoft.office.interop.outlook.olattachmenttype –

+0

感謝。我確實看到了這個鏈接,但我不確定它是否詳盡,因爲所顯示的枚舉只有四個值,文件類型屬性至少包含整數1和6. – mmmbeer