postfix_log_parser/formatters/json/
smtp.rs

1use crate::events::smtp::SmtpEvent;
2use serde_json::{Map, Number, Value};
3
4/// 格式化SMTP事件为JSON
5pub fn format_smtp_event(event: &SmtpEvent) -> Map<String, Value> {
6    let mut event_data = Map::new();
7
8    match event {
9        SmtpEvent::Sent {
10            queue_id: _,
11            to,
12            relay_hostname,
13            relay_ip,
14            relay_port,
15            delay,
16            delay_before_queue,
17            delay_in_queue,
18            delay_connection,
19            delay_transmission,
20            dsn,
21            status,
22            message_size,
23        } => {
24            event_data.insert("event_type".to_string(), Value::String("sent".to_string()));
25            event_data.insert("to".to_string(), Value::String(to.clone()));
26            event_data.insert(
27                "relay_hostname".to_string(),
28                Value::String(relay_hostname.clone()),
29            );
30
31            if let Some(ip) = relay_ip {
32                event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
33            }
34            if let Some(port) = relay_port {
35                event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
36            }
37
38            event_data.insert(
39                "delay".to_string(),
40                Value::Number(Number::from_f64(*delay).unwrap()),
41            );
42
43            if let Some(delay_val) = delay_before_queue {
44                event_data.insert(
45                    "delay_before_queue".to_string(),
46                    Value::Number(Number::from_f64(*delay_val).unwrap()),
47                );
48            }
49            if let Some(delay_val) = delay_in_queue {
50                event_data.insert(
51                    "delay_in_queue".to_string(),
52                    Value::Number(Number::from_f64(*delay_val).unwrap()),
53                );
54            }
55            if let Some(delay_val) = delay_connection {
56                event_data.insert(
57                    "delay_connection".to_string(),
58                    Value::Number(Number::from_f64(*delay_val).unwrap()),
59                );
60            }
61            if let Some(delay_val) = delay_transmission {
62                event_data.insert(
63                    "delay_transmission".to_string(),
64                    Value::Number(Number::from_f64(*delay_val).unwrap()),
65                );
66            }
67
68            if let Some(dsn_val) = dsn {
69                event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
70            }
71            event_data.insert("status".to_string(), Value::String(status.clone()));
72
73            if let Some(size) = message_size {
74                event_data.insert(
75                    "message_size".to_string(),
76                    Value::Number(Number::from(*size)),
77                );
78            }
79        }
80        SmtpEvent::Deferred {
81            queue_id: _,
82            to,
83            relay_hostname,
84            relay_ip,
85            relay_port,
86            delay,
87            delay_before_queue,
88            delay_in_queue,
89            delay_connection,
90            delay_transmission,
91            dsn,
92            status,
93            defer_reason,
94        } => {
95            event_data.insert(
96                "event_type".to_string(),
97                Value::String("deferred".to_string()),
98            );
99
100            if let Some(to_val) = to {
101                event_data.insert("to".to_string(), Value::String(to_val.clone()));
102            }
103            if let Some(hostname) = relay_hostname {
104                event_data.insert(
105                    "relay_hostname".to_string(),
106                    Value::String(hostname.clone()),
107                );
108            }
109            if let Some(ip) = relay_ip {
110                event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
111            }
112            if let Some(port) = relay_port {
113                event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
114            }
115            if let Some(delay_val) = delay {
116                event_data.insert(
117                    "delay".to_string(),
118                    Value::Number(Number::from_f64(*delay_val).unwrap()),
119                );
120            }
121
122            if let Some(delay_val) = delay_before_queue {
123                event_data.insert(
124                    "delay_before_queue".to_string(),
125                    Value::Number(Number::from_f64(*delay_val).unwrap()),
126                );
127            }
128            if let Some(delay_val) = delay_in_queue {
129                event_data.insert(
130                    "delay_in_queue".to_string(),
131                    Value::Number(Number::from_f64(*delay_val).unwrap()),
132                );
133            }
134            if let Some(delay_val) = delay_connection {
135                event_data.insert(
136                    "delay_connection".to_string(),
137                    Value::Number(Number::from_f64(*delay_val).unwrap()),
138                );
139            }
140            if let Some(delay_val) = delay_transmission {
141                event_data.insert(
142                    "delay_transmission".to_string(),
143                    Value::Number(Number::from_f64(*delay_val).unwrap()),
144                );
145            }
146
147            if let Some(dsn_val) = dsn {
148                event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
149            }
150            event_data.insert("status".to_string(), Value::String(status.clone()));
151            event_data.insert(
152                "defer_reason".to_string(),
153                Value::String(defer_reason.clone()),
154            );
155        }
156        SmtpEvent::Bounced {
157            queue_id: _,
158            to,
159            relay_hostname,
160            relay_ip,
161            relay_port,
162            delay,
163            delay_before_queue,
164            delay_in_queue,
165            delay_connection,
166            delay_transmission,
167            dsn,
168            status,
169            bounce_reason,
170        } => {
171            event_data.insert(
172                "event_type".to_string(),
173                Value::String("bounced".to_string()),
174            );
175            event_data.insert("to".to_string(), Value::String(to.clone()));
176
177            if let Some(hostname) = relay_hostname {
178                event_data.insert(
179                    "relay_hostname".to_string(),
180                    Value::String(hostname.clone()),
181                );
182            }
183            if let Some(ip) = relay_ip {
184                event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
185            }
186            if let Some(port) = relay_port {
187                event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
188            }
189            if let Some(delay_val) = delay {
190                event_data.insert(
191                    "delay".to_string(),
192                    Value::Number(Number::from_f64(*delay_val).unwrap()),
193                );
194            }
195
196            if let Some(delay_val) = delay_before_queue {
197                event_data.insert(
198                    "delay_before_queue".to_string(),
199                    Value::Number(Number::from_f64(*delay_val).unwrap()),
200                );
201            }
202            if let Some(delay_val) = delay_in_queue {
203                event_data.insert(
204                    "delay_in_queue".to_string(),
205                    Value::Number(Number::from_f64(*delay_val).unwrap()),
206                );
207            }
208            if let Some(delay_val) = delay_connection {
209                event_data.insert(
210                    "delay_connection".to_string(),
211                    Value::Number(Number::from_f64(*delay_val).unwrap()),
212                );
213            }
214            if let Some(delay_val) = delay_transmission {
215                event_data.insert(
216                    "delay_transmission".to_string(),
217                    Value::Number(Number::from_f64(*delay_val).unwrap()),
218                );
219            }
220
221            if let Some(dsn_val) = dsn {
222                event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
223            }
224            event_data.insert("status".to_string(), Value::String(status.clone()));
225            event_data.insert(
226                "bounce_reason".to_string(),
227                Value::String(bounce_reason.clone()),
228            );
229        }
230        SmtpEvent::ConnectionTimeout {
231            queue_id: _,
232            target_hostname,
233            target_ip,
234            target_port,
235            timeout_duration,
236        } => {
237            event_data.insert(
238                "event_type".to_string(),
239                Value::String("connection_timeout".to_string()),
240            );
241            event_data.insert(
242                "target_hostname".to_string(),
243                Value::String(target_hostname.clone()),
244            );
245            event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
246            event_data.insert(
247                "target_port".to_string(),
248                Value::Number(Number::from(*target_port)),
249            );
250
251            if let Some(duration) = timeout_duration {
252                event_data.insert(
253                    "timeout_duration".to_string(),
254                    Value::Number(Number::from(*duration)),
255                );
256            }
257        }
258        SmtpEvent::ConnectionRefused {
259            queue_id: _,
260            target_hostname,
261            target_ip,
262            target_port,
263        } => {
264            event_data.insert(
265                "event_type".to_string(),
266                Value::String("connection_refused".to_string()),
267            );
268            event_data.insert(
269                "target_hostname".to_string(),
270                Value::String(target_hostname.clone()),
271            );
272            event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
273            event_data.insert(
274                "target_port".to_string(),
275                Value::Number(Number::from(*target_port)),
276            );
277        }
278        SmtpEvent::ConnectionLost {
279            queue_id: _,
280            target_hostname,
281            target_ip,
282            lost_stage,
283        } => {
284            event_data.insert(
285                "event_type".to_string(),
286                Value::String("connection_lost".to_string()),
287            );
288            event_data.insert(
289                "target_hostname".to_string(),
290                Value::String(target_hostname.clone()),
291            );
292            event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
293            event_data.insert("lost_stage".to_string(), Value::String(lost_stage.clone()));
294        }
295        SmtpEvent::ProtocolInteraction {
296            queue_id: _,
297            interaction_type,
298            details,
299        } => {
300            event_data.insert(
301                "event_type".to_string(),
302                Value::String("protocol_interaction".to_string()),
303            );
304            event_data.insert(
305                "interaction_type".to_string(),
306                Value::String(interaction_type.clone()),
307            );
308            event_data.insert("details".to_string(), Value::String(details.clone()));
309        }
310        SmtpEvent::Other {
311            queue_id: _,
312            event_type,
313            message,
314        } => {
315            event_data.insert("event_type".to_string(), Value::String(event_type.clone()));
316            event_data.insert("message".to_string(), Value::String(message.clone()));
317        }
318    }
319
320    event_data
321}