5

我正在开发一个 Outlook 加载项,最近为了熟悉而改用 C#(我本质上是一个 Java 人)。此时,我只是尝试遍历邮件文件夹并将每条消息的主题打印到控制台,主要是为了确保到目前为止一切正常。但是,每当我运行它时,都会收到以下错误:

无法完成操作。一个或多个参数值无效。

异常文本:

System.ArgumentException:无法完成操作。一个或多个参数值无效。在 Microsoft.Office.Interop.Outlook.NameSpaceClass.GetFolderFromID(String EntryIDFolder, Object EntryIDStore) 在 OutlookAddIn2.ThisAddIn.ThisAddIn_Startup(Object sender, 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 executionPhases) 在 Microsoft.VisualStudio.Tools.Office.Runtime。

加载程序集:

我对此感到有些困惑,因为这是微软在 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
    }
}
4

4 回答 4

1

托盘这个:

 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;
        }    
于 2012-08-08T19:49:57.277 回答
0

正如@SilverNinja 指出的那样,尚不清楚您是否在调试器中单步执行了代码。确保 StoreID 和 EntryID 有效很重要。

还有几种可能:

您的 Outlook PST 略有损坏。试试scanPST,看看是否有帮助。

此外,您会认为 pickFolder 枚举足够聪明,可以跳过这些,但是除了文件夹之外,您在文件夹树的顶层还有其他项目吗?实际上,我在枚举联系人和在我的联系人文件夹中有非联系人项目时遇到了这个问题。

于 2012-11-28T19:14:34.857 回答
0

您应该调试或添加跟踪语句以查看 和 的pickFolder.EntryIDpickFolder.StoreID。没有有效的EntryID否则StoreID会抛出这个错误。

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

如果用户单击取消按钮,您应该检查是否pickFolder为 null 。

此外,如果您让用户选择一个文件夹,则无需再次选择该文件夹GetFolderFromID- 您已经有了对它的引用。

于 2012-07-10T15:36:33.127 回答
0

你可以试试这个,当然,如果你想要收件箱文件夹:

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

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

Outlook.Folder folder = app.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder;
于 2012-07-10T15:36:50.093 回答