加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 01:24:14 所属栏目:安全 来源:网络整理
导读:感谢:http://blog.csdn.net/thy822/archive/2010/09/09/5873244.aspx ? 很久没有更新过博客了,这几个月比较忙,人也比较懒散,今天已经是八月份,新的一个月希望要换一个状态。今天要写的文章是我四月份写的一个功能,一直拖到现在才发表。在企业内部我们

感谢: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
?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

????????}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读