4

我想自动化 Outlook,以便我可以下载电子邮件的“片段”,以便我可以将相关的消息联系在一起。我知道电子邮件通常有一个“MessageID”来服务于这个目的,以便可以在上下文中查看电子邮件,因为新闻阅读器中的“线程”被捆绑在一起。

Outlook 在与它一起发送的电子邮件中是否具有“邮件 ID”的概念?我看到可以提取(使用自动化)的元素是 Subject、SenderEmail、CreationTime、Body、SenderName 和 HTMLBody。在某处是否也有“消息 ID”或等效项?

4

2 回答 2

7

Outlook 使用对话跟踪相关邮件。

在 Outlook 2003 中,有ConversationTopic( MAPI:)PR_CONVERSATION_TOPICConversationIndex ( MAPI:)PR_CONVERSATION_INDEXConversationTopic通常是消息主题(减去前缀 - RE:/FW: 等),而表示(本质上是 GUID + 时间戳ConversationIndex)的顺序。请参阅MSDN 上的使用对话。在 MSDN here上明确定义ConversationTopicConversationIndex

在 Outlook 2010 中,他们添加了ConversationID( MAPI:)PR_CONVERSATION_ID,它源自ConversationTopic. ConversationID可以从ConversationTopic这里讨论的 生成。

有关对话的 MSG 协议规范的更多详细信息,请参阅[MS-OXOMSG]:电子邮件对象协议规范,第 2.2.1.2 和 2.2.1.3 节。

于 2012-08-08T11:59:40.303 回答
2

Small addition to previous great answer. In case if anyone else will also need C# implementation of algorithm used to retrieve ConversationID from ConversationIndex/ConversationTopic:

private const int c_ulConvIndexIDOffset = 6;
private const int c_ulConvIndexIDLength = 16;

private string GetConversationId()
        {
            var convTracking = GetMapiPropertyBool(PR_CONVERSATION_INDEX_TRACKING);
            var convIndex = GetMapiPropertyBytes(PR_CONVERSATION_INDEX);
            byte[] idBytes;
            if (convTracking
                && convIndex != null
                && convIndex.Length > 0)
            {
                // get Id from Conversation index
                idBytes = new byte[c_ulConvIndexIDLength];
                Array.Copy(convIndex, c_ulConvIndexIDOffset, idBytes, 0, c_ulConvIndexIDLength);
            }
            else
            {
                // get Id from Conversation topic
                var topic = GetMapiPropertyString(PR_CONVERSATION_TOPIC);
                if (string.IsNullOrEmpty(topic))
                {
                    return string.Empty;
                }

                if (topic.Length >= 265)
                {
                    topic = topic.Substring(0, 256);
                }
                topic = topic.ToUpper();

                using (var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider())
                {
                    idBytes = md5.ComputeHash(Encoding.Unicode.GetBytes(topic));
                }
            }

            return BitConverter.ToString(idBytes).Replace("-", string.Empty);
        }

GetMapiProperty...() is a helper functions which just retrieve required MAPI property and cast result to appropriate managed type

于 2014-02-07T10:27:06.957 回答