2016-09-01 73 views
0

我試圖做一個Windows窗體應用程序,可以「隱藏」在任務欄(如WiFi等),配備了一個計時器,並且每10秒掃描一次我在Outlook中的電子郵件收件箱。從Outlook使用C提取/掃描電子郵件#

第一部分工作正常,但我無法讓掃描工作。起初,我只是想提取電子郵件主題的名稱,並將它們放到一個文本文件中,只是爲了測試代碼。但最後,我想掃描一個特定的收件箱(我有幾個關於我的前景,如5或6,不同的郵件地址相關聯,我找不到任何東西在互聯網上瞄準其中一個),並使彈出窗口或某些特定電子郵件收到時。

無論如何,這是我的代碼至今:

public static bool isRunning = false; 

    public Form1() 
    { 
     InitializeComponent(); 

     System.Timers.Timer timer = new System.Timers.Timer(10000); 
     timer.Elapsed += OnTimedEvent; 
     timer.Enabled = true; 
    } 


    private void Hide_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     notifyIcon1.Visible = true; 
    } 

    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) 
    { 
     this.Show(); 
     notifyIcon1.Visible = false; 
    } 

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Outlook.Application app = null; 
     Outlook.MAPIFolder inbox = null; 
     Outlook._NameSpace ns = null; 

     if (Process.GetProcessesByName("OUTLOOK").Count() > 0) 
     { 
      try 
      { 
       app = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application; 
       inbox = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
       ns = app.GetNamespace("MAPI"); 
       List<Outlook.MailItem> ReceivedEmail = new List<Outlook.MailItem>(); 
       List<string> titles = new List<string>(); 

       foreach (Outlook.MailItem mail in inbox.Items) 
       { 
        ReceivedEmail.Add(mail); 
       } 

       foreach (Outlook.MailItem mail in ReceivedEmail) 
       { 
        titles.Add(mail.Subject.ToString()); 
       } 

       File.WriteAllLines("C://Users/A222946/Desktop/allMails.txt", titles); 

      } 
      catch (System.Runtime.InteropServices.COMException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Please, start outlook.."); 
     } 

    } 
} 

當我運行此我發現該錯誤是:

Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)

我試着用和沒有管理員權限,同樣的錯誤。

更新

所以一些變化之後,現在看起來是這樣的:

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Outlook.Application app = new Outlook.Application(); 
     Outlook.MAPIFolder inbox = null; 
     Outlook._NameSpace ns = null; 
     Outlook.Items items = null; 

     if (Process.GetProcessesByName("OUTLOOK").Count() > 0) 
     { 
      try 
      { 
       app = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application; 
       ns = app.GetNamespace("MAPI"); 
       inbox = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
       items = inbox.Items; 
       List<Outlook.MailItem> ReceivedEmail = new List<Outlook.MailItem>(); 
       List<string> titles = new List<string>(); 

       foreach (Object obj in items) 
       { 
        if (obj is Outlook.MailItem) 
        { 
         ReceivedEmail.Add((Outlook.MailItem)obj); 
        } 
       } 

       foreach (Outlook.MailItem mail in ReceivedEmail) 
       { 
        titles.Add(mail.Subject.ToString()); 
       } 

       File.WriteAllLines("C://Users/A222946/Desktop/allMails.txt", titles); 

      } 
      catch (COMException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Please, start outlook.."); 
     } 

    } 

但我仍然有這樣的錯誤:

object reference not set to an instance of an object

而且,你有什麼想法如何我可以定位一個特定的郵箱?例如:「[email protected]

+0

好的,我重新啓動Visual Studio沒有管理員權限,我不會再遇到這個錯誤。但是我得到了「對象引用未設置爲對象的實例」。 – RomainG

+0

哪個對象獲得空引用? – aLoveForCoffee

+0

它是收件箱。因爲它取決於剛剛啓動的「ns」。我改變了他們的立場,並且處理了這個錯誤。 現在我得到這個,當它進入frort froeach: 無法將類型'System .__ ComObject'的COM對象轉換爲接口類型'Microsoft.Office.Interop.Outlook.MailItem'。此操作失敗,因爲IIC「{00063034-0000-0000-C000-000000000046}」接口的COM組件上的QueryInterface調用失敗,原因是出現以下錯誤:沒有支持此接口(異常來自HRESULT:0x80004002(E_NOINTERFACE)) – RomainG

回答

0

我認爲COM組件不可訪問。某些Windows組件(如MS Office)使用COM組件。您需要使用STAThreadAttribute。

[STAThread] 
static void Main(string[] args) 
{ 
    // etc.. 
} 

我認爲這應該解決這個問題。

0

首先,這確實需要是Outlook COM插件(在Outlook運行時運行),而不是檢測Outlook何時運行的單獨的exe。

這就是說,你正在使用Namespace.GetDefaultFolder。如果商店已在配置文件中打開,則需要使用的是Store.GetDefaultFolder(其中StoreNamespace.Stores集合中檢索)。或者如果商店尚未在配置文件中打開,則爲Namespace.CreateRecipient/Namespace.GetSharedDefaultFolder

相關問題