Получить Message-ID после отправки почты

Для моей надстройки Outlook мне нужно обрабатывать электронные письма, вычислять уникальный хэш и хранить этот хэш на сервере/базе данных. Например :

Есть 4 пользователя:

Случай 1:

User1 отправляет письмо User2 и User3. Пользователь 2 хочет сохранить почтовый хэш на стороне сервера, поэтому он нажимает кнопку надстройки. Хэш вычисляется с помощью кода, подобного этому

var accessor = mailItem.PropertyAccessor;
var subject = accessor.GetProperty(_PR_SUBJECT_W_TAG).ToString();
var messageId  = accessor.GetProperty(_PR_INTERNET_MESSAGE_ID_W_TAG).ToString();
var hash = CalulateHash(subject + messageId);

Этот хэш хранится на сервере. Если User3 попытается также сохранить хэш почты, он получит тот же хеш (поскольку тема и messageid должны быть одинаковыми ==> rfc822) и сервер знает, он уже получил этот хэш. Это работает очень хорошо.

Вариант 2: Пользователь 1 хочет отправить письмо Пользователю 2, Пользователю 3 и случайному человеку . Поскольку randomperson не принадлежит их компании, User1 хочет использовать функцию SendAndStore(). Перед отправкой почты к новой почте добавляется настраиваемое свойство.

mailItem.UserProperties.Add("HandleAfterSent", MSOutlook.OlUserPropertyType.olText);
var aasProp = mailItem.UserProperties.Find("HandleAfterSent");
if (aasProp != null)
{
    aasProp.Value = "some_value";
}
mailItem.Save();

SendMailItem(mailItem);

Кроме того, есть возможность получать уведомления, если в папку «Входящие» добавляется новый элемент. Итак, я наблюдаю за папкой sent.

inbox = outlookNameSpace.GetDefaultFolder(MSOutlook.OlDefaultFolders.olFolderSentMail);
items = inbox.Items;
items.ItemAdd += OnInboxItemAdded;

Если почта отправляется через SendMailItem(mailItem);, вызывается обработчик (тоже работает нормально). Но, к сожалению, у меня проблемы с вычислением хэша отправляемой почты, потому что у этой почты нет Message-ID. У кого-нибудь есть идея, как получить Message-ID почты, которая была отправлена ​​только что. Я уже пытался установить Message-ID самостоятельно, но он переопределяется с сервера MS Exchange.

РЕДАКТИРОВАТЬ: Outlook находится в режиме кэширования. Мне нужна возможность получить Message-ID и для этого сценария.

EDIT2 (в дополнение к комментариям): Случай 3: randomperson хочет отправить письмо User1,User2 и Пользователь3. Поскольку randomperson не принадлежит их компании, User1 хочет использовать функцию StoreFromInbox(). Письма в папке «Входящие» всех трех пользователей имеют одинаковый идентификатор сообщения. Но у них разные _PR_SEARCH_KEY_ , поэтому мы не можем использовать это свойство.


person Kooki    schedule 10.04.2016    source источник
comment
Это может иметь значение: stackoverflow.com/questions/19029082/   -  person Yacoub Massad    schedule 10.04.2016
comment
Это актуально, вы правы. Без режима кеша работает. Но есть ли возможность получить id и в режиме кеша?   -  person Kooki    schedule 10.04.2016


Ответы (1)


Попробуйте использовать свойство PR_SEARCH_KEY MAPI — оно должно остаться прежним после отправки сообщения и его перемещения в папку «Отправленные».

person Dmitry Streblechenko    schedule 10.04.2016
comment
я должен использовать его как значение для хэш-кода? Я изменил код, чтобы использовать больше функций выкупа. но в настоящее время у меня есть исключение при использовании rdoSession.GetMessageFromID(outlookMailItem.EntryID, outlookMailItem.Parent.StoreID, 0x200) as IRDOMail;. Я надеялся получить идентификатор сообщения с этим кодом даже в кэшированном режиме - person Kooki; 10.04.2016
comment
проклятый кеш Outlook. если я использую таймер и звоню rdoSession.GetMessageFromID(outlookMailItem.EntryID, outlookMailItem.Parent.StoreID, 0x200) as IRDOMail; примерно через одну минуту после отправки почты, исключений нет. есть ли другое решение вместо ожидания? - person Kooki; 10.04.2016
comment
Конечно, я не понимаю, почему бы и нет - просто хэшируйте значение PR_SEARCH_KEY. Почему вы повторно открываете элемент по его идентификатору входа? - person Dmitry Streblechenko; 11.04.2016
comment
Я добавил новый РЕДАКТИРОВАТЬ по вопросу. PR_SEARCH_KEY не является уникальным, если была получена внешняя почта (получатель User1 нашел другое значение, чем Recipient User2), поэтому это свойство невозможно для вычисления хэша. В чем разница между PR_SEARCH_KEY и PR_SENDER_SEARCH_KEY? - person Kooki; 14.07.2016
comment
Если сообщение отправлено, конечно, PR_SEARCH_KEY будет другим на стороне получателя. - person Dmitry Streblechenko; 14.07.2016