如何使用 EWS 获取电子邮件正文、收据、发件人和抄送信息?

Posted

技术标签:

【中文标题】如何使用 EWS 获取电子邮件正文、收据、发件人和抄送信息?【英文标题】:How to get email body, receipt, sender and CC info using EWS? 【发布时间】:2011-10-03 22:19:17 【问题描述】:

谁能告诉我如何使用 Exchange Web Service API 获取电子邮件正文、收据、发件人、抄送信息?我只知道如何获取主题。

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
    service.Credentials = new NetworkCredential("user", "password", "domain");
    service.Url = new Uri("https://208.243.49.20/ews/exchange.asmx");
    ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
    FindItemsResults<Item> findResults = service.FindItems(
        WellKnownFolderName.Inbox,
        new ItemView(10));

    foreach (Item item in findResults.Items)
    
        div_email.Innerhtml += item.Subject+"<br />";
    

我的开发环境是asp.net c# Exchange-server 2010 谢谢。

【问题讨论】:

【参考方案1】:

在这里你会找到解决方案。

http://blogs.msdn.com/b/akashb/archive/2010/03/05/how-to-build-a-complex-search-using-searchfilter-and-searchfiltercollection-in-ews-managed-api-1-0.aspx


 // Send the request to search the Inbox and get the results.
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, FinalsearchFilter, view);



        // Process each item.
        if (findResults.Items.Count > 0)
        
            foreach (Item myItem in findResults.Items)
            
                if (myItem is EmailMessage)
                
                    Console.WriteLine((myItem as EmailMessage).Subject);
                
                if (myItem.ExtendedProperties.Count > 0)
                
                    // Display the extended property's name and property.
                    foreach (ExtendedProperty extendedProperty in myItem.ExtendedProperties)
                    
                        Console.WriteLine(" Extended Property Name: " + extendedProperty.PropertyDefinition.Name);
                        Console.WriteLine(" Extended Property Value: " + extendedProperty.Value);
                    
                

            
        
        else
        
            Console.WriteLine("No Items Found!");
        

    

【讨论】:

【参考方案2】:

使用FindItems 只会让你走这么远,因为它只返回正文的前 255 个字节。您应该做的是组合FindItem 来请求邮件的ID,并发出一个或多个GetItem 调用以获取您感兴趣的属性。

【讨论】:

更准确地说,您需要.Bind 到每个项目。例如Appointment = a = Appointment.Bind(_service, appt.Id) 其中appt 是您从FindAppointments 获得的项目。糟透了FindItem 不能返回所有东西;意味着更多的往返行程。 但是您可以将其减少到 ~2 次调用。使用 service.BindToItems() 一次加载多个项目... 优秀的亨宁!感谢您的提示。【参考方案3】:

由于最初的问题专门询问“电子邮件正文、收据、发件人和抄送信息”,我想我会解决这些问题。我假设“收据”是收件人信息,而不是没有人使用的电子邮件的“通知发件人”功能。 CC 看起来与收件人的处理方式相同。

我喜欢 Henning 将函数减少到两个调用的答案,但在弄清楚如何处理 PropertySet 时遇到了一点困难。谷歌搜索并没有立即明确这一点,我最终使用了别人的tutorial:

// Simplified mail item
public class MailItem

    public string From;
    public string[] Recipients;
    public string Subject;
    public string Body;


public MailItem[] GetUnreadMailFromInbox()

    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(128));
    ServiceResponseCollection<GetItemResponse> items = 
        service.BindToItems(findResults.Select(item => item.Id), new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.From, EmailMessageSchema.ToRecipients));
    return items.Select(item => 
        return new MailItem() 
            From = ((Microsoft.Exchange.WebServices.Data.EmailAddress)item.Item[EmailMessageSchema.From]).Address,
            Recipients = ((Microsoft.Exchange.WebServices.Data.EmailAddressCollection)item.Item[EmailMessageSchema.ToRecipients]).Select(recipient => recipient.Address).ToArray(),
            Subject = item.Item.Subject,
            Body = item.Item.Body.ToString(),
        ;
    ).ToArray();

【讨论】:

【参考方案4】:

除了使用 ExtendedProperties,您还可以强制转换为 EmailMessage 并直接读取您想要的属性。例如发件人地址:

((Microsoft.Exchange.WebServices.Data.EmailMessage)(item)).From.Address;

【讨论】:

用这个代替item有什么好处吗? ?在发件人电子邮件案例中很清楚,但是例如正文呢?

以上是关于如何使用 EWS 获取电子邮件正文、收据、发件人和抄送信息?的主要内容,如果未能解决你的问题,请参考以下文章

使用 EWS for Exchange 2013 获取收件人电子邮件地址

EWS 电子邮件正文返回为空?

EWS 正文纯文本

收件人上的 EWS 通知电子邮件地址已读取

Outlook 365 EWS 流式通知 |如何计算发送和接收消息所需的时间?

Python imaplib 获取正文电子邮件 gmail