EWS 服务器现在无法处理此请求

问题描述 投票:0回答:3

我在使用 ews 托管 api 导出 Office 365 帐户中的电子邮件时看到错误,“服务器现在无法处理此请求。请稍后再试。”为什么会发生该错误以及可以采取哪些措施?

我正在使用以下代码来完成这项工作:-

          _GetEmail = (EmailMessage)item;
           bool isread = _GetEmail.IsRead;
           sub = _GetEmail.Subject;
           fold = folder.DisplayName;
           historicalDate = _GetEmail.DateTimeSent.Subtract(folder.Service.TimeZone.GetUtcOffset(_GetEmail.DateTimeSent));
                                props = new PropertySet(EmailMessageSchema.MimeContent);
                                var email = EmailMessage.Bind(_source, item.Id, props);

                                bytes = new byte[email.MimeContent.Content.Length];
                                fs = new MemoryStream(bytes, 0, email.MimeContent.Content.Length, true);
                                fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);

                                Demail = new EmailMessage(_destination);
                                Demail.MimeContent = new MimeContent("UTF-8", bytes);

                                // 'SetExtendedProperty' used to maintain historical date of items
                                Demail.SetExtendedProperty(new ExtendedPropertyDefinition(57, MapiPropertyType.SystemTime), historicalDate);
                                // PR_MESSAGE_DELIVERY_TIME 
                                Demail.SetExtendedProperty(new ExtendedPropertyDefinition(3590, MapiPropertyType.SystemTime), historicalDate);
                                if (isread == false)
                                {
                                    Demail.IsRead = isread;
                                }

                                if (_source.RequestedServerVersion == flagVersion && _destination.RequestedServerVersion == flagVersion)
                                {
                                    Demail.Flag = _GetEmail.Flag;
                                }

                                _lstdestmail.Add(Demail);

                                _objtask = new TaskStatu();
                                _objtask.TaskId = _taskid;
                                _objtask.SubTaskId = subtaskid;
                                _objtask.FolderId = Convert.ToInt64(folderId);
                                _objtask.SourceItemId = Convert.ToString(_GetEmail.InternetMessageId.ToString());
                                _objtask.DestinationEmail = Convert.ToString(_fromEmail);
                                _objtask.CreatedOn = DateTime.UtcNow;
                                _objtask.IsSubFolder = false;
                                _objtask.FolderName = fold;
                                _objdbcontext.TaskStatus.Add(_objtask);
                                try
                                {
                                    if (counter == countGroup)
                                    {
                                        Demails = new EmailMessage(_destination);
                                        Demails.Service.CreateItems(_lstdestmail, _destinationFolder.Id, MessageDisposition.SaveOnly, SendInvitationsMode.SendToNone);
                                        _objdbcontext.SaveChanges();
                                        counter = 0;
                                        _lstdestmail.Clear();
                                    }
                                }

                                catch (Exception ex)
                                {
                                    ClouldErrorLog.CreateError(_taskid, subtaskid, ex.Message + GetLineNumber(ex, _taskid, subtaskid), CreateInnerException(sub, fold, historicalDate));
                                    counter = 0;
                                    _lstdestmail.Clear();
                                    continue;
                                }

仅当尝试在 Office 365 帐户中导出时才会出现此错误,并且在 Outlook 2010、2013、2016 等情况下工作正常..

exchange-server office365 exchangewebservices ews-managed-api
3个回答
1
投票

通常这种情况是在超出 Exchange 中的 EWS 限制时出现的。解释在这里

确保您已经了解限制策略并且您的代码符合这些策略。 如果您有服务器,您可以使用 Get-ThrotdlingPolicy 查找限制策略。


0
投票

解决您遇到的限制问题的一种方法是实施分页,而不是一次性请求所有项目。您可以参考此链接

例如:

using Microsoft.Exchange.WebServices.Data;

static void PageSearchItems(ExchangeService service, WellKnownFolderName folder)
{
    int pageSize = 5;
    int offset = 0;

    // Request one more item than your actual pageSize.
    // This will be used to detect a change to the result
    // set while paging.
    ItemView view = new ItemView(pageSize + 1, offset);

    view.PropertySet = new PropertySet(ItemSchema.Subject);
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    view.Traversal = ItemTraversal.Shallow;

    bool moreItems = true;
    ItemId anchorId = null;
    while (moreItems)
    {
        try
        {
            FindItemsResults<Item> results = service.FindItems(folder, view);
            moreItems = results.MoreAvailable;

            if (moreItems && anchorId != null)
            {
                // Check the first result to make sure it matches
                // the last result (anchor) from the previous page.
                // If it doesn't, that means that something was added
                // or deleted since you started the search.
                if (results.Items.First<Item>().Id != anchorId)
                {
                    Console.WriteLine("The collection has changed while paging. Some results may be missed.");
                }
            }

            if (moreItems)
                view.Offset += pageSize;

            anchorId = results.Items.Last<Item>().Id;

            // Because you’re including an additional item on the end of your results
            // as an anchor, you don't want to display it.
            // Set the number to loop as the smaller value between
            // the number of items in the collection and the page size.
            int displayCount = results.Items.Count > pageSize ? pageSize : results.Items.Count;

            for (int i = 0; i < displayCount; i++)
            {
                Item item = results.Items[i];

                Console.WriteLine("Subject: {0}", item.Subject);
                Console.WriteLine("Id: {0}\n", item.Id.ToString());
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception while paging results: {0}", ex.Message);
        }
    }
}

0
投票

我在 Python 中阅读电子邮件时在 account.inbox.filter 部分遇到此错误。根据我的研究,我了解到我阅读的电子邮件是由于收件箱已满。清理后问题解决了。

我希望我能对某人有用。享受你的工作。

© www.soinside.com 2019 - 2024. All rights reserved.