Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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# 将邮件的状态更改为在outlook中读取_C#_Outlook_Office Interop_Outlook 2010 - Fatal编程技术网

C# 将邮件的状态更改为在outlook中读取

C# 将邮件的状态更改为在outlook中读取,c#,outlook,office-interop,outlook-2010,C#,Outlook,Office Interop,Outlook 2010,我已经编写了一个代码,可以读取Outlook 2010中所有未读的邮件,并将它们写入一个文件中。之后,我想将邮件的状态更改为在outlook中读取 我该怎么做 我正在使用Interop访问邮件 Microsoft.Office.Interop.Outlook.Application app = null; Microsoft.Office.Interop.Outlook._NameSpace ns = null; Microsoft.Office.

我已经编写了一个代码,可以读取Outlook 2010中所有未读的邮件,并将它们写入一个文件中。之后,我想将邮件的状态更改为在outlook中读取

我该怎么做

我正在使用Interop访问邮件

        Microsoft.Office.Interop.Outlook.Application app = null;
        Microsoft.Office.Interop.Outlook._NameSpace ns = null;
        Microsoft.Office.Interop.Outlook.MailItem item = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
        Microsoft.Office.Interop.Outlook.Items unreadItems = null;

        app = new Microsoft.Office.Interop.Outlook.Application();//.CreateItem(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);

        ns = app.GetNamespace("MAPI");

        inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);

        unreadItems = inboxFolder.Items.Restrict("[Unread]=true");

以下是一些可以帮助您的链接:

OutLook.Application oApp;
OutLook._NameSpace oNS;
OutLook.MAPIFolder oFolder;
OutLook._Explorer oExp;

oApp = new OutLook.Application();
oNS = (OutLook._NameSpace)oApp.GetNamespace("MAPI");
oFolder = oNS.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderInbox);
oExp = oFolder.GetExplorer(false);
oNS.Logon(Missing.Value, Missing.Value, false, true);

OutLook.Items items = oFolder.Items;
foreach (OutLook.MailItem mail in items)
{
    if (mail.UnRead)
    {
        mail.UnRead = false;
        mail.Save();
    }
    Marshal.ReleaseCOMObject(mail);
}
Marshal.ReleaseCOMObject(items);

// Dont forget to free all other object, using Marshal.ReleaseCOMObject then close oApp
  • (适用于Outlook 2003,但仍包含非常有用的信息)
我有一个代码示例可以帮助您:

OutLook.Application oApp;
OutLook._NameSpace oNS;
OutLook.MAPIFolder oFolder;
OutLook._Explorer oExp;

oApp = new OutLook.Application();
oNS = (OutLook._NameSpace)oApp.GetNamespace("MAPI");
oFolder = oNS.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderInbox);
oExp = oFolder.GetExplorer(false);
oNS.Logon(Missing.Value, Missing.Value, false, true);

OutLook.Items items = oFolder.Items;
foreach (OutLook.MailItem mail in items)
{
    if (mail.UnRead)
    {
        mail.UnRead = false;
        mail.Save();
    }
    Marshal.ReleaseCOMObject(mail);
}
Marshal.ReleaseCOMObject(items);

// Dont forget to free all other object, using Marshal.ReleaseCOMObject then close oApp
请注意,我还没有测试它是否有效,甚至没有编译。
outlook开发人员的一般规则是,您需要释放所有com对象,否则您可能会有奇怪的行为(关闭outlook应用程序时保存弹出窗口,甚至outlook从不关闭等)

编辑:
我建议您确实使用Restrict方法只获取未读邮件,因为我上面的代码片段将在所有可能不必要且无法执行的电子邮件中循环。

将OutLook设置为false。MailItem的UnRead属性为false

我删除了标题中的标记,请参阅:这不起作用。我添加了代码Marshal.ReleaseCOMObject,但它们似乎什么都没做。在我的outlook邮件中,它仍然显示未读的邮件。即使重新启动outlook(只是为了知道是否有刷新问题)。可能尝试修改另一个属性(即
mail.Subject=mail.Subject
以强制outlook将电子邮件标记为脏邮件,这样当您调用
mail.save
时它会将其保存。这对我很有效。我的代码有点不同,因为我正在处理“无法转换COM对象”问题,但主要概念是相同的。谢谢