我試圖做一個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]」
好的,我重新啓動Visual Studio沒有管理員權限,我不會再遇到這個錯誤。但是我得到了「對象引用未設置爲對象的實例」。 – RomainG
哪個對象獲得空引用? – aLoveForCoffee
它是收件箱。因爲它取決於剛剛啓動的「ns」。我改變了他們的立場,並且處理了這個錯誤。 現在我得到這個,當它進入frort froeach: 無法將類型'System .__ ComObject'的COM對象轉換爲接口類型'Microsoft.Office.Interop.Outlook.MailItem'。此操作失敗,因爲IIC「{00063034-0000-0000-C000-000000000046}」接口的COM組件上的QueryInterface調用失敗,原因是出現以下錯誤:沒有支持此接口(異常來自HRESULT:0x80004002(E_NOINTERFACE)) – RomainG