仅保存 Outlook MailItem 的真实附件

Posted

技术标签:

【中文标题】仅保存 Outlook MailItem 的真实附件【英文标题】:Saving only the REAL attachments of an Outlook MailItem 【发布时间】:2013-12-23 19:29:36 【问题描述】:

我目前正在开发一个 Outlook 插件,它将邮件项和附件保存在我的 MSSQL 数据库中。

我有一个方法可以保存 MailItem 及其所有附件。但如果我保存所有附件,MailItem 中的嵌入图像也会被保存。

有谁知道如何保存所有真实附件??我的意思是像下图中的附件:

而不是邮件正文中的嵌入图像。

这是我用来遍历 MailItem 的所有附件然后保存它的代码:

foreach (Outlook.Attachment att in mailItem.Attachments)

      try
      
          att.SaveAsFile(Path.GetTempPath() + att.FileName);

          var fi = new FileInfo(Path.GetTempPath() + att.FileName);

          //Saving attachment to DB
          var attachment = Attachment.NieuwAttachment(att.FileName, SelectedMap.DossierNr.ToString( CultureInfo.InvariantCulture), -1, Convert.ToInt32(SelectedMap.Tag), fi);
          if (!Attachment.InlezenAttachment(attachment)) continue;

          OutlookCategories.AddAttachmentCategory(mailItem);
      
      catch (Exception ex)
      
          var dmsEx = new DmsException("Er is een fout opgetreden bij het opslaan van een bijlage.", ex.Message, ex);
          ExceptionLogger.LogError(dmsEx);
      
 

谢谢!

----------- 编辑 ------------

我也在 Microsoft TechNet 上发布了这个问题,我刚刚收到了这个问题的答案(请参阅下面的链接)

Outlook 2007 & 2010: Save all attachments except the embedded attachments C#

----------- 编辑 ------------

我的问题还没有解决,我从微软那里得到的帮助是没有用的。所以我真的需要解决这个问题!

【问题讨论】:

你现在的代码在哪里? 【参考方案1】:

使用此代码回答here:

if (mailItem.Attachments.Count > 0)
        
            // get attachments
            foreach (Attachment attachment in mailItem.Attachments)
            
                var flags = attachment.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x37140003");

                //To ignore embedded attachments -
                if (flags != 4)
                
                    // As per present understanding - If rtF mail attachment comes here - and the embeded image is treated as attachment then Type value is 6 and ignore it
                    if ((int)attachment.Type != 6)
                    

                        MailAttachment mailAttachment = new MailAttachment  Name = attachment.FileName ;
                        mail.Attachments.Add(mailAttachment);
                    

                

            
        

【讨论】:

【参考方案2】:

这对我有用:

var test = attachments[i].PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E");
if (string.IsNullOrEmpty((string)test))

       //attachment

else

       //embedded image

【讨论】:

我试过这个。这对我不起作用。它甚至可以将真正的附件识别为嵌入的。【参考方案3】:

取决于您如何定义“真实”或“正确”附件。我将假设您想忽略电子邮件中嵌入的所有图像。这些也是附件,但在 html 电子邮件的实际正文中被引用。

有关如何嵌入附件的说明,请参阅this 答案。关键是忽略具有 Content-ID 值的附件,该值由电子邮件正文中的图像标签引用。

【讨论】:

好的,我得到了你所说的部分:忽略具有 Content-ID 的附件,但在 C# 和 OOM 中,附件对象上没有 Content-ID...所以它做到了有点难…… 这很好!有没有办法访问原始电子邮件本身? 访问原始电子邮件的唯一方法是将其转换为 mhtml,然后挖掘到 mhtml 文件,然后处理附件(我需要的附件)......所以简而言之,我认为没有办法在不丢失附件或使用 .msg 文件本身的情况下访问原始邮件... 您不能简单地忽略所有设置了 Content-ID MIME 标头的附件 - 例如Lotus Notes 为所有附件设置该标题。您确实需要加载 HTML 正文并检查是否有任何消息通过内容 ID、文件名或位置引用附件。 我也面临同样的问题。请给我一个解决方案

以上是关于仅保存 Outlook MailItem 的真实附件的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中创建/打开从路径到新 Outlook.MailItem 的现有味精

在 Outlook 中捕获对 MailItem.SendUsingAccount 属性的更改

Excel 和 Outlook 2016 中的“对象 '_mailItem' 的方法 'body' 失败”错误

MailItem 啥时候不是 MailItem? [关闭]

如何检查可应用于 Outlook 中的 mailItem 的所有规则

在 Access 中处理 Outlook MailItem 发送事件