Commit
+48 -0 +/-2 browse
1 | diff --git a/maitred/src/lib.rs b/maitred/src/lib.rs |
2 | index 189649b..18658ff 100644 |
3 | --- a/maitred/src/lib.rs |
4 | +++ b/maitred/src/lib.rs |
5 | @@ -58,6 +58,7 @@ pub use mail_parser; |
6 | pub use smtp_proto; |
7 | |
8 | mod error; |
9 | + mod rewrite; |
10 | mod server; |
11 | mod session; |
12 | mod transport; |
13 | @@ -85,4 +86,5 @@ macro_rules! smtp_response { |
14 | Response::General(SmtpResponse::new($code, $e1, $e2, $e3, $name.to_string())) |
15 | }; |
16 | } |
17 | + |
18 | pub(crate) use smtp_response; |
19 | diff --git a/maitred/src/rewrite.rs b/maitred/src/rewrite.rs |
20 | new file mode 100644 |
21 | index 0000000..4b76dac |
22 | --- /dev/null |
23 | +++ b/maitred/src/rewrite.rs |
24 | @@ -0,0 +1,46 @@ |
25 | + use mail_parser::{Message, MessageParser}; |
26 | + |
27 | + /// Wrapper around raw bytes that allows for easy modification of an email. |
28 | + pub struct Rewrite<'a>(pub &'a mut Vec<u8>); |
29 | + |
30 | + impl<'a> Rewrite<'a> { |
31 | + /// Prepend a header to the message body |
32 | + pub fn with_header(&mut self, key: &str, value: &str) { |
33 | + let header: Vec<u8> = format!("{}: {}", key, value).bytes().collect(); |
34 | + self.0.splice(0..0, header); |
35 | + } |
36 | + |
37 | + /// Return a parsed Message |
38 | + pub fn message(&'a self) -> Option<Message<'a>> { |
39 | + let message = MessageParser::default().parse(self.0.as_slice()); |
40 | + message |
41 | + } |
42 | + } |
43 | + |
44 | + #[cfg(test)] |
45 | + mod test { |
46 | + use super::*; |
47 | + |
48 | + const TEST_EMAIL: &str = r#" |
49 | + Date: Mon, 2 Sep 2024 00:17:18 +0200 |
50 | + From: kevin <kevin@ayllu-dev.local> |
51 | + To: hello@example.org |
52 | + Subject: Fuu |
53 | + Message-ID: <ewo47gsen3mimmdzlg5v4otplgiwwyogq7avzbs26lxnir3rem@xgg5xxzon6f7> |
54 | + MIME-Version: 1.0 |
55 | + Content-Type: text/plain; charset=us-ascii |
56 | + Content-Disposition: inline |
57 | + |
58 | + Hello World |
59 | + "#; |
60 | + |
61 | + #[test] |
62 | + fn test_apppend_header() { |
63 | + let mut email_bytes = TEST_EMAIL.as_bytes().to_vec(); |
64 | + let mut rewrite = Rewrite(&mut email_bytes); |
65 | + rewrite.with_header("a", "b"); |
66 | + let message = rewrite.message().unwrap(); |
67 | + let value = message.header("a").unwrap(); |
68 | + assert!(value.as_text().unwrap() == "b"); |
69 | + } |
70 | + } |