MailItem 附件 - 检查文件是否已附加

MailItem Attachments - Check if File Already Attached

我知道如何将文件添加到 MailItem.Attachments,但如何检查文件是否已添加到附件?

比如我有文件名"C:\myFolder\myFile.txt"。如何检查此文件是否已附加?我需要这个来防止将文件重复附加到新电子邮件。

这是我目前的情况:

var mItem = Outlook.Interfaces.HostAddIn.Application.ActiveInspector().CurrentItem as MailItem;

if (mItem != null)
{
    //this works fine but I need to check if already attached first like below
    //mItem.Attachments.Add(localFilePath); 

    bool found = false;
    string attachments = "";
    for (int i = 1; i <= mItem.Attachments.Count; i++)
    {
        attachments += 
            "DisplayName: " + mItem.Attachments[i].DisplayName //shows just myFile.txt, no path
            + " / FileName: " + mItem.Attachments[i].FileName  //shows just myFile.txt, no path
            + " / PathName: " + mItem.Attachments[i].PathName; //shows ""

        //I tried here PathName, FileName, DisplayName but all return just name, without the path
        if (mItem.Attachments[i].PathName == localFilePath)
        {
            found = true;
        }
    }
    if (!found)
    {
        mItem.Attachments.Add(localFilePath); //attach only if not already attached
    }
}

你所拥有的几乎是你能做的最好的 - FileName 将匹配,PathName 将始终为空,DisplayName 将与 [=10= 相同].

您还可以比较旧文件和现有文件的大小,但不要使用 Attachment.Size,因为它包括 MAPI 指定属性的大小加上实际文件数据。

另外不要忘记检查 Attachmeent.Type == olByValue:您只需要常规附件。

您还可以(如果文件名匹配)将现有附件保存到临时文件夹 (Attachment.SaveAsFile) 并比较文件大小。如果它们匹配,您还可以比较上下文(例如计算 CRC)。

请注意,您无法单独使用 OOM 直接访问附件数据,您需要扩展 MAPI (IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...)) 或 Redemption(我是其作者 - Attachment.AsText/AsArray/等)。否则您将需要使用 Attachment.SaveAsFile 然后删除临时文件。

我遇到了类似的问题,并尝试使用 mail.Attachment.Contains() 方法,但这总是返回 true。不知道为什么。

所以我根据上面对 Dmit's 回答的评论做了以下操作。

这将检查文件附件是否存在,仅通过 名称。当然,您需要检查文件大小、CRC 等,以确保它是 100% 相同的文件。

                    FileInfo fInfo = new FileInfo(lFile);

                    if (errLine.Split(":")[0] == fInfo.Name)
                    {
                        Attachment logfile = new Attachment(lFile);
                        bool attachmentFound = false;
                        foreach (Attachment att in mail.Attachments)
                        {
                            if (att.Name == logfile.Name)
                            {
                                attachmentFound = true;
                                break;
                            }
                        }
                        if (!attachmentFound)
                            mail.Attachments.Add(logfile);
                    }