4

Outlookを自動化して、電子メールメッセージの「断片」をダウンロードし、関連するメッセージを結び付けることができるようにしたい。メールには通常、この目的を果たすための「MessageID」があり、ニュースリーダーの「スレッド」が相互に関連付けられているため、メールをコンテキストで表示できることを理解しています。

Outlookには、一緒に送信される電子メールに「メッセージID」の概念がありますか?(自動化を使用して)抽出できる要素は、Subject、SenderEmail、CreationTime、Body、SenderName、およびHTMLBodyであることがわかります。「メッセージID」または同等のものもどこかで利用できますか?

4

2 に答える 2

7

Outlookは、会話を使用して関連するメッセージを追跡します。

Outlook 2003には、ConversationTopicMAPI:PR_CONVERSATION_TOPIC)&ConversationIndexMAPI:)PR_CONVERSATION_INDEXがあります。ConversationTopic通常はメッセージの件名(プレフィックスを差し引いたもの-RE:/ FW:など)であり、 (基本的にGUID +タイムスタンプConversationIndex)の順序を表します。MSDNの会話の操作を参照してください。こちらのMSDNで明示的に定義されています。ConversationTopicConversationIndex

Outlook 2010では、から派生したConversationIDMAPI:)PR_CONVERSATION_IDConversationTopicを追加しました。ここで説明するようConversationIDに、から生成できます。ConversationTopic

会話に関するMSGプロトコル仕様の詳細については、[ MS-OXOMSG]:電子メールオブジェクトプロトコル仕様、セクション2.2.1.2および2.2.1.3を参照してください。

于 2012-08-08T11:59:40.303 に答える
2

以前の素晴らしい答えへの小さな追加。他の誰かがConversationIndex/ConversationTopicからConversationIDを取得するために使用されるアルゴリズムのC#実装も必要とする場合:

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 ...()は、必要なMAPIプロパティを取得し、結果を適切な管理対象タイプにキャストするだけのヘルパー関数です。

于 2014-02-07T10:27:06.957 に答える