.NET中使用Exchange 2007 Webservice来读取邮件

很久没 有更新过博客了,这几个月比较忙,人也比较懒散,今天已经是八月份,新的一个月希望要换一个状态。今天要写的文章是我四月份写的一个功能,一直拖到现在才 发表。在企业内部我们一般都是使用微软的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  passWord,  string  domain,  string  url)
  2         
{
  3              //  绑定exchange服务器

  4             ExchangeServiceBinding exchangeServer  =   new  ExchangeServiceBinding();
  5             ICredentials creds  =   new
 NetworkCredential(userName, passWord, 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         }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值