【问题标题】:Get message delivery status EWS获取消息传递状态 EWS
【发布时间】:2017-12-22 09:08:27
【问题描述】:

我需要使用 Exchange Web 服务 API 发送消息,然后检查它们是否已送达。为此,我尝试使用 EWS 跟踪,但日志文件始终提供 NoError 状态,即使我发送的电子邮件不存在。 现在我正在尝试获取 SentItems 文件夹中的最后一条消息并检查它们的属性,但我找不到传递状态的属性。我能用它做什么? 我现在的代码:

private void checkDeliveryStatuses(ExchangeService service)
    {
        ItemView itemview = new ItemView(10);
        itemview.PropertySet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.InternetMessageId, *some property for status*);
        FindItemsResults<Item> newMessages = service.FindItems(WellKnownFolderName.SentItems, itemview);
        foreach (Item item in newMessages)
        {
            EmailMessage msg = item as EmailMessage; 
            //Somehow get delivery status here
        }
     }

【问题讨论】:

    标签: c# exchangewebservices


    【解决方案1】:

    传递状态不会存储在 SentItems 文件夹中存储的消息副本上,因此您尝试执行的操作不会像您尝试使用它的方式那样起作用。 EWS 有一些消息跟踪操作,您可以尝试使用 https://msdn.microsoft.com/en-us/library/office/bb409286(v=exchg.150).aspx#bk_message_tracking 在 EWS 托管 API 中不支持使用这些操作,因此如果您想使用它们,您将需要使用 RAW SOAP 或代理对象,例如

    ExchangeServiceBinding esb = new ExchangeServiceBinding();
    esb.Credentials = new NetworkCredential("username", "password", "domain");
    esb.Url = "https://servername/EWS/Exchange.asmx";
    esb.RequestServerVersionValue = new RequestServerVersion();
    esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2010_SP1;
    ReplyToItemType riRepItem = new ReplyToItemType();
    FindMessageTrackingReportRequestType fmtRequest = new FindMessageTrackingReportRequestType();
    fmtRequest.Scope = "Organization";
    fmtRequest.StartDateTime = DateTime.Now.AddDays(-4);
    fmtRequest.Sender = new EmailAddressType();
    fmtRequest.Sender.EmailAddress = "administrator@msgdevelop.com";
    fmtRequest.Domain = "msgdevelop.com";
    fmtRequest.StartDateTimeSpecified = true;
    FindMessageTrackingReportResponseMessageType fmtResponse = esb.FindMessageTrackingReport(fmtRequest);
    foreach (FindMessageTrackingSearchResultType fmtSearchResult in fmtResponse.MessageTrackingSearchResults)
    {
    Console.WriteLine(fmtSearchResult.MessageTrackingReportId);
    GetMessageTrackingReportRequestType gmt = new GetMessageTrackingReportRequestType();
    gmt.MessageTrackingReportId = fmtSearchResult.MessageTrackingReportId;
    gmt.Scope = "Organization";
    gmt.ReportTemplate = MessageTrackingReportTemplateType.Summary;
    GetMessageTrackingReportResponseMessageType gmtResponse = esb.GetMessageTrackingReport(gmt);
    foreach (RecipientTrackingEventType rte in gmtResponse.MessageTrackingReport.RecipientTrackingEvents)
    {
        Console.WriteLine(rte.EventDescription);
        Console.WriteLine(rte.DeliveryStatus);
    }
    }
    

    【讨论】:

    • 非常感谢,但是如何获取 ExchangeServiceBinding 对象?现在我有命名空间错误。我试过用谷歌搜索,但没有帮助。
    • 您需要在 Visual Studio msdn.microsoft.com/en-us/library/office/… 中生成 Web 服务代理对象(在 2010 年、2015 年和 2017 年与 2008 年相同)
    • 你好。我得到“访问被拒绝。检查凭据并重试。”在 fmt 响应中。凭据是正确的。有什么问题?
    • 听起来您无权在您尝试使用的上下文中跟踪消息。例如,用户只能获取他们发送的消息(而不是其他人的消息)的传递状态。还有一个管理 RBAC 角色 technet.microsoft.com/en-us/library/dd876858(v=exchg.150).aspx 在某些情况下会影响这一点
    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 2015-12-20
    • 2014-01-18
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多