从远程Exchange服务器检索邮件。一些安全问题 [英] Retrieving mails from a remote Exchange Server. Some sort of security issue

查看:1947
本文介绍了从远程Exchange服务器检索邮件。一些安全问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此代码工作在我的本地与Exchange托管虚拟机,而不是试图收到来自客户端的Exchange服务器的邮件时。



关键是要检查邮箱,提取细节,启动工作流和附加的电子邮件和电子邮件中的任何其它附件,移动从收件箱文件夹中的邮件到我的自定义文件夹保存。这一切工作我的本地机器上。



这是我得到的错误:



请求失败。基础连接已关闭:上一个发送发生意外的错误



内部异常:无法读取从传输连接数据:一个现有的连接被强行远程关闭宿主



在这一点上我的代码中断:

  FindItemsResults<项目> findResults = service.FindItems(WellKnownFolderName.Inbox,视图); 

请原谅任何其他低劣的代码,它不是生产做好准备,这是一个缩短的版本我编辑这样的项目可能会丢失。



下面是代码的其余部分。 (我有一个单独的类,它的认证,并拥有了邮箱中的所有凭证。我所列举的第一个)

 私有静态布尔RedirectionUrlValidationCallback(字符串redirectionUrl)
{
//默认为验证回调是拒绝的URL。
布尔结果= FALSE;

乌里redirectionUri =新的URI(redirectionUrl);

//验证重定向URL的内容。在这个简单的验证
//回调,如果是使用HTTPS
//加密验证凭证重定向URL被认为是有效的。
如果(redirectionUri.Scheme ==https开头)
{
结果=真;
}

返回结果;
}

公共静态ExchangeService ConnectToService(IUserData USERDATA)
{
返回ConnectToService(用户数据,NULL);
}

公共静态ExchangeService ConnectToService(IUserData用户数据,ITraceListener听众)
{
ExchangeService服务=新ExchangeService(userData.Version);

如果(听众!= NULL)
{
service.TraceListener =侦听器;
service.TraceFlags = TraceFlags.All;
service.TraceEnabled = TRUE;
}

service.Credentials =新的NetworkCredential(userData.EmailAddress,userData.Password);

如果(userData.AutodiscoverUrl == NULL)
{
乌里myUri =新的URI(HTTPS://IPAddress/ews/exchange.asmx);

System.Net.HttpWebRequest的WebRequest =(System.Net.HttpWebRequest)System.Net.WebRequest.Create(myUri);
VAR测试= webRequest.RequestUri;
webRequest.Proxy.IsBypassed(测试);
webRequest.ClientCertificates.Clear();

webRequest.KeepAlive = FALSE;
service.KeepAlive = FALSE;

// NEW ******尝试的修复
webRequest.Accept =* / *;
service.AcceptGzipEncoding = TRUE;


webRequest.ProtocolVersion = System.Net.HttpVersion.Version10;
变种版本= service.RequestedServerVersion;
userData.Version.Equals(ExchangeVersion.Exchange2013);

userData.AutodiscoverUrl = myUri;
service.Url = myUri;
}
,否则
{
service.Url = userData.AutodiscoverUrl;
}

退换货服务;
}

公共静态ExchangeService ConnectToServiceWithImpersonation(
IUserData用户数据,
串impersonatedUserSMTPAddress)
{
返回ConnectToServiceWithImpersonation(用户数据,impersonatedUserSMTPAddress,NULL) ;
}

公共静态ExchangeService ConnectToServiceWithImpersonation(
IUserData用户数据,
串impersonatedUserSMTPAddress,
ITraceListener听众)
{
ExchangeService服务=新ExchangeService(userData.Version);

如果(听众!= NULL)
{
service.TraceListener =侦听器;
service.TraceFlags = TraceFlags.All;
service.TraceEnabled = TRUE;
}

service.Credentials =新的NetworkCredential(userData.EmailAddress,userData.Password);

ImpersonatedUserId impersonatedUserId =
新ImpersonatedUserId(ConnectingIdType.SmtpAddress,impersonatedUserSMTPAddress);

service.ImpersonatedUserId = impersonatedUserId;

如果(userData.AutodiscoverUrl == NULL)
{
service.AutodiscoverUrl(userData.EmailAddress,RedirectionUrlValidationCallback);
userData.AutodiscoverUrl = service.Url;
}
,否则
{
service.Url = userData.AutodiscoverUrl;
}

退换货服务;
}



这是功能性反应,并且码的持续@ FindItemsResults findResults =服务。 FindItems(WellKnownFolderName.Inbox,视图);

 静态无效RecieveMails(ExchangeService服务)
{
串SitePath = @C:\temp\
INT numOfFiles = 0;
INT numOfAttachments = 0;
INT fileCount = 0;
INT filePosition = -1;
串pickupPath = Path.Combine(SitePath);
串uniqueRefNo;
随机memberNo =新的随机();
串memberNumber = memberNo.Next()的ToString();

ClientCredentials CC =新ClientCredentials();
变种的用户名= cc.UserName.ToString();

变种服务2 =新Microsoft.Exchange.WebServices.Data.ExchangeService();
VAR sVersion = service2.RequestedServerVersion;

VAR评测= service.RequestedServerVersion;

//创建的10
ItemView控件视图=页面大小ItemView控件新的视图(1);

//表明,基础属性将项目标识符
view.PropertySet =新的属性集(BasePropertySet.FirstClassProperties);
view.PropertySet.Add(ItemSchema.IsAssociated);

//将遍历相关。 (浅是默认选项,其他选项关联和SoftDeleted。)
view.Traversal = ItemTraversal.Associated;

//////信任所有证书
System.Net.ServicePointManager.ServerCertificateValidationCallback =委托(对象发件人,X509证书证书,X509Chain链,SslPolicyErrors sslPolicyErrors){返回true; };

service.HttpHeaders.Values.DefaultIfEmpty(* / *);

service.HttpResponseHeaders.Add(接受,* / *);

service.KeepAlive = FALSE;
service2.KeepAlive = FALSE;

的** ///// * 的* 游在这里FindItems * * ///// * *

  FindItemsResults<项目> findResults = service.FindItems(WellKnownFolderName.Inbox,视图); 

findResults = service.FindItems(
WellKnownFolderName.Inbox,
新ItemView控件(1)); //#是邮件的数量来获取

的foreach(在findResults.Items项项)
{
//这需要在这里收到邮件正文
消息体消息体=新Microsoft.Exchange.WebServices.Data.MessageBody();
名单,LT;项目>项目=新的List<项目>();
如果(findResults.Items.Count大于0)//防止异常
{
的foreach(项目ITEM2在findResults)
{
items.Add(ITEM2 );
}
}
service.LoadPropertiesForItems(物品,PropertySet.FirstClassProperties);
=消息体item.Body.ToString()更换(< HTML DIR =,)。.Replace(< HEAD>中,).Replace(< META HTTP-当量=,).Replace(CONTENT =,)
.Replace(<风格类型=,).Replace(< /风格>,)。更换(< /头>中,).Replace(<车身fpstyle =,).Replace(ocsi =,)
.Replace(< DIV风格=,).Replace(方向:LTR; FONT-FAMILY:宋体;颜色:#000000; FONT-SIZE:10PT;,).Replace(< / DIV>中,)
.Replace(&所述; DIV>中,).Replace(&下; /体>中,).Replace(&下; / HTML>中,).Replace(&下; BR>中,).Replace(>中,).Replace(\内容类型,)
.Replace(\text / html的;字符集= UTF-8,).Replace(\0,).Replace(\,).Replace(文本/ CSS,)
.Replace(ID = owaParaStyle,).Replace(升,).Replace(< META NAME =发电机MSHTML 9.00.8112.16470,).Replace(<花柱p { ,)
.Replace(MARGIN-TOP:0像素; MARGIN-BOTTOM:0像素,).Replace(&下; P,).Replace(&下; / P>中,).Replace(&下; / P,)。替换(与& NBSP;,)
.Replace(&下;身体fPStyle =,).Replace(%,).Replace(&下;, ).Replace(>中,).Replace(},).Replace(\,)替换(体fPStyle = 1,); // .Replace(\1,)
//消息体= Regex.Replace(消息体,@(?: \r\\\
|!\r(\\\
)| (小于?!\r)\\\
){2},);
字符串主题= item.Subject.ToString();

//写结果到控制台
Console.WriteLine(======================================= ===================================);
Console.WriteLine(收件人: + item.DisplayTo);
Console.WriteLine(主题:+学科);
Console.WriteLine(消息正文:+消息体);
Console.WriteLine();
Console.WriteLine(日期和放大器;接收时间:+ item.DateTimeReceived);
Console.WriteLine(HasAttachments:+ item.HasAttachments);
Console.WriteLine();

//保存电子邮件内容的本地驱动器
串fileDateTime = item.DateTimeReceived.ToString();
fileDateTime = fileDateTime.Replace(/, - )更换。(:, - );
串newFileName =电子邮件+ fileDateTime + - +E_Subject-+ item.Subject.Replace(:,).Replace(*,).Replace(。 ,).Replace(,,)
.Replace(;,).Replace(,).Replace(&所述?,p, ).Replace(&下; / p>中,).Replace(&下; / p,)
.Replace(&下;元名=发电机MSHTML 9.00.8112.16470, ).Replace(<花柱p {,).Replace(MARGIN-TOP:0像素; MARGIN-BOTTOM:0像素,)
.Replace(},)。取代(/,).Replace(与&,).Replace(#,).Replace(@,).Replace(!,)
.Replace(%,).Replace(&下;,).Replace(>中,).Replace(与& NBSP;,)。更换(<车身fPStyle =,);
串mydocpath = SitePath + newFileName +名.txt;

字符串从=((Microsoft.Exchange.WebServices.Data.EmailAddress)项目[EmailMessageSchema.From])地址。
串WFType =主体;
串DocumentType =从电子邮件;
INT WFTypeID = PPS.SM.Services.WorkflowDataService.GetWFTypeID(WFType);

StringBuilder的SB =新的StringBuilder();

//文本文件内容
sb.AppendLine(发自:+从);
sb.AppendLine(收件人:+ item.DisplayTo);
sb.AppendLine(邮件主题:+学科);
sb.AppendLine(接收日期和时间:+ item.DateTimeReceived.ToString());
sb.AppendLine(CC:+ item.DisplayCc);
sb.AppendLine(附件数:+ item.Attachments.Count.ToString());
sb.AppendLine();
sb.AppendLine(= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =);
sb.AppendLine();
sb.Append(电子邮件正文:+消息体);
sb.AppendLine();

使用(StreamWriter的OUTFILE =新的StreamWriter(mydocpath,真))
{
outfile.WriteLine(sb.ToString());
}

//保存附件的本地驱动器
INT attCount = item.Attachments.Count();
的foreach(在item.Attachments附件附件)
{
如果(附件FileAttachment的情况)
{
FileAttachment的FileAttachment的=附件作为FileAttachment的;
fileAttachment.Load();
Console.WriteLine(附件名称:+ fileAttachment.Name);
串attname = newFileName.Replace(电子邮件,);
//文件位置
fileAttachment.Load(SitePath +附件+ attname +-Att_Fname-+ fileAttachment.Name); //流附件内容到文件中。
}
,否则//附件是项附件。
{
//负荷连接到内存,写出来的主题。
ItemAttachment itemAttachment =附件作为ItemAttachment;
itemAttachment.Load();
串attname = newFileName.Replace(电子邮件,);
Console.WriteLine(附件+ attname + itemAttachment.Name);

}
}

PPS.SM.IAASMAgent.SMAgent客户端=新PPS.SM.IAASMAgent.SMAgent();


变种结果= client.CreateWorkflow(WFTypeIDiaasystem,$ 1Elvis,iquitowitz,,,EmailService,FromEmail, ,,,,memberNumber,南非,FGV256,,,,,,,0,,,,假,假,,,,0,假,,,,,,,,,,, ,,,,,,,decimal.Parse(0),假,FALSE,TRUE)的ToString();

Console.WriteLine(结果);

串WFnum = result.Substring(result.IndexOf('>',result.LastIndexOf(&所述; Workflownumber>中))+ 1);
WFnum = WFnum.Split('&所述;')[0];
INT WFnumber = int.Parse(WFnum.ToString());

串的IDNumber = result.Substring(result.IndexOf('>',result.LastIndexOf(&所述; IDNumber中>中))+ 1);
的IDNumber = IDNumber.Split('&所述;')[0];

的foreach(在Directory.GetFiles(字符串文件pickupPath,*))
{
布尔包含= FALSE;
如果(包含= Regex.Match(file.ToString(),item.DateTimeReceived.ToString()替换(/, - )更换(:, - ),RegexOptions。 IGNORECASE).Success)
{
fileCount ++;
}
}

变种WFattachment =新的字符串[fileCount]

ConfigurationManager.RefreshSection(的applicationSettings);
串SP = ConfigurationManager.AppSettings [UploadToSharePoint];
串DC = ConfigurationManager.AppSettings [UploadToDocumentum];
Console.WriteLine(ConfigurationManager.AppSettings [UploadToSharePoint]);
Console.WriteLine(ConfigurationManager.AppSettings [UploadToDocumentum]);

AgentServiceClient ASC =新AgentServiceClient();

//上传到SharePoint
如果(SP ==真)
{
PPS.SM.DocumentumAgentService.AgentServiceClient客户端2 =新PPS.SM.DocumentumAgentService .AgentServiceClient();

如果(Directory.Exists(pickupPath))
{
的foreach(在Directory.GetFiles(串文件pickupPath,*))
{
布尔包含= FALSE;
如果(包含= Regex.Match(file.ToString(),item.DateTimeReceived.ToString()替换(/, - )更换(:, - ),RegexOptions。 IGNORECASE).Success)
{
filePosition ++;
Console.WriteLine(正则表达式匹配:+ contains.ToString());
numOfFiles ++;

如果((包含= Regex.Match(file.ToString(),电子邮件,RegexOptions.IgnoreCase).Success)及和放大器;!(包含= Regex.Match(file.ToString( ),附件,RegexOptions.IgnoreCase).Success))//这个文件是一个电子邮件
{

WFattachment [filePosition] = file.ToString();

字节[] = bytesfile System.IO.File.ReadAllBytes(file.ToString());

uniqueRefNo = PPS.SM.Services.WorkflowDataService.GenerateDocRefNo();

串documentGroup = client2.GetDocumentGroup(DocumentType);

VAR createdDate = DateTime.Now.Date;
变种的contentType =新的FileInfo(文件)。扩展名;

client2.UploadFile(iquitowitz,WFnumber,bytesfile,file.ToString(),南非,FromEmail,memberNumber,测试,WFType,documentGroup,EmailService的IDNumber 1900-01-01 00:00:00.000,3,uniqueRefNo,共享点,int.Parse(memberNumber),,则contentType,createdDate);


// assoiciate作为文档工作流
如果(DC ==假)
{
File.Delete(文件);
}
//}
}
,否则//该文件的附件
{
//将文件添加到WF
控制台。的WriteLine(关于本地驱动器@附件文件中找到+ file.ToString());
Console.WriteLine(\\\
);
numOfAttachments ++;
WFattachment [filePosition] = file.ToString();

字节[] = bytesfile System.IO.File.ReadAllBytes(file.ToString());

uniqueRefNo = PPS.SM.Services.WorkflowDataService.GenerateDocRefNo();

串documentGroup = client2.GetDocumentGroup(DocumentType);
VAR createdDate = DateTime.Now.Date;
变种的contentType =新的FileInfo(文件)。扩展名;

client2.UploadFile(的ServiceManager,WFnumber,bytesfile,file.ToString(),南非,FromEmail,memberNumber,测试,WFType,documentGroup,EmailService的IDNumber ,1979年6月19日00:00:00.000,3,uniqueRefNo,共享点,int.Parse(memberNumber),,则contentType,createdDate);

如果(DC ==假)
{
File.Delete(文件);
}
}
}
}

}
}
filePosition = -1;
//上传到Documentum的
如果(DC ==真)
{
如果(Directory.Exists(pickupPath))
{
的foreach (在Directory.GetFiles(pickupPath字符串的文件,*))
{
布尔包含= FALSE;
如果(包含= Regex.Match(file.ToString(),item.DateTimeReceived.ToString()替换(/, - )更换(:, - ),RegexOptions。 IGNORECASE).Success)
{
filePosition ++;
Console.WriteLine(正则表达式匹配:+ contains.ToString());
numOfFiles ++;

如果((包含= Regex.Match(file.ToString(),电子邮件,RegexOptions.IgnoreCase).Success)及和放大器;!(包含= Regex.Match(file.ToString( ),附件,RegexOptions.IgnoreCase).Success))//这个文件是一个电子邮件
{
Console.WriteLine(\\\
);
WFattachment [filePosition] = file.ToString();

字节[] = bytesfile System.IO.File.ReadAllBytes(file.ToString());
VAR docresult = asc.UploadDocument(iquitowitz,P,WFnumber,bytesfile,file.ToString()。更换(SitePath,),南非,FromEmail,memberNumber, ,WFType,,IDNumber中,,3);

Console.WriteLine(docresult);
//如果成功,
File.Delete(文件);
//}
}
,否则如果(包含= Regex.Match(file.ToString(),附件,RegexOptions.IgnoreCase).Success)//该文件的附件
{
//将文件添加到WF
Console.WriteLine(附件文件在本地驱动器上发现了@+ file.ToString());
Console.WriteLine(\\\
);
// numOfAttachments ++;
WFattachment [filePosition] = file.ToString();

字节[] = bytesfile System.IO.File.ReadAllBytes(file.ToString());

VAR docresult = asc.UploadDocument(的ServiceManager,P,WFnumber,bytesfile,file.ToString()。更换(SitePath,),南非,FromEmail memberNumber,,WFType,,IDNumber中,,3);

Console.WriteLine(docresult);
//如果成功,
File.Delete(文件);
}
}
}
}
}

Console.WriteLine(本地驱动器上找到的附件文件数:+ numOfAttachments的ToString());
如果(!fileCount = 0)
的for(int i = 0; I< fileCount;)
{
Console.WriteLine(附件位置:+ WFattachment [我]);
I ++;
如果(ⅰ= fileCount!)
{
Console.WriteLine();
}
}

//如果(WorkflowWasCreated)然后移动邮件到文件夹中保存
//这里我的邮件移动到拯救我的自定义文件夹
文件夹rootfolder = Folder.Bind(服务,WellKnownFolderName.MsgFolderRoot);
rootfolder.Load();

的foreach(在rootfolder.FindFolders)文件夹文件夹(新文件夹视图(100))
{
//此IF限制什么文件夹中的程序将寻求
如果( folder.DisplayName ==拯救)
{
VAR FID = folder.Id;
//Console.WriteLine(fid);
item.Load();
//item.Subject =(fileDateTime)+ - + subject.ToString();
item.Update(ConflictResolutionMode.AlwaysOverwrite);
item.Move(FID);
Console.WriteLine(\\\
);
Console.WriteLine(电子邮件收件箱,从感动到:+ folder.DisplayName +'文件夹'+ item.Subject +');
}
}
}
}


解决方案

我发现这个问题,这是一个使命,我不得不从获得在客户端服务器工程师的额外信息。尝试了一堆OS的情景后,我们发现这个问题。问题在这里:



乌里myUri =新的URI(HTTPS://IPAddress/ews/exchange.asmx);



我在那里使用Exchange服务器的IP地址。相反,我必须通过网络邮件和公司DOMIAN



乌里myUri =新的URI(https://webmail.CompanyDomain.com/ews去/exchange.asmx);



然后该服务工作。希望这可以帮助任何人谁沿着这样一个问题来了。


This code works on my local with Exchange hosted a VM, but not when trying to recieve mails from the clients Exchange server.

The point is to check a mailbox, extract details, start a workflow and attach email and any other attachments in the email, and move the email from the Inbox folder to my custom folder 'Saved'. This all works on my local machine.

These are the errors I get:

The request failed. The underlying connection was closed: An unexpected error occurred on a send.

Inner Exception: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.

My code breaks at this point:

FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, view);

Please excuse any other shitty code, its not production ready and this is a shortened version I edited so items may be missing.

Here is the rest of the code. (I have a separate class that does the Authentication and holds all the credentials for mailboxes. I have listed that first)

private static bool RedirectionUrlValidationCallback(string redirectionUrl)
    {
      // The default for the validation callback is to reject the URL.
      bool result = false;

      Uri redirectionUri = new Uri(redirectionUrl);

      // Validate the contents of the redirection URL. In this simple validation
      // callback, the redirection URL is considered valid if it is using HTTPS
      // to encrypt the authentication credentials. 
      if (redirectionUri.Scheme == "https")
      {
        result = true;
      }

      return result;
    }

    public static ExchangeService ConnectToService(IUserData userData)
    {
      return ConnectToService(userData,null);
    }

    public static ExchangeService ConnectToService(IUserData userData, ITraceListener listener)
    {
      ExchangeService service = new ExchangeService(userData.Version);

      if (listener != null)
      {
        service.TraceListener = listener;
        service.TraceFlags = TraceFlags.All;
        service.TraceEnabled = true;
      }

      service.Credentials = new NetworkCredential(userData.EmailAddress, userData.Password);

      if (userData.AutodiscoverUrl == null)
      {
          Uri myUri = new Uri("https://IPAddress/ews/exchange.asmx");

          System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(myUri);
          var test = webRequest.RequestUri;
          webRequest.Proxy.IsBypassed(test);
          webRequest.ClientCertificates.Clear();

          webRequest.KeepAlive = false;
          service.KeepAlive = false;

          //NEW ****** ATTEMPTED FIXES
          webRequest.Accept = "*/*";
          service.AcceptGzipEncoding = true;


          webRequest.ProtocolVersion = System.Net.HttpVersion.Version10;
          var version = service.RequestedServerVersion;
          userData.Version.Equals(ExchangeVersion.Exchange2013);

        userData.AutodiscoverUrl = myUri;
        service.Url = myUri;
      }
      else
      {
        service.Url = userData.AutodiscoverUrl;
      }

      return service;
    }

    public static ExchangeService ConnectToServiceWithImpersonation(
      IUserData userData,
      string impersonatedUserSMTPAddress)
    {
      return ConnectToServiceWithImpersonation(userData, impersonatedUserSMTPAddress, null);
    }

    public static ExchangeService ConnectToServiceWithImpersonation(
      IUserData userData,
      string impersonatedUserSMTPAddress,
      ITraceListener listener)
    {
      ExchangeService service = new ExchangeService(userData.Version);

      if (listener != null)
      {
        service.TraceListener = listener;
        service.TraceFlags = TraceFlags.All;
        service.TraceEnabled = true;
      } 

      service.Credentials = new NetworkCredential(userData.EmailAddress, userData.Password);

      ImpersonatedUserId impersonatedUserId =
        new ImpersonatedUserId(ConnectingIdType.SmtpAddress, impersonatedUserSMTPAddress);

      service.ImpersonatedUserId = impersonatedUserId;

      if (userData.AutodiscoverUrl == null)
      {
        service.AutodiscoverUrl(userData.EmailAddress, RedirectionUrlValidationCallback);
        userData.AutodiscoverUrl = service.Url;
      }
      else
      {
        service.Url = userData.AutodiscoverUrl;
      }

      return service;
    }

THIS IS WHERE THE FUNCTIONALITY HAPPENS, AND CODE BREAKS @ FindItemsResults findResults = service.FindItems(WellKnownFolderName.Inbox, view);

static void RecieveMails(ExchangeService service)
        {
            string SitePath = @"C:\temp\";
            int numOfFiles = 0;
            int numOfAttachments = 0;
            int fileCount = 0;
            int filePosition = -1;
            string pickupPath = Path.Combine(SitePath);
            string uniqueRefNo;
            Random memberNo = new Random();
            string memberNumber = memberNo.Next().ToString();

        ClientCredentials cc = new ClientCredentials();
        var username = cc.UserName.ToString();

        var service2 = new Microsoft.Exchange.WebServices.Data.ExchangeService();
        var sVersion = service2.RequestedServerVersion;

        var testVersion = service.RequestedServerVersion;

        // Create a view with a page size of 10.
        ItemView view = new ItemView(1);

        // Indicate that the base property will be the item identifier
        view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
        view.PropertySet.Add(ItemSchema.IsAssociated);

        // Set the traversal to associated. (Shallow is the default option; other options are Associated and SoftDeleted.)
        view.Traversal = ItemTraversal.Associated;

        //////Trust all certificates
        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

        service.HttpHeaders.Values.DefaultIfEmpty("*/*");

        service.HttpResponseHeaders.Add("Accept", "*/*");

        service.KeepAlive = false;
        service2.KeepAlive = false;

** /////** BREAKS HERE AT FindItems** /////**

                FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, view);

findResults = service.FindItems(
            WellKnownFolderName.Inbox,
            new ItemView(1)); //# is the number of mails to fetch

            foreach (Item item in findResults.Items)
            {
                //this needs to be here to recieve the message body
                MessageBody messageBody = new Microsoft.Exchange.WebServices.Data.MessageBody();
                List<Item> items = new List<Item>();
                if (findResults.Items.Count > 0) // Prevent the exception
                {
                    foreach (Item item2 in findResults)
                    {
                        items.Add(item2);
                    }
                }
                service.LoadPropertiesForItems(items, PropertySet.FirstClassProperties);
                messageBody = item.Body.ToString().Replace("<html dir=", "").Replace("<head>", "").Replace("<meta http-equiv=", "").Replace("content=", "")
                              .Replace("<style type=", "").Replace("</style>", "").Replace("</head>", "").Replace("<body fpstyle=", "").Replace("ocsi=", "")
                              .Replace("<div style=", "").Replace("direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;", "").Replace("</div>", "")
                              .Replace("<div>", "").Replace("</body>", "").Replace("</html>", "").Replace("<br>", "").Replace(">", "").Replace("\"Content-Type", "")
                              .Replace("\"text/html; charset=utf-8", "").Replace("\"0", "").Replace("\"", "").Replace("text/css", "")
                              .Replace("id=owaParaStyle", "").Replace("ltr", "").Replace("<meta name=GENERATOR MSHTML 9.00.8112.16470", "").Replace("<style P {", "")
                              .Replace("MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px", "").Replace("<p", "").Replace("</p>", "").Replace("</p", "").Replace("&nbsp;", "")
                              .Replace("<body fPStyle= ", "").Replace("%", "").Replace("<", "").Replace(">", "").Replace("}", "").Replace("\"","").Replace("body fPStyle=1","");//.Replace("\"1", "")
                //messageBody = Regex.Replace(messageBody, @"(?:\r\n|\r(?!\n)|(?!<\r)\n){2,}", "");
                string subject = item.Subject.ToString();

                //Write results to Console
                Console.WriteLine("==========================================================================");
                Console.WriteLine("To: " + item.DisplayTo);
                Console.WriteLine("Subject: " + subject);
                Console.WriteLine("Message Body: " + messageBody);
                Console.WriteLine();
                Console.WriteLine("Date & Time Received: " + item.DateTimeReceived);
                Console.WriteLine("HasAttachments: " + item.HasAttachments);
                Console.WriteLine();

                //saving email content to local drive
                string fileDateTime = item.DateTimeReceived.ToString();
                fileDateTime = fileDateTime.Replace("/", "-").Replace(":", "-");
                string newFileName = "Email " +  fileDateTime + " - " + "E_Subject- " + item.Subject.Replace(":", "").Replace("*", "").Replace(".", "").Replace(",", "")
                                    .Replace(";", "").Replace("?", "").Replace("<p", "").Replace("</p>", "").Replace("</p", "")
                                    .Replace("<meta name=GENERATOR MSHTML 9.00.8112.16470", "").Replace("<style P {", "").Replace("MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px", "")
                                    .Replace("}", "").Replace("/", "").Replace("&", "").Replace("#", "").Replace("@", "").Replace("!", "")
                                    .Replace("%", "").Replace("<", "").Replace(">", "").Replace("&nbsp;", "").Replace("<body fPStyle= ", "");
                string mydocpath = SitePath + newFileName + ".txt";

                string From = ((Microsoft.Exchange.WebServices.Data.EmailAddress)item[EmailMessageSchema.From]).Address;
                string WFType = subject;
                string DocumentType = "From Email";
                int WFTypeID = PPS.SM.Services.WorkflowDataService.GetWFTypeID(WFType);

                StringBuilder sb = new StringBuilder();

                //Text file content
                sb.AppendLine("Sent From: " + From);
                sb.AppendLine("Sent To: " + item.DisplayTo);
                sb.AppendLine("Email Subject: " + subject);
                sb.AppendLine("Date and time received: " + item.DateTimeReceived.ToString());
                sb.AppendLine("CC: " + item.DisplayCc);
                sb.AppendLine("Number of Attachments: " + item.Attachments.Count.ToString());
                sb.AppendLine();
                sb.AppendLine("= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =");
                sb.AppendLine();
                sb.Append("Email message body: " + messageBody);
                sb.AppendLine();

                using (StreamWriter outfile = new StreamWriter(mydocpath, true))
                {
                    outfile.WriteLine(sb.ToString());
                }

                //Save attachments to local drive
                int attCount = item.Attachments.Count();
                foreach (Attachment attachment in item.Attachments)
                {
                    if (attachment is FileAttachment)
                    {
                        FileAttachment fileAttachment = attachment as FileAttachment;
                        fileAttachment.Load();
                        Console.WriteLine("Attachment name: " + fileAttachment.Name);
                        string attname = newFileName.Replace("Email ", "");
                        //File location
                        fileAttachment.Load(SitePath + "Attachment " + attname + " -Att_Fname- " + fileAttachment.Name); // Stream attachment contents into a file.
                    }
                    else// Attachment is an item attachment.
                    {
                        // Load attachment into memory and write out the subject.
                        ItemAttachment itemAttachment = attachment as ItemAttachment;
                        itemAttachment.Load();
                        string attname = newFileName.Replace("Email ", "");
                        Console.WriteLine("Attachment " + attname + itemAttachment.Name);

                    }
                }

                PPS.SM.IAASMAgent.SMAgent client = new PPS.SM.IAASMAgent.SMAgent();


                var result = client.CreateWorkflow(WFTypeID, "iaasystem", "$1Elvis", "iquitowitz", "", "", "EmailService", "FromEmail", "", "", "", "", memberNumber, "South Africa", "FGV256", "", "", "", "", "", "", 0, "", "", "", false, false, "", "", "", 0, "", false, "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", decimal.Parse("0"), false, false, true).ToString();

                Console.WriteLine(result);

                string WFnum = result.Substring(result.IndexOf('>', result.LastIndexOf("<Workflownumber>")) + 1);
                WFnum = WFnum.Split('<')[0];
                int WFnumber = int.Parse(WFnum.ToString()); 

                string IDNumber = result.Substring(result.IndexOf('>', result.LastIndexOf("<IDNumber>")) + 1);
                IDNumber = IDNumber.Split('<')[0];                

                foreach (string file in Directory.GetFiles(pickupPath, "*"))
                {
                    bool contains = false;
                    if (contains = Regex.Match(file.ToString(), item.DateTimeReceived.ToString().Replace("/", "-").Replace(":", "-"), RegexOptions.IgnoreCase).Success)
                    {
                        fileCount++;
                    }
                }

                var WFattachment = new string[fileCount];

                ConfigurationManager.RefreshSection("applicationSettings");
                string sp = ConfigurationManager.AppSettings["UploadToSharePoint"];
                string dc = ConfigurationManager.AppSettings["UploadToDocumentum"];
                Console.WriteLine(ConfigurationManager.AppSettings["UploadToSharePoint"]);
                Console.WriteLine(ConfigurationManager.AppSettings["UploadToDocumentum"]);

                AgentServiceClient asc = new AgentServiceClient();

                //Upload to Sharepoint
                if (sp == "True")
                {
                    PPS.SM.DocumentumAgentService.AgentServiceClient client2 = new PPS.SM.DocumentumAgentService.AgentServiceClient();

                    if (Directory.Exists(pickupPath))
                    {
                        foreach (string file in Directory.GetFiles(pickupPath, "*"))
                        {
                            bool contains = false;
                            if (contains = Regex.Match(file.ToString(), item.DateTimeReceived.ToString().Replace("/", "-").Replace(":", "-"), RegexOptions.IgnoreCase).Success)
                            {
                                filePosition++;
                                Console.WriteLine("Regex match: " + contains.ToString());
                                numOfFiles++;

                                if ((contains = Regex.Match(file.ToString(), "Email", RegexOptions.IgnoreCase).Success) && (contains != Regex.Match(file.ToString(), "Attachment", RegexOptions.IgnoreCase).Success))//this file is an email
                                {

                                        WFattachment[filePosition] = file.ToString();

                                        byte[] bytesfile = System.IO.File.ReadAllBytes(file.ToString());

                                        uniqueRefNo = PPS.SM.Services.WorkflowDataService.GenerateDocRefNo();

                                        string documentGroup = client2.GetDocumentGroup(DocumentType);

                                        var createdDate = DateTime.Now.Date;
                                        var contentType = new FileInfo(file).Extension;

                                        client2.UploadFile("iquitowitz", WFnumber, bytesfile, file.ToString(), "South Africa", "FromEmail", memberNumber, "Test", WFType, documentGroup, "EmailService", IDNumber, "1900-01-01 00:00:00.000", 3, uniqueRefNo, "Sharepoint", int.Parse(memberNumber), "",contentType, createdDate);


                                        //assoiciate as document to workflow
                                        if (dc == "False")
                                        {
                                            File.Delete(file);
                                        }
                                    //}
                                }
                                else //this file is an attachment
                                {
                                    //add file to WF
                                    Console.WriteLine("Attachment file found on local drive @ " + file.ToString());
                                    Console.WriteLine("\n");
                                    numOfAttachments++;
                                    WFattachment[filePosition] = file.ToString();

                                    byte[] bytesfile = System.IO.File.ReadAllBytes(file.ToString());

                                    uniqueRefNo = PPS.SM.Services.WorkflowDataService.GenerateDocRefNo();

                                    string documentGroup = client2.GetDocumentGroup(DocumentType);
                                    var createdDate = DateTime.Now.Date;
                                    var contentType = new FileInfo(file).Extension;

                                    client2.UploadFile("ServiceManager", WFnumber, bytesfile, file.ToString(), "South Africa", "FromEmail", memberNumber, "Test", WFType, documentGroup, "EmailService", IDNumber, "1979-06-19 00:00:00.000", 3, uniqueRefNo, "Sharepoint", int.Parse(memberNumber), "", contentType, createdDate);

                                    if (dc == "False")
                                    {
                                        File.Delete(file);
                                    }
                                }
                            }
                        }

                    }
                }
                filePosition = -1;
                //Upload to Documentum
                if (dc == "True")
                {
                    if (Directory.Exists(pickupPath))
                    {
                        foreach (string file in Directory.GetFiles(pickupPath, "*"))
                        {
                            bool contains = false;
                            if (contains = Regex.Match(file.ToString(), item.DateTimeReceived.ToString().Replace("/", "-").Replace(":", "-"), RegexOptions.IgnoreCase).Success)
                            {
                                filePosition++;
                                Console.WriteLine("Regex match: " + contains.ToString());
                                numOfFiles++;

                                if ((contains = Regex.Match(file.ToString(), "Email", RegexOptions.IgnoreCase).Success) && (contains != Regex.Match(file.ToString(), "Attachment", RegexOptions.IgnoreCase).Success)) //this file is an email
                                {                                    
                                        Console.WriteLine("\n");
                                        WFattachment[filePosition] = file.ToString();

                                        byte[] bytesfile = System.IO.File.ReadAllBytes(file.ToString());
                                        var docresult = asc.UploadDocument("iquitowitz", "p", WFnumber, bytesfile, file.ToString().Replace(SitePath, ""), "South Africa", "FromEmail", memberNumber, "", WFType, "", IDNumber, "", 3);

                                        Console.WriteLine(docresult);
                                        //if success
                                        File.Delete(file);
                                    //}
                                }
                                else if (contains = Regex.Match(file.ToString(), "Attachment", RegexOptions.IgnoreCase).Success) //this file is an attachment
                                {
                                    //add file to WF
                                    Console.WriteLine("Attachment file found on local drive @ " + file.ToString());
                                    Console.WriteLine("\n");
                                    //numOfAttachments++;
                                    WFattachment[filePosition] = file.ToString();

                                    byte[] bytesfile = System.IO.File.ReadAllBytes(file.ToString());

                                    var docresult = asc.UploadDocument("ServiceManager", "p", WFnumber, bytesfile, file.ToString().Replace(SitePath, ""), "South Africa", "FromEmail", memberNumber, "", WFType, "", IDNumber, "", 3);

                                    Console.WriteLine(docresult);
                                    //if success
                                    File.Delete(file);
                                }
                            }
                        }
                    }
                }

                Console.WriteLine("Number of attachment files found on local drive: " + numOfAttachments.ToString());
                if (fileCount != 0)
                    for (int i = 0; i < fileCount; )
                    {
                        Console.WriteLine("Attachment Location: " + WFattachment[i]);
                        i++;
                        if (i != fileCount)
                        {
                            Console.WriteLine("");
                        }
                    }

                //if (WorkflowWasCreated) then move email to saved folder
                //here I move the mail to my custom folder "Saved"
                Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot);
                rootfolder.Load();

                foreach (Folder folder in rootfolder.FindFolders(new FolderView(100)))
                {
                    // This IF limits what folder the program will seek
                    if (folder.DisplayName == "Saved")
                    {
                        var fid = folder.Id;
                        //Console.WriteLine(fid);                        
                        item.Load();
                        //item.Subject = (fileDateTime) +" - " + subject.ToString();
                        item.Update(ConflictResolutionMode.AlwaysOverwrite);
                        item.Move(fid);
                        Console.WriteLine("\n");
                        Console.WriteLine("Email moved from Inbox to: '" + folder.DisplayName + "' folder as '" + item.Subject + "'");
                    }
                }
            }
        }

解决方案

I found the issue, which was a mission as I had to get extra information from a Server Engineer at the client. After trying a bunch os scenarios we found the issue. The problem was here:

Uri myUri = new Uri("https://IPAddress/ews/exchange.asmx");

where I was using the Exchange servers's IP address. Instead I have to go via webmail and the company domian

Uri myUri = new Uri("https://webmail.CompanyDomain.com/ews/exchange.asmx");

and then this service worked. Hope this can help anyone who comes along an issue like this.

这篇关于从远程Exchange服务器检索邮件。一些安全问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆