天天看點

.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        }

本文來自CSDN部落格,轉載請标明出處:http://blog.csdn.net/oyjd614/archive/2008/08/01/2754104.aspx