很久没 有更新过博客了,这几个月比较忙,人也比较懒散,今天已经是八月份,新的一个月希望要换一个状态。今天要写的文章是我四月份写的一个功能,一直拖到现在才 发表。在企业内部我们一般都是使用微软的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] 举报,一经查实,本站将立刻删除。