在C#的Outlook VSTO项目中如何区分邮件附件与嵌入式图片?
如何在Outlook VSTO中区分邮件的实际附件与嵌入式图片?
我正在开发一个Outlook VSTO项目,需要将邮件的所有附件保存到指定文件夹。但在遍历附件时发现,无论是实际附件还是正文中的嵌入式/粘贴图片,Attachment.Type始终返回olByValue,无法直接区分:
Outlook.Inspector currentInspector = outlookApp.ActiveInspector(); var selectedMail = currentInspector.CurrentItem as Outlook.MailItem; foreach (Outlook.Attachment attachment in selectedMail.Attachments) { var attachmentType = attachment.Type; // 嵌入式图片和实际附件都返回olByValue }
目前我用的过滤方法是判断文件小于20KB且为图片类型就排除,但这种方法有缺陷——如果用户实际附加了小于20KB的图片,会被误排除。请问有没有更准确的区分方法?
可行的区分方法
1. 检查PR_ATTACHMENT_HIDDEN属性
嵌入式图片通常会被标记为隐藏,可通过PropertyAccessor读取MAPI属性http://schemas.microsoft.com/mapi/proptag/0x7FFE000B(对应PR_ATTACHMENT_HIDDEN)判断:
foreach (Outlook.Attachment attachment in selectedMail.Attachments) { bool isHidden = (bool)attachment.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"); if (!isHidden) { // 实际附件,执行保存操作 attachment.SaveAsFile(@"指定文件夹路径\" + attachment.FileName); } }
2. 检查Attachment.Position属性
嵌入式图片的Position值通常大于0(对应正文中的插入位置),普通附件的Position为0:
foreach (Outlook.Attachment attachment in selectedMail.Attachments) { if (attachment.Position == 0) { // 普通附件,执行保存 attachment.SaveAsFile(@"指定文件夹路径\" + attachment.FileName); } }
3. 组合判断(提升严谨性)
如果需要更精准,可以结合文件扩展名验证是否为图片,再配合上述方法过滤:
var imageExtensions = new HashSet<string> { ".jpg", ".jpeg", ".png", ".gif", ".bmp" }; foreach (Outlook.Attachment attachment in selectedMail.Attachments) { bool isHidden = (bool)attachment.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x7FFE000B"); string ext = Path.GetExtension(attachment.FileName).ToLower(); // 隐藏属性为false,或非图片且Position为0的,判定为实际附件 if (!isHidden || (!imageExtensions.Contains(ext) && attachment.Position == 0)) { attachment.SaveAsFile(@"指定文件夹路径\" + attachment.FileName); } }
注意:使用PropertyAccessor时需确保引用正确命名空间,同时处理可能的异常(部分特殊附件可能无该属性)。
内容的提问来源于stack exchange,提问作者Vakho Akobia
相关产品推荐
相关产品推荐

