我正在尝试制作一个可以“隐藏”在任务栏中的Windows窗体应用程序(如WiFi等),配备计时器,并且每10秒扫描一次Outlook中的电子邮件收件箱。
第一部分工作正常,但我无法让扫描工作。起初我只想提取电子邮件主题的名称并将它们放入文本文件中,只是为了测试代码。但最后我想扫描一个特定的收件箱(我有几个在我的展望,如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..");
}
}
}
我在运行时发现的错误如下:
操作不可用(来自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..");
}
}
但我仍然有这个错误:
对象引用未设置为对象的实例
另外,你知道我如何定位一个特定的邮箱吗?示例:“abcdefg@blabla.com”
答案 0 :(得分:0)
我认为COM组件无法访问。某些Windows组件(如MS Office)使用COM组件。您需要使用STAThreadAttribute。
[STAThread]
static void Main(string[] args)
{
// etc..
}
我认为这应该解决问题。
答案 1 :(得分:0)
首先,这确实需要是Outlook COM插件(在Outlook运行时运行),而不是检测Outlook运行时的单独exe。
话虽如此,您正在使用Namespace.GetDefaultFolder
。如果商店已在个人资料中打开,则您需要使用的是Store.GetDefaultFolder
(从Store
集合中检索Namespace.Stores
)。如果商店尚未在个人资料中打开,请Namespace.CreateRecipient
/ Namespace.GetSharedDefaultFolder
。