仅保存Outlook MailItem中的实际附件

11

我正在开发一个 Outlook 插件,可以将邮件和附件保存到我的 MSSQL 数据库中。

我有一个方法可以保存包含所有附件的邮件。但是如果我保存了所有附件,则邮件正文中嵌入的图像也会被保存。

有人知道如何保存所有真正的附件吗?我的意思是像下面图片中的附件:

enter image description here

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

以下是我用来循环遍历邮件附件并保存的代码:

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:保存所有附件,除了嵌入的附件C#

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

我的问题仍未解决,我从Microsoft得到的帮助是无用的...所以,请您帮忙解决这个问题!


1
你现在有代码在哪里? - Kendall Frey
3个回答

3

使用这段代码,它是在这里提供的:

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);
                    }

                }

            }
        }

0
这对我有用:
var test = attachments[i].PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E");
if (string.IsNullOrEmpty((string)test))
{
       //attachment
}
else
{
       //embedded image
}

我尝试过这个方法,但对我没有用。它甚至将真正的附件也识别为嵌入式的。 - Kushan Randima

0

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

请参见this的答案,了解嵌入附件的说明。关键是要忽略具有被电子邮件正文中的图像标记引用的 Content-ID 值的附件。


2
好的,我明白你说的那部分内容:忽略具有Content-ID的附件,但在C#和OOM中,附件对象上没有Content-ID...所以这使得它有点困难... - ValarmorghulisHQ
1
这是一个很好的观点!没有办法直接访问原始电子邮件吗? - Neil Trodden
1
唯一访问原始电子邮件的方法是将其转换为MHTML,然后挖掘MHTML文件,但是这样附件(我需要的附件)就被丢弃了... 所以简而言之,我认为没有办法在不丢失附件的情况下访问原始邮件,或者使用.msg文件本身... - ValarmorghulisHQ
1
你不能简单地忽略掉所有带有Content-ID MIME头的附件 - 例如,Lotus Notes为所有附件设置该头部。你真的需要加载HTML正文并检查是否有任何消息引用了附件,无论是通过内容ID、文件名还是位置。 - Dmitry Streblechenko
我也遇到了同样的问题,请给我建议一个解决方案。 - Ashu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接