VSTO Outlook:如何确定 MailItem 是否来自之前保存在本地然后在 Outlook 中打开的文件

问题描述 投票:0回答:1

我有一个 Outlook VSTO 加载项,我需要确定正在处理的 Outlook.MailItem 是否对应于已在 Outlook 中打开的本地磁盘上保存的文件,无论配置的帐户类型如何(Exchange、IMAP 等) .)。我需要将其与任何文件夹中非已保存电子邮件的草稿或任何其他类型的电子邮件区分开来。

具体来说,我需要明确检测 MailItem 是否保存在本地磁盘上,然后在 Outlook 中打开,以便我可以执行某些操作。

这是我尝试过但没有成功的事情的组合:

  • 检查资源管理器计数
  • 检查MailItem.EntryID
  • MailItem.ConversationID
  • MailItem.StoreID
  • 根据 ID 检索 MailItem,然后仅对本地保存的文件执行操作

但是,我的逻辑正在针对收件箱、草稿等中其他选定的电子邮件执行,而不仅仅是针对本地保存的文件。

下面是我尝试过的代码片段:

public bool IsLocalFile(Outlook.MailItem mailItem)
{
    if (string.IsNullOrEmpty(mailItem.EntryID) && string.IsNullOrEmpty(mailItem.StoreID))
    {
        return true;
    }
    return false;
}

public string GetLocalFilePath(Outlook.MailItem mailItem)
{
    Outlook.PropertyAccessor propertyAccessor = mailItem.PropertyAccessor;
    try
    {
        return propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x7D01001E") as string;
    }
    catch (System.Exception ex)
    {
        return null;
    }
}

        public bool IsInFolder(Outlook.MailItem mailItem)
        {
            Outlook.MAPIFolder parentFolder = null;
            try
            {
                parentFolder = mailItem.Parent as Outlook.MAPIFolder;
                return parentFolder == null;
            }
            catch
            {
            }

            return false;
        }

        public bool IsSaved(Outlook.MailItem mailItem)
        {
            Outlook.MAPIFolder parentFolder = mailItem.Parent as Outlook.MAPIFolder;
            if (parentFolder!=null)
            {
                string folderPath = parentFolder.FolderPath;
                if (folderPath=="C:\\EmlFolder"||folderPath=="C:\\Attachments")
                {
                    return true;
                }
            }

            string messageContent = mailItem.Body;
            if (messageContent.Contains("Content-Type: multipart/related")||mailItem.BodyFormat==Outlook.OlBodyFormat.olFormatHTML)
            {
                return true;
            }

            if (mailItem.InternetCodepage==0)
            {
                return true;
            }

            return false;
        }

        public string GetLocalFilePath2(Outlook.MailItem mailItem)
        {
            if (!string.IsNullOrEmpty(mailItem.EntryID)&&string.IsNullOrEmpty(mailItem.StoreID))
            {
                Outlook.NameSpace outlookNamespace = mailItem.Session.Application.GetNamespace("MAPI");
                Outlook.MailItem copiedMail = outlookNamespace.GetItemFromID(mailItem.EntryID);

                if (copiedMail!=null&&!string.IsNullOrEmpty(copiedMail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x370E001F")))
                {
                    return copiedMail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x370E001F") as string;
                }
            }

            return null;
        }

然后我在条件中检查以上所有内容:

if (mailItem.Session.Application.Explorers.Count == 0 ||
    (string.IsNullOrWhiteSpace(mailItem.ConversationID) && !mailItem.IsDraft()) ||
    IsLocalFile(mailItem) ||
    !string.IsNullOrWhiteSpace(GetLocalFilePath(mailItem)) ||
    !IsInFolder(mailItem) ||
    IsSave(mailItem) ||
    !string.IsNullOrWhiteSpace(GetLocalFilePath2(mailItem)))
{
   // do stuff only in case it is a saved mail in local disk
}

任何人都可以提供可靠的方法来检测 MailItem 是否是在 Outlook 中打开的本地保存的文件吗?我将非常感激。预先感谢。

outlook com vsto office-interop office-addins
1个回答
0
投票

据我所知,没有办法做到这一点。从本地邮箱打开的邮件与独立 MSG 文件打开的邮件没有额外的属性或现有属性有任何差异。

顺便说一句,

0x370E001F
PR_ATTACH_MIME_TAG
,仅出现在附件中。从不在消息上。不知道
0x7D01001E
是什么,但它从未出现在我检查的任何消息中。

© www.soinside.com 2019 - 2024. All rights reserved.