.NET中使用Exchange 2007 Webservice来读取邮件
感谢:http://blog.csdn.net/thy822/archive/2010/09/09/5873244.aspx ? 很久没有更新过博客了,这几个月比较忙,人也比较懒散,今天已经是八月份,新的一个月希望要换一个状态。今天要写的文章是我四月份写的一个功能,一直拖到现在才发表。在企业内部我们一般都是使用微软的Exchange服务器来进行邮件的存储及发送,我们一般在客户端用outlook来收发邮件。工作中遇到了一个需求,需要写一个程序来抓取邮件服务器的邮件,并将抓取下来的邮件存储到数据库中。之前已经发表过一篇文章,是利用Jmail组件来抓取,可以抓取我们常用的一些邮箱的邮件,比如说163,gmail等,但是不能抓取exchange服务器中的邮件,所以需要重新写,最后决定使用Exchange 2007 中提供的webservice来抓取邮件。网络上这方面的资料很少,所以大部分的参考是来自MSDN: http://msdn.microsoft.com/en-us/library/exchangewebservices(EXCHG.80).aspx 2007版的Exchange服务器提供了webservice,我们可以方便的在.NET程序中添加该引用,然后就可以方便的实现邮件的抓取,发送,删除等功能。我测试是在控制台程序中使用该webservice,步骤如下: 1 新建一个站点,然后添加 exchange webservice 的引用, 输入邮件服务器的 OWA 地址:http://yourmailserver/EWS/Services.wsdl ,如果是在公司的内部域中,添加的过程中要求输入你的域帐号和密码。
? ? ?
2 添加成功以后再项目中导入该命名空间以其他必须的命名空间 ;
? 3 下面就是具体的代码,具体的请看注释: 发送邮件: ?
?1 ???????? public ? static ? void ?CreateEmail( string ?userName,? string ?passWord,? string ?domain,? string ?url,? string ?mailFrom,? string
?mailTo)
?2 ???????? { ?3 ???????????? // ?Create?service?binding. ?4 ???????????? // ?建立service绑定 ?5 ????????????ExchangeServiceBinding?esb? = ? new ?ExchangeServiceBinding(); ?6 ????????????esb.Credentials? = ? new ?NetworkCredential(userName,?passWord,?domain); ?7 ????????????esb.Url? = ?url; ?8 ?9 ???????????? // ?Create?the?CreateItem?request. 10 ????????????CreateItemType?createItemRequest? = ? new ?CreateItemType(); 11 12 ???????????? // ?Specifiy?how?the?created?items?are?handled 13 ???????????? // ?如何处理邮件 14 ????????????createItemRequest.MessageDisposition? = ?MessageDispositionType.SendAndSaveCopy; 15 ????????????createItemRequest.MessageDispositionSpecified? = ? true ; 16 17 ???????????? // ?Specify?the?location?of?sent?items.? 18 ????????????createItemRequest.SavedItemFolderId? = ? new ?TargetFolderIdType(); 19 ????????????DistinguishedFolderIdType?sentitems? = ? new ?DistinguishedFolderIdType(); 20 ????????????sentitems.Id? = ?DistinguishedFolderIdNameType.sentitems; 21 ????????????createItemRequest.SavedItemFolderId.Item? = ?sentitems; 22 23 ???????????? // ?Create?the?array?of?items. 24 ????????????createItemRequest.Items? = ? new ?NonEmptyArrayOfAllItemsType(); 25 26 ???????????? // ?Create?a?single?e-mail?message. 27 ???????????? // ?新建一封邮件message对象 28 ????????????MessageType?message? = ? new ?MessageType(); 29 ????????????message.Subject? = ? " Tommy?Test " ; 30 ????????????message.Body? = ? new ?BodyType(); 31 ????????????message.Body.BodyType1? = ?BodyTypeType.Text; 32 ????????????message.Body.Value? = ? " This?is?tommy's?test?use?exchange?webservice " ; 33 ????????????message.ItemClass? = ? " IPM.Note " ; 34 ????????????message.Sender? = ? new ?SingleRecipientType(); 35 ????????????message.Sender.Item? = ? new ?EmailAddressType(); 36 ????????????message.Sender.Item.EmailAddress? = ?mailFrom; 37 ????????????message.ToRecipients? = ? new ?EmailAddressType[ 1 ]; 38 ????????????message.ToRecipients[ 0 ]? = ? new ?EmailAddressType(); 39 ????????????message.ToRecipients[ 0 ].EmailAddress? = ?mailTo; 40 ????????????message.Sensitivity? = ?SensitivityChoicesType.Normal; 41 42 ???????????? // ?Add?the?message?to?the?array?of?items?to?be?created. 43 ????????????createItemRequest.Items.Items? = ? new ?ItemType[ 1 ]; 44 ????????????createItemRequest.Items.Items[ 0 ]? = ?message; 45 46 ???????????? try 47 ???????????? { 48 ???????????????? // ?Send?the?request?to?create?and?send?the?e-mail?item,?and?get?the?response. 49 ????????????????CreateItemResponseType?createItemResponse? = ?esb.CreateItem(createItemRequest); 50 51 ???????????????? // ?Determine?whether?the?request?was?a?success. 52 ???????????????? if ?(createItemResponse.ResponseMessages.Items[ 0 ].ResponseClass? == ?ResponseClassType.Error) 53 ???????????????? { 54 ???????????????????? throw ? new ?Exception(createItemResponse.ResponseMessages.Items[ 0 ].MessageText); 55 ????????????????} 56 ???????????????? else 57 ???????????????? { 58 ????????????????????Console.WriteLine( " Item?was?created " ); 59 ????????????????????Console.ReadLine(); 60 ????????????????} 61 ????????????} 62 ???????????? catch ?(Exception?e) 63 ???????????? { 64 ????????????????Console.WriteLine(e.Message); 65 ????????????????Console.ReadLine(); 66 ????????????} 67 ????????} ? 抓取以及删除邮件:
??1 ? public ? static ? void ?GetMailMessage( string ?userName,? string
?url)
??2 ???????? { ??3 ???????????? // ?绑定exchange服务器 ??4 ????????????ExchangeServiceBinding?exchangeServer? = ? new ?ExchangeServiceBinding(); ??5 ????????????ICredentials?creds? = ? new ?NetworkCredential(userName,?domain); ??6 ??7 ???????????? // ?建立信任连接 ??8 ????????????exchangeServer.Credentials? = ?creds; ??9 ????????????exchangeServer.Url? = ?url; ?10 ?11 ???????????? // ?定义邮件的收件箱 ?12 ????????????DistinguishedFolderIdType[]?folderIDArray? = ? new ?DistinguishedFolderIdType[ 1 ]; ?13 ????????????folderIDArray[ 0 ]? = ? new ?DistinguishedFolderIdType(); ?14 ????????????folderIDArray[ 0 ].Id? = ?DistinguishedFolderIdNameType.inbox; ?15 ?16 ????????????PathToUnindexedFieldType?ptuftDisplayName? = ? new ?PathToUnindexedFieldType(); ?17 ????????????ptuftDisplayName.FieldURI? = ?UnindexedFieldURIType.folderDisplayName; ?18 ?19 ????????????PathToExtendedFieldType?pteftComment? = ? new ?PathToExtendedFieldType(); ?20 ????????????pteftComment.PropertyTag? = ? " 0x3004 " ;? // ?PR_COMMENT ?21 ????????????pteftComment.PropertyType? = ?MapiPropertyTypeType.String; ?22 ?23 ???????????? // ?定义GetFolderType对象,设置相应属性 ?24 ????????????GetFolderType?myfoldertype? = ? new ?GetFolderType(); ?25 ????????????myfoldertype.FolderIds? = ?folderIDArray; ?26 ????????????myfoldertype.FolderShape? = ? new ?FolderResponseShapeType(); ?27 ????????????myfoldertype.FolderShape.BaseShape? = ?DefaultShapeNamesType.IdOnly; ?28 ????????????myfoldertype.FolderShape.AdditionalProperties? = ? new ?BasePathToElementType[ 2 ]; ?29 ????????????myfoldertype.FolderShape.AdditionalProperties[ 0 ]? = ?ptuftDisplayName; ?30 ????????????myfoldertype.FolderShape.AdditionalProperties[ 1 ]? = ?pteftComment; ?31 ?32 ???????????? // ?获取服务器中的文件夹的集合 ?33 ????????????GetFolderResponseType?myFolder? = ?exchangeServer.GetFolder(myfoldertype); ?34 ?35 ???????????? // ?获取收件箱 ?36 ????????????FolderInfoResponseMessageType?firmtInbox? = ?37 ????????????????(FolderInfoResponseMessageType)myFolder.ResponseMessages.Items[ 0 ]; ?38 ?39 ???????????? // ?显示收件箱 ?40 ????????????Console.WriteLine( string .Format( " got?folder:?{0} " ,?firmtInbox.Folders[ 0 ].DisplayName)); ?41 ?42 ?43 ????????????PathToUnindexedFieldType?ptuftSubject? = ? new ?PathToUnindexedFieldType(); ?44 ????????????ptuftSubject.FieldURI? = ?UnindexedFieldURIType.itemSubject; ?45 ?46 ????????????PathToUnindexedFieldType?ptuftBody? = ? new ?PathToUnindexedFieldType(); ?47 ????????????ptuftBody.FieldURI? = ?UnindexedFieldURIType.itemAttachments; ?48 ?49 ????????????PathToExtendedFieldType?pteftFlagStatus? = ? new ?PathToExtendedFieldType(); ?50 ????????????pteftFlagStatus.PropertyTag? = ? " 0x1090 " ;? // ?PR_FLAG_STATUS ?51 ????????????pteftFlagStatus.PropertyType? = ?MapiPropertyTypeType.Integer; ?52 ?53 ???????????? // ?定义FindItemType对象,准备获取收件箱中的集合 ?54 ????????????FindItemType?findItemRequest? = ? new ?FindItemType(); ?55 ????????????findItemRequest.Traversal? = ?ItemQueryTraversalType.Shallow; ?56 ????????????findItemRequest.ItemShape? = ? new ?ItemResponseShapeType(); ?57 ????????????findItemRequest.ItemShape.BaseShape? = ?DefaultShapeNamesType.AllProperties; ?58 ?59 ?60 ????????????findItemRequest.ParentFolderIds? = ? new ?FolderIdType[ 1 ]; ?61 ????????????findItemRequest.ParentFolderIds[ 0 ]? = ?firmtInbox.Folders[ 0 ].FolderId; ?62 ?63 ???????????? // ?获取邮件 ?64 ????????????FindItemResponseType?firt? = ?exchangeServer.FindItem(findItemRequest); ?65 ?66 ???????????? // ?循环迭代每一封邮件 ?67 ???????????? foreach ?(FindItemResponseMessageType?firmtMessage? in ?firt.ResponseMessages.Items) ?68 ???????????? { ?69 ???????????????? // ?如果包含邮件,显示出来 ?70 ???????????????? if ?(firmtMessage.RootFolder.TotalItemsInView? > ? 0 ) ?71 ???????????????? { ?72 ???????????????????? // ?循环迭代每一封邮件详细信息 ?73 ???????????????????? foreach ?(ItemType?it? in ?((ArrayOfRealItemsType)firmtMessage.RootFolder.Item).Items) ?74 ???????????????????? { ?75 ????????????????????????Console.WriteLine( string .Format( " 邮件标题:?{0}? " ,?it.Subject)); ?76 ????????????????????????Console.WriteLine( string .Format( " 发件人:?{0}? " ,((MessageType)(it)).From.Item.Name)); ?77 ????????????????????????Console.WriteLine( string .Format( " 收件人:?{0}? " ,?it.DisplayTo)); ?78 ????????????????????????Console.WriteLine( string .Format( " 抄送:?{0}? " ,?it.DisplayCc)); ?79 ????????????????????????Console.WriteLine( string .Format( " 大小:?{0}? " ,?it.Size.ToString())); ?80 ????????????????????????Console.WriteLine( string .Format( " 重要性:?{0}? " ,?it.Importance.ToString())); ?81 ????????????????????????Console.WriteLine( string .Format( " 是否已读:?{0}? " ,?((MessageType)(it)).IsRead.ToString())); ?82 ????????????????????????Console.WriteLine( string .Format( " 是否有附件:?{0}? " ,?it.HasAttachments.ToString())); ?83 ???????????????????????? // Console.WriteLine(string.Format("发送时间:{0}",?it.DateTimeSent.ToString())); ?84 ????????????????????????Console.WriteLine( string .Format( " 接收时间:?{0}? " ,?it.DateTimeReceived.ToString())); ?85 ???????????????????????? ?86 ???????????????????????? ?87 ???????????????????????? // ?通过GetItemType对象来得到邮件的正文 ?88 ????????????????????????GetItemType?getItemRequest? = ? new ?GetItemType(); ?89 ???????????????????????? // ?设置必要的属性 ?90 ????????????????????????getItemRequest.ItemIds? = ? new ?BaseItemIdType[ 1 ]; ?91 ????????????????????????getItemRequest.ItemIds[ 0 ]? = ?(BaseItemIdType)it.ItemId; ?92 ????????????????????????getItemRequest.ItemShape? = ? new ?ItemResponseShapeType(); ?93 ????????????????????????getItemRequest.ItemShape.BaseShape? = ?DefaultShapeNamesType.AllProperties; ?94 ????????????????????????getItemRequest.ItemShape.IncludeMimeContent? = ? true ; ?95 ?96 ???????????????????????? // ?获得服务器的相应 ?97 ????????????????????????GetItemResponseType?getItemResponse? = ?exchangeServer.GetItem(getItemRequest); ?98 ?99 ???????????????????????? // ?得到邮件体 100 ????????????????????????ItemInfoResponseMessageType?getItemResponseMessage? = 101 ??????????????????????????????????????????????getItemResponse.ResponseMessages.Items[ 0 ]? as 102 ??????????????????????????????????????????????ItemInfoResponseMessageType; 103 104 ???????????????????????? // ?显示邮件正文 105 ????????????????????????Console.WriteLine( " 邮件格式:{0} " ,?getItemResponseMessage.Items.Items[ 0 ].Body.BodyType1); 106 ????????????????????????Console.WriteLine( string .Format( " 正文:{0} " ,?getItemResponseMessage.Items.Items[ 0 ].Body.Value)); 107 108 ???????????????????????? // ?获取当前邮件的附件集合 109 ???????????????????????? if ?(getItemResponseMessage.Items.Items[ 0 ].HasAttachments) 110 ???????????????????????? { 111 ????????????????????????????AttachmentType[]?attachments? = ?getItemResponseMessage.Items.Items[ 0 ].Attachments; 112 113 ???????????????????????????? // ?循环获取当前邮件的每一个附件 114 ???????????????????????????? for ?( int ?i? = ? 0 ;?i? <= ?attachments.Length? - ? 1 ;i ++ ?) 115 ???????????????????????????? { 116 ???????????????????????????????? // ?定义GetAttachmentType,设置相应的属性,进行模式验证来获取附件 117 ????????????????????????????????GetAttachmentType?getAttachment? = ? new ?GetAttachmentType(); 118 ????????????????????????????????RequestAttachmentIdType[]?attachmentIDArry? = ? new ?RequestAttachmentIdType[ 1 ]; 119 ????????????????????????????????attachmentIDArry[ 0 ]? = ? new ?RequestAttachmentIdType(); 120 ????????????????????????????????attachmentIDArry[ 0 ].Id? = ?attachments[i].AttachmentId.Id; 121 ????????????????????????????????getAttachment.AttachmentIds? = ?attachmentIDArry; 122 ????????????????????????????????getAttachment.AttachmentShape? = ? new ?AttachmentResponseShapeType(); 123 ???????????????????????????????? 124 ???????????????????????????????? // ?获取附件 125 ????????????????????????????????GetAttachmentResponseType?getAttachmentResponse? = ?exchangeServer.GetAttachment(getAttachment); 126 127 ???????????????????????????????? // ?返回服务器的响应对象 128 ????????????????????????????????AttachmentInfoResponseMessageType?responseMessage? = ?getAttachmentResponse.ResponseMessages.Items[ 0 ]? as ?AttachmentInfoResponseMessageType; 129 ???????????????????????????????? if ?(responseMessage? != ? null ) 130 ???????????????????????????????? { 131 ???????????????????????????????????? // ?没有异常,显示附件信息 132 ???????????????????????????????????? if ?(responseMessage.ResponseClass? == ?ResponseClassType.Success? && ?responseMessage.Attachments? != ? null 133 ??????????????????????????????????????????????????????????? && ?responseMessage.Attachments.Length? > ? 0 ) 134 ???????????????????????????????????? { 135 ????????????????????????????????????????AttachmentType?attachment? = ?responseMessage.Attachments[ 0 ]; 136 ????????????????????????????????????????Console.WriteLine( " 附件名:{0}/n " ,?attachment.Name); 137 ???????????????????????????????????????? // Console.WriteLine("附件类型:{0}/n",?attachment.ContentId);???????????????????????????????????????????????????? 138 ????????????????????????????????????} 139 ????????????????????????????????} 140 ????????????????????????????} 141 ????????????????????????} 142 143 ???????????????????????? // ?删除当前邮件 144 ????????????????????????DeleteItemType?deleteItem? = ? new ?DeleteItemType(); 145 ????????????????????????deleteItem.ItemIds? = ? new ?BaseItemIdType[ 1 ]; 146 147 ???????????????????????? // ?将要删除邮件的ID,changekey赋值给ItemIdType对象 148 ????????????????????????ItemIdType?itemIDType? = ? new ?ItemIdType(); 149 ????????????????????????itemIDType.Id? = ?it.ItemId.Id; 150 ????????????????????????itemIDType.ChangeKey? = ?it.ItemId.ChangeKey; 151 152 ????????????????????????deleteItem.ItemIds[ 0 ]? = ?itemIDType; 153 154 ???????????????????????? // ?执行删除 155 ????????????????????????DeleteItemResponseType?deleteResponse? = ?exchangeServer.DeleteItem(deleteItem); 156 157 ???????????????????????? // ?删除成功 158 ???????????????????????? if ?(deleteResponse.ResponseMessages.Items.Length? > ? 0 ? && ?deleteResponse.ResponseMessages.Items[ 0 ].ResponseClass? == ?ResponseClassType.Success) 159 ???????????????????????? { 160 ????????????????????????????Console.WriteLine( " 删除成功 " ); 161 ????????????????????????} 162 ???????????????????????? 163 ????????????????????} 164 ????????????????} 165 166 ????????????} 167 ????????} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |