将Outlook项目移动到存档

时间:2015-12-28 13:21:15

标签: c# outlook outlook-2013

我有一个C#程序(实际上它只是一个由NUnit使用的C#库),我希望稍微修改一下这篇文章:How to Programmatically move items in outlook。我目前面临的文件夹大约有3500条消息,大约350kb,并且正在转移到我的存档,因此我可以再次发送和接收电子邮件(因为我的收件箱目前处于500Gb的1.5Gb ...大声笑)但对于我的生活,我无法弄清楚如何获取我的存档文件夹。因为我在工作,所以我有点多任务处理,所以我可以随时编辑。因此,如果您有任何可用的代码,那么找到可能很棒的存档文件夹。谢谢

修改

好的表明我确实有一些工作正在进行中(根据负面反馈)这里是我现在的代码(因为是的,我知道我有一个给我代码)

这是我的NUnit测试用例,它查看文件夹并提供具体信息

    [Test]
    public void CheckMessages()
    {
        List<EmailMessage> messages = new List<EmailMessage>();
        using (var target = new EmailMessageProvider())
        {
            messages.AddRange(target.GetEmailMessages("UnexpectedErrors\\NotFindImage"));
        }

        Dictionary<int, string> asdf = new Dictionary<int, string>();

        foreach (var item in messages)
        {
            var line = item.Body.Split(new string[] { Environment.NewLine }, StringSplitOptions.None)[2];

            var revisionId = int.Parse(Regex.Match(line, @"\-*\d+").Value);
            var path = line.Substring(line.IndexOf("\\\\"));
            if (asdf.ContainsKey(revisionId))
            {
                Assert.That(path, Is.EqualTo(asdf[revisionId]));
            }
            else
            {
                asdf.Add(revisionId, path);
            }
        }

        foreach (var item in asdf.OrderBy(x => x.Key))
        {
            Console.WriteLine($"{item.Key} {item.Value}");
        }
    }

我使用相同的类来查找消息(在另一个测试中)并将其移动到该测试正在使用的子文件夹。

这是我有移动的代码

    public void MoveSurveyPrintComponentsNotFound()
    {
        var destination = _baseFolder.Folders["UnexpectedErrors"].Folders["NotFindImage"];
        foreach (var mailItem in _baseFolder.Folders["UnexpectedErrors"].Items.OfType<MailItem>())
        {
            mailItem.UseMailItem(x =>
            {
                if (x.Body.Contains("Foobar.Common.Exceptions.ImageNotFound"))
                    x.Move(destination);
            });
        }
    }

编辑2

看起来我可能刚刚得到它。我发现MAPI Namspace其中一个子文件夹是Archives。我将尝试更改一些变量并查看它是否移动。问题是只检查一个文件夹需要31秒。那好吧。比从来没有好过。

1 个答案:

答案 0 :(得分:2)

我明白了。这并不像我想象的那么难,所以我会分享我刚刚遇到别人有这个问题。在我的计划中,我做了两件事。一种是将_basefolder设置为我的默认电子邮件地址的文件夹。第二个是将_mapi设置为Outlook.GetNamespace("MAPI")。我已经在构造函数中使用了那两个thinsg。

    private readonly OutlookApplication _outlook;
    private readonly NameSpace _mapi;
    private MAPIFolder _baseFolder;

    public EmailMessageProvider()
    {
        _outlook = new OutlookApplication();
        _mapi = _outlook.GetNamespace("MAPI");
        _baseFolder = _mapi.Folders["robert@defaultEmail.com"];
    }

Archives就像任何其他MAPIFolder一样工作,所以这只是获取所述文件夹的问题。对我来说,它在_mapi.Folders["Archive"]。我认为这是相当标准的,所以如果你复制并粘贴它应该工作得很好。

所以现在列出我想要通过的所有电子邮件并适当地移动。

    public void MoveSpecificEmailsToArchives()
    {
        var destination = _mapi.Folders["Archives"];
        foreach (var mailItem in _baseFolder.Folders["Unexpected Error"].Items.OfType<MailItem>())
        {
            mailItem.UseMailItem(x =>
            {
                if (x.Body.Contains("offensiveProgram.exe ERROR "))
                    x.Move(destination);
            });
        }
        Release(destination);
    }
{p> UseMailItem是一种扩展方法。看起来像这样

    public static void UseMailItem(this MailItem item, Action<MailItem> mailItemAction)
    {
        mailItemAction(item);
        Marshal.ReleaseComObject(item);
    }