7

我正在编写一个简单的控制台应用程序来监控特定的交换邮箱,当收到满足特定条件的电子邮件时,该应用程序将下载一个 XML 文件附件,并将电子邮件存档。

我已经连接到 EWS OK,并且已经能够循环浏览任何电子邮件,但是在创建一个可以用来访问附件的 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,所以我希望它在那里...有什么想法吗?

4

2 回答 2

13

恐怕我重新审视了这个问题并设法治愈了它。不幸的是,我当时压力太大,无法回到这里记录解决方案。时间过去了,我对我所做的更改的记忆已经消失,但据我所知,这是一行更改:

EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.Attachments));

这里的关键区别在于我们指定BasePropertySet.FirstClassProperties了 PropertySet 的第一个参数,而不是BasePropertySet.IdOnly我们原来的那个。

我的原始代码是从一个在线示例中提取的,该示例正是我想要实现的,所以要么该示例不太正确,要么我抄写错误或误解了问题的某些方面。

于 2010-07-06T15:35:02.393 回答
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);
    }
}
于 2017-02-21T12:47:19.433 回答