我正在编写一个监控特定交换邮箱的简单控制台应用程序,当收到符合特定条件的电子邮件时,该应用程序将下载XML文件附件并存档该电子邮件。
我已经连接到EWS了,并且已经能够遍历任何电子邮件,但是我在创建一个可以用来访问附件的EmailMessage对象时遇到了困难。
在下面的示例代码中,EmailMessage message = EmailMessage.Bind(...)
行执行时没有错误,但是没有返回有效消息,所以当我访问和属性或方法时,我收到一个错误:'对象引用未设置为实例对象'。
我是C#的新手,更不用说EWS,所以我很难知道从哪里开始...
代码段:
public static void FindItems()
{
try
{
ItemView view = new ItemView(10);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
findResults = service.FindItems(
WellKnownFolderName.Inbox,
new SearchFilter.SearchFilterCollection(
LogicalOperator.Or,
new SearchFilter.ContainsSubstring(ItemSchema.Subject, "Sales Enquiry")),
view);
log2.LogInfo("Total number of items found: " + findResults.TotalCount.ToString());
foreach (Item item in findResults)
{
log2.LogInfo(item.Id);
EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments));
Console.WriteLine(message.Subject.ToString());
if (message.HasAttachments && message.Attachments[0] is FileAttachment)
{
FileAttachment fileAttachment = message.Attachments[0] as FileAttachment;
fileAttachment.Load("C:\\temp\\" + fileAttachment.Name);
fileAttachment.Load();
Console.WriteLine("FileName: " + fileAttachment.FileName);
}
}
}
catch (Exception ex)
{
log2.LogError(ex.InnerException);
}
}
我访问附件的代码是直接来自MSDN,所以我希望它周围有任何想法?
答案 0 :(得分:13)
我担心我重新审视这个问题并设法治愈它。不幸的是,我当时太紧迫了回到这里并记录解决方案。时间过去了,我对变化的记忆已经消失了,但据我记忆,这是一个改变:
EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.Attachments));
这里的关键区别是我们已将BasePropertySet.FirstClassProperties
指定为PropertySet的第一个参数,而不是我们原来拥有的BasePropertySet.IdOnly
。
我的原始代码是从网上的一个例子中解脱出来的,这正是我想要实现的,所以要么这个例子不太正确,要么我错误地转录它或者误解了问题的某些方面。
答案 1 :(得分:0)
foreach(EmailMessage message in findResults)
{
message.Load();
Console.WriteLine(message.Subject.ToString());
if (message.HasAttachments && message.Attachments[0] is FileAttachment)
{
FileAttachment fileAttachment = message.Attachments[0] as FileAttachment;
fileAttachment.Load("C:\\temp\\" + fileAttachment.Name);
fileAttachment.Load();
Console.WriteLine("FileName: " + fileAttachment.FileName);
}
}