微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.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

@H_502_1002@

                
{
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

            
@H_502_1173@{
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

        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐