EWS 托管 API - 未将对象引用设置为对象的实例

发布时间:2021-02-26 16:16

我试图通过 EWS 托管 API 从 Exchange Server 获取电子邮件,设法连接到服务器,但是当我尝试获取电子邮件列表时,我总是收到“未将对象引用设置为对象的实例”。错误。任何人都可以帮助我做错了什么?

这是我为获取电子邮件而创建的程序:

public void MssPeekInboxEmails(string ssusername, string sspassword, out RLEmailDigestRecordList ssemails, out bool ssloginValid) {
        // TODO: Write implementation for action
        ssemails = new RLEmailDigestRecordList();

        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        ExchangeService service = new ExchangeService();

        service.Credentials = new NetworkCredential(ssusername, sspassword);
        service.AutodiscoverUrl(ssusername, RedirectionCallback);
        //service.Url = serviceUrl;

        //ArrayList arrMessages = new ArrayList();
        GenericExtendedActions.LogMessage(AppInfo.GetAppInfo().OsContext, "1", "EWS");
        FindItemsResults<Item> findResults = null;
        try
        {
            findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(100));
        }
        catch
        {
            ssemails = new RLEmailDigestRecordList();
            ssloginValid = false;

            return;
        }

        service.LoadPropertiesForItems(findResults, PropertySet.FirstClassProperties);
        GenericExtendedActions.LogMessage(AppInfo.GetAppInfo().OsContext, "2", "EWS");
        foreach (EmailMessage item in findResults)
        {
            GenericExtendedActions.LogMessage(AppInfo.GetAppInfo().OsContext, "3", "EWS");
            RCEmailDigestRecord element = new RCEmailDigestRecord();
            element.ssSTEmailDigest.ssId = item.Id.UniqueId;
            element.ssSTEmailDigest.ssFrom.ssSTEmailAddress.ssAddress = item.From.Address;

            foreach (EmailAddress toElement in item.ToRecipients)
            {
                RCEmailAddressRecord record = new RCEmailAddressRecord();
                record.ssSTEmailAddress.ssAddress = toElement.Address;
                element.ssSTEmailDigest.ssTo = new RLEmailAddressRecordList();
                element.ssSTEmailDigest.ssTo.Add(record);
            }

            element.ssSTEmailDigest.ssPriority = (int)item.Importance;
            if (item.Subject.Length > EmailDigestSubjectLenght)
            {

                element.ssSTEmailDigest.ssSubject = item.Subject.Substring(0, EmailDigestSubjectLenght - 3);
                element.ssSTEmailDigest.ssSubject += "...";
            }
            else
            {
                element.ssSTEmailDigest.ssSubject = item.Subject;
            }

            if (item.Body.Text.Length > EmailDigestBodyLenght)
            {
                element.ssSTEmailDigest.ssBody = item.Body.Text.Substring(0, EmailDigestBodyLenght - 3);
                element.ssSTEmailDigest.ssBody += "...";
            }
            else
            {
                element.ssSTEmailDigest.ssBody = item.Body.Text;
            }

            element.ssSTEmailDigest.ssHasAttachment = (item.Attachments.Count > 0);

            ssemails.Add(element);
            ssloginValid = true;

        }
        GenericExtendedActions.LogMessage(AppInfo.GetAppInfo().OsContext, "4", "EWS");

        ssloginValid = true;
    } // MssPeekInboxEmailsenter code here
回答1

所以在检查我的代码后,我自己发现了问题。它在这条特定线上

RCEmailDigestRecord element = new RCEmailDigestRecord();

我改成

RCEmailDigestRecord element = new RCEmailDigestRecord(null);

现在可以正常工作了。

很抱歉没有提到错误是哪一行,因为我匆忙创建了这个程序并且它正在另一个平台(外系统)上使用,这使得无法直接从 Visual Studio 调试它。