如何区分Outlook 2010中的内嵌图像和附件[C#]

时间:2012-05-04 09:06:42

标签: c# outlook-addin msdn mailitem

您好我必须使用C#在Outlook 2010的本地目录中分别阅读附件和内嵌图像。我已经使用了属性和内容ID概念。我正在使用以下代码执行此操作,但它现在正在运行。

if (mailItem.Attachments.Count > 0)
{
    /*for (int i = 1; i <= mailItem.Attachments.Count; i++)
    {
    string filePath = Path.Combine(destinationDirectory, mailItem.Attachments[i].FileName);
    mailItem.Attachments[i].SaveAsFile(filePath);
    AttachmentDetails.Add(filePath);
    }*/

    foreach (Outlook.Attachment atmt in mailItem.Attachments)
    {
        MessageBox.Show("inside for each loop" );
        prop = atmt.PropertyAccessor;
        string contentID = (string)prop.GetProperty(SchemaPR_ATTACH_CONTENT_ID);
        MessageBox.Show("content if is " +contentID);

        if (contentID != "")
        {
            MessageBox.Show("inside if loop");
            string filePath = Path.Combine(destinationDirectory, atmt.FileName);
            MessageBox.Show(filePath);
            atmt.SaveAsFile(filePath);
            AttachmentDetails.Add(filePath);
        }
        else
        {
            MessageBox.Show("inside else loop");
            string filePath = Path.Combine(destinationDirectoryT, atmt.FileName);
            atmt.SaveAsFile(filePath);
            AttachmentDetails.Add(filePath);
        }
    }
}

请帮助正在进行的工作....

3 个答案:

答案 0 :(得分:2)

我来到这里寻找解决方案,但不喜欢在整个HTMLBody中搜索“cid:”的想法。首先,对于每个文件名都这样做很慢,其次,如果正文中出现“cid:”,我会得到误报。另外,在HTMLBody上执行ToLower()不是一个好主意。

相反,我最终在HTMLBody上使用一次正则表达式来查找&lt; img&gt;的任何实例。标签。因此,没有办法在正文中错误地匹配“cid:”(但不太可能)。

     Regex reg = new Regex(@"<img .+?>", RegexOptions.Singleline | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
     MatchCollection matches = reg.Matches(mailItem.HTMLBody);

     foreach (string fileName in attachments.Select(a => a.FileName)
     {
        bool isMatch = matches
           .OfType<Match>()
           .Select(m => m.Value)
           .Where(s => s.IndexOf("cid:" + fileName, StringComparison.InvariantCultureIgnoreCase) >= 0)
           .Any();

        Console.WriteLine(fileName + ": " + (isMatch ? "Inline" : "Attached"));
     }

我很确定我可以写一个正则表达式来返回文件名,它可能会更高效。但是为了那些不是正则表达式大师的人必须维护代码,我宁愿花费额外的费用。

答案 1 :(得分:0)

我知道这是一个老问题,但答案可能对某人有所帮助。

    using Attachment = MsgReader.Outlook.Storage.Attachment;
    
    foreach (Attachment attachment in mailItem.Attachments.Where(a => ((Attachment)a).Hidden == false)) {
      // do whatever you want with the 'real' attachments.
    }

答案 2 :(得分:-1)

这对我有用 - 检查附件名称是否出现在电子邮件的HTMLBody中

VB.NET

<i>
For Each oAttachment In m_olMailItem.Attachments 
If m_olMailItem.HTMLBody.ToLower.Contains("cid:" & oAttachment.FileName) = True Then 
   Msgbox("Embedded")

Else 
   Msgbox("Not Embedded ! ")

End if 

http://www.outlookforums.com/threads/44155-detecting-if-attachement-is-embedded-or-not/