Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C从Outlook提取/扫描电子邮件#_C#_Visual Studio_Email_Outlook - Fatal编程技术网

C# 使用C从Outlook提取/扫描电子邮件#

C# 使用C从Outlook提取/扫描电子邮件#,c#,visual-studio,email,outlook,C#,Visual Studio,Email,Outlook,我正在尝试制作一个windows窗体应用程序,它可以“隐藏”在任务栏中(如WiFi等),并配备计时器,每隔10秒它就会扫描Outlook中我的电子邮件收件箱 第一部分很好,但我无法进行扫描。首先,我只想提取电子邮件主题的名称并将其放入文本文件中,以测试代码。但最后,我想扫描一个特定的收件箱(我的outlook上有几个,比如5或6,有不同的邮件地址,我在互联网上找不到任何东西指向其中一个),并在收到特定的电子邮件时弹出一个或一些东西 无论如何,这是我到目前为止的代码: public sta

我正在尝试制作一个windows窗体应用程序,它可以“隐藏”在任务栏中(如WiFi等),并配备计时器,每隔10秒它就会扫描Outlook中我的电子邮件收件箱

第一部分很好,但我无法进行扫描。首先,我只想提取电子邮件主题的名称并将其放入文本文件中,以测试代码。但最后,我想扫描一个特定的收件箱(我的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..");
        }

    }
}
public static bool isRunning=false;
公共表格1()
{
初始化组件();
System.Timers.Timer Timer=新的System.Timers.Timer(10000);
timer.appeased+=OnTimedEvent;
timer.Enabled=true;
}
私有void隐藏\u单击(对象发送方,事件参数e)
{
this.Hide();
notifyIcon1.Visible=true;
}
私有void notifyicon1u鼠标单击(对象发送方,MouseEventArgs e)
{
this.Show();
notifyIcon1.Visible=false;
}
私有静态void OnTimedEvent(对象源,ElapsedEventArgs e)
{
Outlook.Application app=null;
Outlook.MAPIFolder收件箱=空;
Outlook.\u命名空间ns=null;
if(Process.getProcessByName(“OUTLOOK”).Count()>0)
{
尝试
{
app=Marshal.GetActiveObject(“Outlook.Application”)作为Outlook.Application;
收件箱=ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
ns=app.GetNamespace(“MAPI”);
List ReceivedEmail=新列表();
列表标题=新列表();
foreach(收件箱中的Outlook.MailItem邮件.Items)
{
接收电子邮件。添加(邮件);
}
foreach(接收电子邮件中的Outlook.MailItem邮件)
{
titles.Add(mail.Subject.ToString());
}
writeAllines(“C://Users/A222946/Desktop/allMails.txt”,标题);
}
捕获(System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show(例如Message);
}
catch(System.Exception-ex)
{
MessageBox.Show(例如Message);
}
}
其他的
{
MessageBox.Show(“请启动outlook…”);
}
}
}
运行此命令时发现的错误如下:

操作不可用(HRESULT的异常:0x800401E3(MK_E_不可用)

我尝试使用和不使用管理员权限,同样的错误

更新

因此,经过一些更改后,现在看起来是这样的:

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

    }
time-devent上的私有静态void(对象源,ElapsedEventArgs e)
{
Outlook.Application app=新建Outlook.Application();
Outlook.MAPIFolder收件箱=空;
Outlook.\u命名空间ns=null;
Outlook.Items=null;
if(Process.getProcessByName(“OUTLOOK”).Count()>0)
{
尝试
{
app=Marshal.GetActiveObject(“Outlook.Application”)作为Outlook.Application;
ns=app.GetNamespace(“MAPI”);
收件箱=ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
项目=收件箱。项目;
List ReceivedEmail=新列表();
列表标题=新列表();
foreach(项目中的对象对象对象)
{
if(obj是Outlook.MailItem)
{
ReceivedEmail.Add((Outlook.mailtime)obj);
} 
}
foreach(接收电子邮件中的Outlook.MailItem邮件)
{
titles.Add(mail.Subject.ToString());
}
writeAllines(“C://Users/A222946/Desktop/allMails.txt”,标题);
}
捕获(COMException ex)
{
MessageBox.Show(例如Message);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
其他的
{
MessageBox.Show(“请启动outlook…”);
}
}
但我仍然有一个错误:

对象引用未设置为对象的实例


另外,您知道我如何针对一个特定的邮箱吗?例如:abcdefg@blabla.com“

我认为COM组件不可访问。某些Windows组件(如MS Office)使用COM组件。您需要使用STAThreadAttribute

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

我认为这应该可以解决问题。

我认为COM组件不可访问。COM组件由一些Windows组件(如MS Office)使用。您需要使用STAThreadAttribute

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

我认为这应该可以解决这个问题。

首先,这确实需要一个Outlook COM加载项(在Outlook运行时运行),而不是一个单独的exe来检测Outlook何时运行


也就是说,您使用的是
名称空间.GetDefaultFolder
。您需要使用的是
Store.GetDefaultFolder
(其中
Store
名称空间.Stores
集合中检索)如果存储已在配置文件中打开,或者
名称空间.CreateRecipient
/
名称空间.GetSharedDefaultFolder
如果存储尚未在配置文件中打开。

首先,这确实需要是一个Outlook COM加载项(在Outlook运行时运行),而不是一个检测Outlook运行时的单独exe

也就是说,您正在使用
名称空间.GetDefaultFolder
。您需要使用的是
存储.GetDefaultFolder
(其中
存储