Только COMException в Outlook Online (без кэширования). - PullRequest
0 голосов
/ 27 февраля 2020

Пример кода, показанный ниже, иллюстрирует мою проблему, а именно, когда я запускаю Outlook в онлайн-режиме, я не могу получить большинство свойств почтового элемента, переданного обработчику OutboxItems_ItemAdd. Возвращенная ошибка:

Attachments = {System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x8004010F
   --- End of inner exception stack trace ---
   at System.Runtime...

Я НЕ получаю эту ошибку при попытке получить свойства почтового элемента в обработчике SentItems_ItemAdd. Кроме того, важно отметить, что все работает отлично, когда в режиме кэширования Outlook; проблема в обработчике «Исходящие» возникает только при запуске Outlook в режиме онлайн. Это ошибка, или я просто что-то не так делаю?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;

namespace OnlineErrorTest{
public partial class ThisAddIn{

    Outlook.Folder sentFolder;
    Outlook.Folder outboxFolder;
    Outlook.Items sentItems;
    Outlook.Items outboxItems;

    private void ThisAddIn_Startup(object sender, System.EventArgs e) {
        sentFolder = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) as Outlook.Folder;
        outboxFolder = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderOutbox) as Outlook.Folder;
        sentItems = sentFolder.Items;
        outboxItems = outboxFolder.Items;
        sentItems.ItemAdd += SentItems_ItemAdd;
        outboxItems.ItemAdd += OutboxItems_ItemAdd;
    }

    private void OutboxItems_ItemAdd(object Item) {
        Outlook.MailItem mi = Item as Outlook.MailItem;
        Outlook.Recipients r = mi.Recipients; //CAUSES EXCEPTION //System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x8004010F
    }

    private void SentItems_ItemAdd(object Item) {
        Outlook.MailItem mi = Item as Outlook.MailItem;
        Outlook.Recipients r = mi.Recipients; //WORKS FINE
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e) {
   }


    private void InternalStartup(){
        this.Startup += new System.EventHandler(ThisAddIn_Startup);
        this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
    }
}

}

1 Ответ

1 голос
/ 27 февраля 2020

Код ошибки - MAPI_E_NOT_FOUND, что означает, что элемент больше не существует - это неудивительно: к тому времени, когда ваш код получает его, Exchange Server, скорее всего, уже отправил сообщение и переместил его в папку «Отправленные».

Вы никогда не должны касаться отправляемых сообщений - даже если вам это удастся, касание элемента с помощью OOM прерывает процесс отправки. Вместо этого используйте событие Application.ItemSend - это ваш последний шанс получить доступ к элементу перед его передачей в спулер и отправкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...