【问题标题】:Move outlook item to archive将 Outlook 项目移至存档
【发布时间】:2015-12-28 22:10:06
【问题描述】:

我有一个 C# 程序(实际上它只是一个被 NUnit 使用的 C# 库),我希望根据这篇文章稍微修改它:How to Programmatically move items in outlook。我目前面临一个文件夹,其中包含大约 350kb 左右的 3500 条消息,并且正在永远移动到我的存档,以便我可以再次发送和接收电子邮件(因为我的收件箱目前是 500Mb 中的 1.5Gb ......哈哈)但对于我的生活,我无法弄清楚如何获取我的存档文件夹。因为我在工作,所以我有点多任务处理,所以我可以随时编辑。因此,如果您有任何现成的代码可以找到存档文件夹,那就太好了。谢谢

编辑

可以表明我确实有一些工作正在进行中(基于负面反馈)这是我现在拥有的代码(因为是的,我知道我有一个给我的 codez)

这是我的 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 秒。那好吧。总比没有好。

【问题讨论】:

    标签: c# outlook outlook-2013


    【解决方案1】:

    我想通了。这也没有我想象的那么难,所以我会分享我的内容,以防其他人遇到这个问题。在我的程序中,我做了两件事。一种是将_basefolder 设置为我的默认电子邮件地址的文件夹。其次是将_mapi 设置为Outlook.GetNamespace("MAPI")。这两个东西我已经在我的构造函数中了。

        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"];
        }
    

    存档就像任何其他 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);
        }
    

    UseMailItem 是一种扩展方法。看起来像这样

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

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2017-05-17
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2014-07-08
      相关资源
      最近更新 更多