MailItem.Move между папками Hotmail не работает в Outlook 2013 с поставщиком Hotmail EAS?

При использовании объектной модели Microsoft Outlook 2013 (MailItem.Move) для перемещения сообщения программно из папки "Входящие" hotmail в папку в том же магазине Hotmail/Outlook.com этот метод не работает с сообщением об ошибке:

Sorry, ActiveSync doesn't support what you're trying to do

Однако вручную перетаскивание того же сообщения в ту же самую папку работает нормально!

Я знаю, что - по замыслу - поставщик EAS для Outlook не может перемещать почтовые элементы извне (например, из хранилища .PST) в папку Hotmail, так как это нарушает ограничение «без импорта» в Hotmail.

Но это конкретное поведение здесь, имхо, нельзя объяснить таким образом, поскольку в этом случае он также не должен поддерживать случай ручного перетаскивания! Это также не имеет ничего общего с импортом чего-либо в Hotmail, поскольку элемент перемещается исключительно между папками в одном магазине Hotmail.

Вот мне и интересно: это так задумано или это баг? И, возможно, есть обходной путь?

Случай быстрого воспроизведения:

(предполагается, что OutlookSpy установлен, но это также должно быть довольно легко смоделировать с помощью базовой надстройки VSTO: в)

добавить учетную запись hotmail/outlook.com в свой профиль Outlook

создать дочернюю папку в почтовом ящике hotmail/outlook.com

позиция в почтовом элементе в папке «Входящие» hotmail/outlook.com

нажмите на вкладку ленты OutlookSpy

нажмите кнопку «Элемент» на ленте OutlookSpy.

нажмите на вкладку Script в диалоговом окне MailItem

введите следующий скрипт и нажмите «Выполнить»:

set inbox = MailItem.Parent    
set childfolder = inbox.Folders.item(1)
MailItem.Move childFolder

примечание: это наблюдалось с MS Outlook 2013, v15.0.4693.1001 (32-разрядная версия)


person wolkenjager    schedule 18.03.2015    source источник


Ответы (1)


Если перемещение не поддерживается, Outlook не перемещает сообщения — оно создает сообщение в целевой папке, копирует все свойства, а затем удаляет оригинал. Попробуйте что-то вроде следующего:

set inbox = MailItem.Parent    
set childfolder = inbox.Folders.item(1)
set NewMessage = MailItem.Copy
NewMessage.Move childFolder
'MailItem.Delete

Или вы можете попробовать использовать Redemption и его RDOMail.CopyTo (он может принимать либо другой объект RDOMail, либо RDOFolder в качестве аргумента):

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set OldMsg = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
  set childfolder = Session.GetDefaultFolder(olFolderInbox).Folders.item(1)
  debug.print childfolder.name
  set newMsg = childfolder.Items.Add
  newMsg.Sent = OldMsg.Sent 'it is not copied
  OldMsg.CopyTo(newMsg)
  newMsg.Save
  OldMsg.Delete
person Dmitry Streblechenko    schedule 18.03.2015
comment
Вы можете попробовать использовать Redemption для этого — см. ответ об обновлении выше. - person Dmitry Streblechenko; 18.03.2015
comment
Привет, Дмитрий, Redemption делает это внутренне, вызывая API-интерфейс Extended MAPI, верно? Я знаком с использованием расширенного MAPI из C++ и уже активно использую его для операций только для чтения в Outlook. Но для фактического перемещения электронной почты я надеялся обеспечить максимальную безопасность, используя только документированную объектную модель Outlook. Или я тут параноик? - person wolkenjager; 18.03.2015
comment
Да, Redemption использует расширенный MAPI. - person Dmitry Streblechenko; 18.03.2015
comment
Я отмечу это как ответ на обходной путь. Все еще надеюсь, что кто-то может пролить свет на то, почему сам метод MailItem.Move не будет работать с Hotmail EAS. - person wolkenjager; 21.03.2015
comment
Поскольку поставщик хранилища возвращает ошибку при вызове IMAPIFolder::CopyMessages(..., MESSAGE_MOVE). - person Dmitry Streblechenko; 21.03.2015