Если вы помните поступающие письма и вам вполне хватает штатных средств Microsoft Outlook для их классификации, то этот пост не для вас, потому что речь пойдет о том, как можно запоминать ссылки на сообщения и хранить их в любом документе, например в MS Project, MS Word, MS Visio или даже просто в комментариях программы для того, что бы в любой момент можно было открыть исходное сообщение парой нажатий.

Поискав по интернету инструменты с нужным функционалом я не нашел ничего достаточно удобного для работы с Outlook. Пробовал рассовывать письма по папкам, помечать категориями, сохранять, вкладывать и тд и тп. Имея несколько десятков задач и несколько десятков писем по каждой задаче постоянно приходилось полагаться на память, но после нескольких переключений в день между задачами память переполнялась, мозг бунтовал. Беспорядок в голове рос и к концу недели мозг перегревался. Усугублялось это огромными запутанными глыбами чужого кода и тупыми процессами микроменеджмента на проекте. Каждая задачка сопровождалась примерно двадцатью пунктами анализа, согласования, пропихивания, тестирования, откатов, накатов и тд. и тп. Только не спрашивайте в какой конторе и на каком проекте это происходит. Примерно 100 человек и 20 млн строк кода после 20 лет развития могут довести любой проект до состояния ползущего хаоса, который поглотит того, кто захочет с ним бороться. Как говорил один поэт «покой нам только снится».

Тогда я придумал простой способ как облегчить навигацию по информационному потоку. Для начала стал вести учет задач в более-менее удобной среде (в моем случае oneNote) и сохранять ссылки на сообщения в карточке к задаче, что бы можно было их быстро открывать и отвечать. Каждое сообщение в outlook имеет свой уникальный EntryID и есть COM API, позволяющее получать его и открывать письмо. EntryID можно считать постоянным, если не перемещать письмо из папки в папку или в бакап.

Предоставляю для рассмотрения многоуважаемых читателей 2 VBS скрипта, которые позволяют получить EntryID и переходить в письмо по нему.

Алгоритм действия такой:

I. получение EntryID

1) Открыть outlook.
2) Встать на письмо.
3) 3апустить getOulookEntryID.vbs. EntryID будет помещен в буфер обмена и копия письма будет сохранена в папку c:\temp\.
4) Вставить EntryID в текст (Ctrl-V), где вы хотите сохранить «ссылку», например в MS Word.

Пример EntryID:
00000000AF0F0E71CF4D804B953CAD71F7D0FE10070091A9B565E96948409FF4B9D65B56D61D000000F18F4B00002CD50EEAE420FF448C4569721C1077FD005A3D14861A0000


II. переход по EntryID

1) Скопировать EntryID в буфер обмена.
2) Запустить go_OutlookEntryID.vbs.
3) Вставить его в окно ввода.
4) Нажать Ок. Будет произведен сначала поиск письма в Outlook, а если не найдется, то в папке c:\temp\

'getOulookEntryID.vbs
set oApp = CreateObject("Outlook.Application")
Set oExp = oApp.ActiveExplorer  
Set oSel = oExp.Selection       
 
'находим текущее письмо
For i = 1 To oSel.Count         
  Set oItem = oSel.Item(i) 
' Subj = oItem.Subject  
  id=oItem.EntryID
  exit for	
Next 

' копируем EntryID в буфер обмена
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo " & id  & "| clip", 0, TRUE
MsgBox "Copied to clipboard:" & ID 

' сохраняем на диск для случая, если EntryID изменился в результате переноса письма в другую папку
oItem.SaveAs "c:\temp\" & id & ".msg", 2

'go_OutlookEntryID.vbs
set App = CreateObject("Outlook.Application")
set NS = App.GetNamespace("MAPI")
NS.Logon

if WScript.Arguments.count=0 then
	id = InputBox("Enter outlook EntryID") ' получить от пользователя
else
	id = WScript.Arguments.Item(0) ' получить из командной строки
end if


id = replace(id,chr(10),"") ' убираем возможные артефакты буфера обмена
id = replace(id,chr(13),"")
id = trim(id)


On Error resume next
set Msg = NS.GetItemFromID(id)
On Error GoTo 0

if isEmpty(Msg) Then 
  ' если письмо было перемещено, то его EntryID изменился, пытаемся найти его на диске
  msgBox "Open from disk"
  Set WshShell = WScript.CreateObject("WScript.Shell")
  WshShell.Run "c:\temp\" & id & ".msg", 0, TRUE
else
  ' окрываем из Inbox
  Msg.Display
end if

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

С помощью нехитрых манипуляций можно сделать запуск скриптов по комбинации клавиш. Ниже приведен пример скрипта AutoHotKey, в котором комбинация Control-Alt-C копирует в буфер, а Control-Alt-G производит переход по EntryID содержащемся в буфере.

^!c::
Run, "с:\getOulookEntryID.vbs"
return

^!g::
Run, "с:\go_OutlookEntryID.vbs" %clipboard%
return