0

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

2 回答 2

2

你所拥有的几乎是你能做的最好的 -FileName将匹配,PathName将始终为空,并且DisplayName将与FileName.

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

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

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

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

于 2016-08-04T22:20:04.963 回答
0

我有类似的问题,并尝试使用该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);
                    }
于 2021-12-17T06:05:51.053 回答