使用EWS NotificationEvent获取邮件遇EwsLegacyId报错,求替代方案
替代解决方案:避免转换EwsLegacyId的两种思路
1. 调整EWS客户端的ID格式配置
你可以在初始化EWS客户端时,直接指定让Exchange返回EwsId格式的ID,这样NotificationEvent里的ItemId会直接兼容当前Exchange版本,无需后续转换。
修改客户端初始化代码,通过MAPI扩展属性强制设置返回ID格式:
ExchangeService ewsClient = new ExchangeService(ExchangeVersion.Exchange2013); ewsClient.Credentials = new WebCredentials("username", "password"); ewsClient.Url = new Uri("https://your-exchange-server/EWS/Exchange.asmx"); // 关键配置:设置返回的ID格式为EwsId ewsClient.SetProperty( new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Common, 0x0000001F, MapiPropertyType.Integer), 3 // 3对应EwsId格式,2对应LegacyId );
注:0x0000001F是PidTagIdFormat的MAPI属性标签,值3对应Exchange 2013及以上支持的EwsId格式。
2. 订阅时直接请求邮件属性,跳过Item.Bind
如果你的场景只需要邮件的基础属性(主题、发件人、正文片段等),可以在创建订阅时指定要返回的属性集合,NotificationEvent会直接携带这些数据,无需再调用Item.Bind,自然绕开ID格式问题。
示例代码:
// 定义需要返回的邮件属性 PropertySet targetProps = new PropertySet( BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.From, EmailMessageSchema.Body ); // 创建订阅时传入属性集合 StreamingSubscription subscription = ewsClient.SubscribeToStreamingNotifications( new FolderId[] { WellKnownFolderName.Inbox }, EventType.NewMail, targetProps );
后续处理通知事件时,直接从ItemEvent的Item属性读取数据:
Microsoft.Exchange.WebServices.Data.ItemEvent itemEV = (Microsoft.Exchange.WebServices.Data.ItemEvent)e; Microsoft.Exchange.WebServices.Data.EmailMessage emailData = (Microsoft.Exchange.WebServices.Data.EmailMessage)itemEV.Item; // 直接使用emailData.Subject、emailData.From等属性
内容的提问来源于stack exchange,提问作者ノコノコパタパタ
相关产品推荐
相关产品推荐

