2016-02-02 1 views
0

Я использую Visual Studio и Outlook 2010. Я могу подключиться к моему локальному профилю по умолчанию Outlook и перечислить сообщения в папке «Входящие», но я могу получить только свойства SentOn, Subject и EntryID. Как только я пытаюсь получить доступ к SenderName или орган (и несколько других), я получаю следующее исключение:Доступ к Outlook через C# - COMException при проверке отправителя сообщения, но не темы?

System.Runtime.InteropServices.COMException was unhandled 
    HResult=-2147467260 
    Message=Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT)) 
    Source="" 
    ErrorCode=-2147467260 
    StackTrace: 
     at Microsoft.Office.Interop.Outlook._MailItem.get_SenderName() 
     at reademail.Program.ReadMail() in h:\my documents\visual studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 54 
     at reademail.Program.Main(String[] args) in h:\my documents\visual studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 20 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

COMException настолько расплывчато, что это сводит с ума. Я искал и искал и не мог найти ничего, что помогло. Я пробовал задерживать системный поток, и я пробовал трюк MailItem.GetInspector для каждого элемента.

Я работаю в корпоративной среде, где у меня нет локальных прав администратора на моей машине, и ни один из них не будет использовать программное обеспечение. Получение локального администратора будет болью в тылу, поэтому я хотел бы быть уверенным, что это проблема перед запуском процесса.

Вот минимальный код, создающий ошибку. Я был бы очень признателен за любую помощь!

using System; 
using Outlook = Microsoft.Office.Interop.Outlook; 

namespace MinimalExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Correctly triggers my local Outlook to open, allowing me to select the desired profile 
      Outlook.Application app = new Outlook.Application(); 
      Outlook._NameSpace ns = app.GetNamespace("MAPI"); 

      //Correctly opens the Inbox and reports the correct stats 
      Outlook.MAPIFolder inboxFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
      Console.WriteLine("Folder Name: {0}", inboxFolder.Name); 
      Console.WriteLine("Num Items: {0}", inboxFolder.Items.Count.ToString()); 

      for (int counter = 1; counter <= inboxFolder.Items.Count; counter++) 
      { 
       //This cast ensures you only deal with valid MailItems and not calendar issues 
       Outlook.MailItem item = inboxFolder.Items[counter] as Outlook.MailItem; 
       if (item != null) 
       { 
        //The following works fine 
        Console.WriteLine("Item: {0}", counter.ToString()); 
        Console.WriteLine("EntryID: {0}", item.EntryID); 
        Console.WriteLine("Subject: {0}", item.Subject); 
        Console.WriteLine("Sent: {0} {1}", item.SentOn.ToLongDateString(), item.SentOn.ToLongTimeString()); 

        //Enabling any of the following two lines causes the E_ABORT COMException 
        //Console.WriteLine("Sendername: {0}", item.SenderName); 
        Console.WriteLine("Body: {0}", item.Body); 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

EDIT: То, что я в конечном итоге делает

Выполнение программы как плагин уклонился вопросы безопасности, но это далеко от идеала. Я просто не могу поверить, что .NET не может выполнять такую ​​работу без доступа к локальному администратору. Если кто-нибудь знает, как это сделать как автономное консольное приложение без местного администратора, я бы с удовольствием услышал. Большое спасибо!

+0

'E_ABORT' может просто означать, что Outlook занят в данный момент. Вы можете попробовать повторить попытку с задержкой пару раз и посмотреть, поможет ли это. Возможно, ему необходимо связаться, например. ваш сервер Exchange или запустить электронную почту через антивирусный сканер или что-то в этом роде. – Luaan

+0

Спасибо, Luaan. Я попробовал несколько трюков по времени (включая 'MailItem.GetInspector'), но ничего не помогло. Похоже, мне нужно поговорить с ИТ-парнями. Я действительно надеялся, что это сработает в значительной степени из коробки. – Aaron

ответ

1

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f0a76f44-704e-4454-b44e-c95b3f60eff5/cant-send-email?forum=vsto

Вот еще один тип проблемы с теми же исключениями.

Существует такой ответ: «... Другими словами, если вы хотите получить полный доступ к объектной модели Outlook, чтобы методы, подобные Send and SaveAs, работали беспрепятственно, это объект Outlook.Applicatiom, который вам нужен использовать «.

А вот еще один с таким же кодом ошибки:

urlDownloadToFile error 2147467260 in VB6

Я думаю, что это все о ваших привилегий учетной записи.

+0

Во-первых, спасибо за ответ! Это просто кажется случайным. Почему я могу видеть тему, но не тело, например? Это правда, что ни одно автономное приложение .NET не может выполнять такую ​​работу без полных прав локального администратора? Это звучит безумно.Я попытаюсь использовать его как плагин и посмотреть, не помешает ли эта проблема. – Aaron

+0

Привет, https://msdn.microsoft.com/en-us/library/office/fp161047.aspx на этой странице, Microsoft описывает что-то вроде модели Permission Model для надстроек Outlook, как вы использовали. В основном эта модель предоставляет разные типы разрешений для разных пользователей. Основное разрешение ограничено (я думаю, у вас есть этот тип разрешения). С ограниченным разрешением вы можете получить доступ к теме письма или отправителю, но вы не можете получить доступ к телу почты. Вы можете найти много информации об этих разрешениях на веб-сайте. –

+0

Спасибо, Фират. Это очень полезно сейчас, когда я переместил программное обеспечение в фактическую надстройку. Раньше я просто пытался написать небольшое консольное приложение, чтобы войти и выйти, но похоже, что я должен пройти весь путь по кроличьей дыре с этим. Пока, во всяком случае, я могу получить доступ к необходимой мне информации. Конечно, было бы хорошо, если бы сообщение об ошибке, которое я получил, фактически сказал что-то о разрешениях, а не только об общем E_ABORT !! – Aaron

0

Вы имеете в виду, что вы столкнулись с запросом на безопасность? Где выполняется ваш код?

Вам необходимо либо установить обновленное антивирусное приложение, либо использовать Extended MAPI (C++ или Delphi) или Redemption (он обертывает Extended MAPI), чтобы обойти подсказки безопасности. См. http://www.outlookcode.com/article.aspx?id=52 для получения дополнительной информации.

+0

Спасибо, Дмитрий. Нет подсказок безопасности. Я в Visual Studio, написав консольное приложение, и я просто запускаю этот инструмент. Даже если я его создам (Release) и запустим исполняемый файл, я все равно получаю E_ABORT COMException. Я не могу установить Redemption из-за корпоративной среды разработки здесь. Это разочаровывает, потому что я предполагал, что это в .NET будет очень просто. Интересно, если мне повезет с Python или что-то в этом роде! – Aaron