2011-12-22 5 views
1

Я надеюсь, что кто-то может мне помочь. Позвольте мне сначала заявить, что я очень любительский программист.C# SyncObject с Outlook Interop

У меня есть учетная запись электронной почты IMAP в Outlook. Я хочу взять одну папку электронной почты в этой учетной записи и гарантировать, что все сообщения в этой папке в Outlook будут программным образом синхронизироваться с тем, что на сервере электронной почты IMAP. Я создал код ниже, но у меня возникают следующие вопросы/вопросы:

  1. Является ли SyncObject правильным механизмом, который я должен использовать для синхронизации этой папки Outlook с сервером imap?
  2. Если я запустил его 10 раз, он будет проходить без ошибок 2 или 3 раза, но затем он выйдет из строя в этой строке:
    sync = app.Session.SyncObjects [папка];
    со следующей ошибкой:

    "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? Если вы хотите, чтобы перспектива закончилась, вы должны сказать об этом.

С app.Quit();

+0

Я вижу, что _syncObj.Start() будет синхронизироваться с папкой, но есть ли способ узнать, завершено ли задание синхронизации? – ajivani

+1

Да, вы видите в присваивании кода синхронизации. Эта функция выполняется по завершении – BugFinder

Смежные вопросы