2011-12-22 101 views
1

我希望有人能帮助我。让我先说我是一个非常业余的程序员。C#SyncObject与Outlook Interop

我在Outlook中有一个IMAP电子邮件帐户。我希望在该帐户中使用一个电子邮件文件夹,并确保Outlook中该文件夹中的所有邮件都与编程的IMAP电子邮件服务器上的邮件同步。我创建了下面的代码,但我有以下问题/问题:

  1. SyncObject是我应该用来同步此outlook文件夹与imap服务器的正确机制?
  2. 如果我运行它10次,它将运行没有错误2或3次,但然后它会在此行错误:
    sync = app.Session.SyncObjects [folder];
    ,出现以下错误:

    "System.Runtime.InteropServices.COMException (0x80020005): Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))\r\n at Microsoft.Office.Interop.Outlook.SyncObjects.get_Item(Object Index)\r\n at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in C:\Users\DKS\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 38"

    关于此错误的任何想法?

  3. 当我运行它时,无论它是否成功运行,它都会让outlook.exe进程在我的机器上运行。如何正确关闭interop?

    private void button1_Click(object sender, EventArgs e) 
    { 
        Microsoft.Office.Interop.Outlook.Application app = null; 
        Microsoft.Office.Interop.Outlook._NameSpace ns = null; 
        Microsoft.Office.Interop.Outlook.MAPIFolder folder = null; 
        Microsoft.Office.Interop.Outlook.SyncObject sync = null; 
    
        try 
        { 
         app = new Microsoft.Office.Interop.Outlook.Application(); 
         ns = app.GetNamespace("MAPI"); 
         folder = ns.Folders["yahoo_imap_mail"].Folders["Trash"]; 
    
         sync = app.Session.SyncObjects[folder]; 
         sync.Start(); 
        } 
        catch (System.Runtime.InteropServices.COMException ex) 
        { 
         MessageBox.Show(ex.ToString()); 
         Console.WriteLine(ex.ToString()); 
        } 
        finally 
        { 
         ns = null; 
         app = null; 
         folder = null; 
         sync = null; 
        } 
    
        MessageBox.Show("Complete"); 
    } 
    

回答

3

优于从来不迟到 - 不过。看看你的代码,它不匹配代码我见过的app.Session.SyncObjects [x]的参数,其中x是INTEGER而不是文件夹。我发现的工作代码类似于

for (Int32 i = 0; i < app.Session.SyncObjects.Count; i++) 
{ 
    _syncObj = app.Session.SyncObjects[1]; 
    _syncObj.SyncEnd +=_syncObj_SyncEnd; 
} 

_syncObj.Start(); 

最重要的是,您的应用程序不告诉Outlook关闭。那为什么呢?你让它打开它。你也没有错误陷阱 - 所以无论什么原因,如果找不到文件夹?出于某种原因无法连接到Outlook会怎么样?如果你希望展望结束,你应该告诉它。

With app.Quit();

+0

我看到_syncObj.Start()将同步到文件夹,但有没有办法确定同步作业是否完成? – ajivani 2016-02-29 22:20:00

+1

是的,你看到在同步代码分配..该函数运行完成 – BugFinder 2016-02-29 22:21:03