您的位置:首页 > 其它

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

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



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