C # SyncObject с Outlook Interop - PullRequest
       14

C # SyncObject с Outlook Interop

1 голос
/ 22 декабря 2011

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

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

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

    "System.Runtime.InteropServices.COMException (0x80020005): Несоответствие типов. (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)) \ r \ n в Microsoft.Office.Interop.Outlook.SyncObjects.get_Item (Object Index) \ r \ n в WindowsFormsApplication1.Form1.button1_Click (Отправитель объекта, EventArgs e) в C: \ Users \ DKS \ Documents \ visual studio 2010 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs: line38 "

    Есть какие-нибудь идеи по поводу этой ошибки?

  3. Когда я ее запускаю, независимо от того, работает она успешно или нет, она всегда оставляет процедуру outlook.exe.ss работает на моей машине.Как правильно закрыть взаимодействие?

    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");
    }
    

1 Ответ

3 голосов
/ 21 февраля 2012

Лучше поздно, чем никогда - но.Глядя на ваш код, он не соответствует коду, который я видел, где параметр для 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 по какой-то причине?Если вы хотите, чтобы outlook заканчивался, вы должны сообщить об этом.

С app.Quit ();

...