1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
package main
import (
"encoding/xml"
"github.com/mhewedy/ews"
"log"
)
// 定义请求和响应结构体
type FindItemRequest struct {
XMLName xml.Name `xml:"m:FindItem"`
Traversal string `xml:"Traversal,attr"`
ItemShape *ItemShape `xml:"m:ItemShape"`
IndexedPageItemView *IndexedPageItemView `xml:"m:IndexedPageItemView"`
ParentFolderIds *FolderIDs `xml:"m:ParentFolderIds"`
SortOrder *SortOrder `xml:"m:SortOrder"`
}
type IndexedPageItemView struct {
MaxEntriesReturned int `xml:"MaxEntriesReturned,attr"`
Offset int `xml:"Offset,attr"`
BasePoint string `xml:"BasePoint,attr"`
}
type SortOrder struct {
FieldOrder *FieldOrder `xml:"t:FieldOrder"`
}
type FieldOrder struct {
Order string `xml:"Order,attr"`
FieldURI *FieldURI `xml:"t:FieldURI"`
}
type ItemShape struct {
BaseShape string `xml:"t:BaseShape"`
AdditionalProperties *AdditionalProperties `xml:"t:AdditionalProperties"`
}
type AdditionalProperties struct {
FieldURIs []FieldURI `xml:"t:FieldURI"`
}
type FieldURI struct {
FieldURI string `xml:"FieldURI,attr"`
}
type FolderIDs struct {
DistinguishedFolderId *DistinguishedFolderId `xml:"t:DistinguishedFolderId"`
}
type DistinguishedFolderId struct {
Id string `xml:"Id,attr"`
}
// 响应结构体定义
type FindItemResponse struct {
XMLName xml.Name `xml:"m:FindItemResponse"`
ResponseMessages *ResponseMessages `xml:"m:ResponseMessages"`
}
type ResponseMessages struct {
FindItemResponseMessage *FindItemResponseMessage `xml:"m:FindItemResponseMessage"`
}
type FindItemResponseMessage struct {
ResponseCode string `xml:"m:ResponseCode"`
RootFolder *RootFolder `xml:"m:RootFolder"`
}
type RootFolder struct {
TotalItemsInView int `xml:"TotalItemsInView,attr"`
IncludesLastItemInRange bool `xml:"IncludesLastItemInRange,attr"`
Items *Items `xml:"t:Items"`
}
type Items struct {
Message []Message `xml:"t:Message"`
}
type Message struct {
ItemId *ItemId `xml:"t:ItemId"`
Subject string `xml:"t:Subject"`
DateTimeReceived string `xml:"t:DateTimeReceived"`
}
type ItemId struct {
Id string `xml:"Id,attr"`
ChangeKey string `xml:"ChangeKey,attr"`
}
func main() {
// 创建 EWS 客户端
client, err := ews.NewClient(
"https://outlook.office365.com/EWS/Exchange.asmx",
"username", // 不能加 @xxx
"password",
&ews.Config{
// NTLM 认证配置
NTLM: true, // 启用 NTLM 认证
SkipTLS: false, // 是否跳过 SSL 验证
},
)
if err != nil {
log.Fatal("创建客户端失败:", err)
}
// 构建查找最近10条邮件的请求
req := &FindItemRequest{
Traversal: "Shallow",
ItemShape: &ItemShape{
BaseShape: "IdOnly",
AdditionalProperties: &AdditionalProperties{
FieldURIs: []FieldURI{
{FieldURI: "item:Subject"},
{FieldURI: "item:DateTimeReceived"},
},
},
},
IndexedPageItemView: &IndexedPageItemView{
MaxEntriesReturned: 10, // 限制返回10条
Offset: 0, // 从第一条开始
BasePoint: "Beginning", // 从开始位置计算偏移
},
ParentFolderIds: &FolderIDs{
DistinguishedFolderId: &DistinguishedFolderId{
Id: "inbox",
},
},
SortOrder: &SortOrder{
FieldOrder: &FieldOrder{
Order: "Descending", // 降序排序
FieldURI: &FieldURI{
FieldURI: "item:DateTimeReceived", // 按接收时间排序
},
},
},
}
// 将请求结构体转换为 XML
xmlData, err := xml.MarshalIndent(req, "", " ")
if err != nil {
log.Fatal("生成 XML 失败:", err)
}
// 打印生成的 XML 请求体
log.Printf("生成的 XML 请求体:\n%s\n", xmlData)
// 发送请求到 Exchange 服务器并解析响应
resp := &FindItemResponse{}
err = client.DoAndParse(req, resp)
if err != nil {
log.Fatal("请求失败:", err)
}
// 处理响应数据
if resp.ResponseMessages != nil &&
resp.ResponseMessages.FindItemResponseMessage != nil &&
resp.ResponseMessages.FindItemResponseMessage.RootFolder != nil &&
resp.ResponseMessages.FindItemResponseMessage.RootFolder.Items != nil {
// 遍历邮件列表
for _, msg := range resp.ResponseMessages.FindItemResponseMessage.RootFolder.Items.Message {
log.Printf("邮件主题: %s, 接收时间: %s\n", msg.Subject, msg.DateTimeReceived)
}
// 打印统计信息
log.Printf("总计找到 %d 封邮件\n",
resp.ResponseMessages.FindItemResponseMessage.RootFolder.TotalItemsInView)
}
}
|