Доступ к почтовой папке Outlook 2010 на С#

Я работаю над надстройкой Outlook и недавно переключился на С# для ознакомления (в душе я человек Java). На данный момент я просто пытаюсь просмотреть почтовую папку и вывести тему каждого сообщения на консоль, в основном, чтобы убедиться, что пока все работает нормально. Однако всякий раз, когда я запускаю его, я получаю следующую ошибку:

Не удалось завершить операцию. Одно или несколько значений параметра недействительны.

Текст исключения:

System.ArgumentException: не удалось завершить операцию. Одно или несколько значений параметра недействительны. в Microsoft.Office.Interop.Outlook.NameSpaceClass.GetFolderFromID(String EntryIDFolder, Object EntryIDStore) в OutlookAddIn2.ThisAddIn.ThisAddIn_Startup(отправитель объекта, EventArgs e) в Microsoft.Office.Tools.AddInImpl.OnStartup() в Microsoft.Office.Tools .AddInImpl.AddInExtensionImpl.Microsoft.Office.Tools.EntryPoint.OnStartup() в Microsoft.Office.Tools.AddInBase.OnStartup() в OutlookAddIn2.ThisAddIn.FinishInitialization() в Microsoft.Office.Tools.AddInBase.Microsoft.Office.Tools .EntryPoint.FinishInitialization() в Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.ExecuteCustomization.ExecutePhase(ExecutionPhases executePhases) в Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.ExecuteCustomization.Microsoft.VisualStudio.Tools.Office.Runtime .Interop.IExecuteCustomization2.ExecuteEntryPoints()

Загруженные сборки:

Я несколько сбит с толку этим, так как это точный метод, рекомендованный Microsoft в MSDN, чтобы пользователь мог выбрать папку. Я включил свой источник, пожалуйста, дайте мне знать, если у вас есть какие-либо мысли. Спасибо, что нашли время, чтобы прочитать этот пост, и за желание помочь!

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 OutlookAddIn2
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            //Get application namespace and grab the original folder object
            Outlook.Folder pickFolder = (Outlook.Folder)Application.Session.PickFolder();

            //Outlook.Folder mrFolder = Application.Session.GetFolderFromID(pickFolder.EntryID, pickFolder.StoreID) as Outlook.Folder;

            foreach (Outlook.MailItem oMailItem in pickFolder.Items)
            {
                Console.WriteLine(oMailItem.Subject);
            }
        }

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

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

person flyingscotsman74656    schedule 10.07.2012    source источник
comment
Кроме того, извините за плохое форматирование, автопарсер делает что-то ужасное с моим кодом...   -  person flyingscotsman74656    schedule 10.07.2012
comment
Вот для чего у нас есть Роберт Харви!   -  person Charleh    schedule 10.07.2012
comment
Парень, который отформатировал твой пост :)   -  person Charleh    schedule 10.07.2012


Ответы (4)


Лоток это:

 public static Folder FOLDER_1;
 public static Folder FOLDER_2;
 public static Folder FOLDER_N;

/// <summary>
        /// Hilo que lee el archivo de datos PST del OUTLOOK
       private static void readPst()
        {
            try
            {
                Application app = new Application();
                NameSpace outlookNs = app.GetNamespace("MAPI");
                MAPIFolder mf = outlookNs.GetDefaultFolder(OlDefaultFolders.olFolderTasks);


                string names = mf.FolderPath.Split('\\')[2];



                Folder fMails = getFolder(fCarpetasPersonales.Folders, "Inbox");



                FOLDER_1= getFolder(fMails.Folders, "FOLDER_1");
                FOLDER_2= getFolder(fMails.Folders, "FOLDER_2");
                FOLDER_N= getFolder(fMails.Folders, "FOLDER_n");

//TO DO... For example:  foreach (object item in fMails.Items)



     private static Folder getFolder(Folders folders, string folder)
        {
            foreach (object item in folders)
            {
                if (item is Folder)
                {
                    Folder f = (Folder)item;
                    if (f.Name.Equals(folder))
                    {
                        return f;
                    }
                }
            }
            return null;
        }    
person RTGROUP    schedule 08.08.2012

Можете ли вы попробовать это, конечно, если вы хотите папку «Входящие»:

Outlook.Application app = new Outlook.Application();

Outlook.NameSpace ns = app.GetNamespace("MAPI");

Outlook.Folder folder = app.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
person Danilo Vulović    schedule 10.07.2012
comment
Я попробую это как вариант отладки, на самом деле я пытаюсь получить доступ к папке, которая находится на том же уровне, что и папка «Входящие» (так проще использовать). - person flyingscotsman74656; 11.07.2012

Вы должны отладить или добавить операторы трассировки, чтобы увидеть значения pickFolder.EntryID и pickFolder.StoreID. Без действительного EntryID или StoreID будет выдана эта ошибка.

Trace.TraceInformation("EntryID: {0}\tStoreID: {1}", pickFolder.EntryID, pickFolder.StoreID);

Вы должны проверить, является ли pickFolder нулевым, если пользователь нажмет кнопку отмена.

Кроме того, если вы позволяете пользователю выбирать папку, вам не нужно снова выбирать папку через GetFolderFromID — у вас уже есть ссылка на нее.

person SliverNinja - MSFT    schedule 10.07.2012
comment
Я понял, что бит двойной ссылки был избыточным, приятно знать, что я действительно был на правильном пути с этим. Я все еще новичок в этом языке и Visual Studio 2010 (привык к Netbeans/Eclipse), поэтому я действительно не знаю, как использовать операторы трассировки (привык к тому, что это делается при пошаговом выполнении кода в среде IDE). Есть ли встроенный инструмент, который обрабатывает это? Спасибо еще раз! - person flyingscotsman74656; 10.07.2012
comment
Я посмотрел в Интернете, и в одном сообщении говорилось, что это может быть проблема с символами (DLL), которые не загружаются в проект. Конечно же, в окне «Модули» в Visual Studio НИ ОДИН из необходимых символов не загружался или даже не загружался. Я получил их с Microsoft Symbol Server, а затем явно изменил язык сборки на C#. Теперь я обычно получаю диалоговое окно PickFolder, но все равно получаю ту же ошибку после выбора папки. У вас есть вопрос на форуме отладки VS, но, пожалуйста, дайте мне знать, если вы думаете о чем-то еще. Спасибо! - person flyingscotsman74656; 11.07.2012

Неясно, прошли ли вы код в отладчике, как указал @SilverNinja. Важно убедиться, что StoreID и EntryID действительны.

Есть еще несколько возможностей:

Ваш Outlook PST немного поврежден. Попробуйте scanPST и посмотрите, поможет ли это.

Кроме того, вы могли бы подумать, что перечисление pickFolder будет достаточно умным, чтобы пропустить их, но есть ли у вас другие элементы на верхнем уровне дерева папок, кроме папок? На самом деле у меня была эта проблема с перечислением контактов и наличием неконтактных элементов в моей папке контактов.

person Jahmic    schedule 28.11.2012
comment
Большое спасибо за комментарий, мне пришлось бросить проект и перейти к другим вещам, и я так и не смог в этом разобраться. Я действительно просматривал весь код, но боюсь, что мог что-то упустить при этом. Я ценю усилия и надеюсь вернуться к этому позже. Вы все потрясающие! - person flyingscotsman74656; 10.04.2013