我有一个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秒。那好吧。比从来没有好过。
答案 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);
}