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

时间:2016-08-04 21:47:51

标签: c# attachment outlook-addin mailitem

我知道如何将文件添加到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
    }
}

1 个答案:

答案 0 :(得分:1)

您所拥有的只是您可以做的事情 - FileName将匹配,PathName将始终为空,DisplayName将与FileName相同。< / p>

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

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

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

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