首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用Exhcange服务读取电子邮件时出错

尝试使用Exhcange服务读取电子邮件时出错
EN

Stack Overflow用户
提问于 2021-05-14 02:58:18
回答 1查看 57关注 0票数 1

我做了一个视窗服务。

我有这个代码来连接到Exchange服务来阅读电子邮件,在我的本地计算机上它工作得很好,但我把它放在服务器上,它就不能工作了。

我安装了这个服务。

在服务中,我转到Login => This account选项卡,添加一个管理员帐户,然后启动服务。

代码语言:javascript
复制
public void ConnectToExchangeServer()
        {
            
            WriteToFile(DateTime.Now + " Connecting to Exchange Server..");
            try
            {
                
                exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
                exchange.Credentials = new NetworkCredential("username", "password", "na.empresa.com");
                exchange.Url = new Uri("https://mail.empresa.com/EWS/Exchange.asmx");
                exchange.PreAuthenticate = true;
                exchange.TraceEnabled = true;
                WriteToFile(DateTime.Now + " Connected to Exchange Server : " + exchange.Url.Host);  

            }
            catch (Exception ex)
            {
                
                WriteToFile(DateTime.Now + " Error Connecting to Exchange Server!!" + ex.Message);
            }

        }

代码语言:javascript
复制
private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            
            ConnectToExchangeServer();
            try
            {
                SearchFilter.SearchFilterCollection findAllResult = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
                WriteToFile(DateTime.Now + " Start read mail");
                if (exchange != null)
                {
                    FindItemsResults<Item> findResults = exchange.FindItems(WellKnownFolderName.Inbox, findAllResult, new ItemView(100));
                    WriteToFile(DateTime.Now + "Email qty " + findAllResult.Count);
                    if (findResults.TotalCount <= 0)
                    {
                        WriteToFile(DateTime.Now + " No new Emails found!!");
                        return;
                    }
                    foreach (Item item in findResults)
                    {
                        WriteToFile(DateTime.Now + " List Emails");

                    }
                }
                else
                {
                    WriteToFile(DateTime.Now + "Object:ExchangeService is null -> " + exchange);
                }
            }
            catch (Exception ex)
            {
                WriteToFile(DateTime.Now +" " +ex.ToString());
            }
        }

在日志中,我看到:

代码语言:javascript
复制
5/13/2021 1:13:24 PM Connecting to Exchange Server..
5/13/2021 1:13:24 PM Connected to Exchange Server : mail.empresa.com
5/13/2021 1:13:24 PM Start read mail
5/13/2021 1:13:44 PM Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. Unable to connect to the remote server ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond xxx.xxx.xxx.xxx:443
   at System.Net.Sockets.Socket.InternalEndConnect(IAsyncResult asyncResult)
   at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult)
   at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetWebRequestStream(IEwsHttpWebRequest request)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.TraceAndEmitRequest(IEwsHttpWebRequest request, Boolean needSignature, Boolean needTrace)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest()
   --- End of inner exception stack trace ---
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest()
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
   at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
   at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems[TItem](IEnumerable`1 parentFolderIds, SearchFilter searchFilter, String queryString, ViewBase view, Grouping groupBy, ServiceErrorHandling errorHandlingMode)
   at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems(FolderId parentFolderId, SearchFilter searchFilter, ViewBase view)
   at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems(WellKnownFolderName parentFolderName, SearchFilter searchFilter, ViewBase view)
   at ServiceIPS.Service1.OnElapsedTime(Object source, ElapsedEventArgs e)

你能找个人帮我纠正这个错误吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 09:56:34

我相信正因为如此

exchange是一个类字段。OnElapsedTime是计时器事件

每次执行

代码语言:javascript
复制
private void OnElapsedTime(object source, ElapsedEventArgs e)
{            
        ConnectToExchangeServer();

您将覆盖exchange。并且在exchange的新实例尚未连接时捕获exchange.FindItems,因为在前一个完成之前执行的下一个OnElapsedTime是并发执行的。

当您进入OnElapsedTime时,您可能应该暂停/暂停计时器。然后在退出此方法时重新启动/启用。

另一种选择是连接以在OnElapsedTime中声明exchange。但接下来你会遇到另一个问题。因为当您执行FindItems时,您将加倍处理您的项目。因此,最好的方法是确保在任何时候都只有一次OnElapsedTime执行。然后,您可能仍然希望在内部声明exchange。或者检查连接是否处于活动状态,以免连接次数过多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67524733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档