您的位置:首页 > 其它

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

2010-12-10 17:05 567 查看
感谢:http://blog.csdn.net/thy822/archive/2010/09/09/5873244.aspx

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: