Я использую 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 не может выполнять такую работу без доступа к локальному администратору. Если кто-нибудь знает, как это сделать как автономное консольное приложение без местного администратора, я бы с удовольствием услышал. Большое спасибо!
'E_ABORT' может просто означать, что Outlook занят в данный момент. Вы можете попробовать повторить попытку с задержкой пару раз и посмотреть, поможет ли это. Возможно, ему необходимо связаться, например. ваш сервер Exchange или запустить электронную почту через антивирусный сканер или что-то в этом роде. – Luaan
Спасибо, Luaan. Я попробовал несколько трюков по времени (включая 'MailItem.GetInspector'), но ничего не помогло. Похоже, мне нужно поговорить с ИТ-парнями. Я действительно надеялся, что это сработает в значительной степени из коробки. – Aaron