很久沒有更新過部落格了,這幾個月比較忙,人也比較懶散,今天已經是八月份,新的一個月希望要換一個狀态。今天要寫的文章是我四月份寫的一個功能,一直拖到現在才發表。在企業内部我們一般都是使用微軟的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