+ input.to_vec()
+ }
+
+ fn server_message(&mut self, input: &[u8]) -> Vec<u8> {
+ let command = String::from_utf8_lossy(input);
+ let contains_ok_completed = self
+ .tags
+ .iter()
+ .any(|tag| command.contains(&format!("{tag} OK Completed")));
+
+ // We want to only modify responses that were a result of a MAILBOX call.
+ if !contains_ok_completed {
+ return input.to_vec();
+ }
+
+ let lines: Vec<String> = command
+ .lines()
+ .filter_map(|line| {
+ // The IMAPv3 spec specifically says INBOX is excluded from MAILBOX
+ if line.starts_with("* LIST") && line.trim_end().ends_with("\"/\" INBOX") {
+ return None;
+ }
+
+ // Transform IMAPv4 "* LIST" lines to IMAPv3 "* MAILBOX"
+ if line.starts_with("* LIST") {
+ if let Some(last_slash_pos) = line.rfind('/') {
+ let mailbox_name = line[(last_slash_pos + 1)..]
+ .replace('"', "")
+ .trim();
+ return Some(format!("* MAILBOX {mailbox_name}\r"));
+ }
+ }
+
+ Some(line.to_string())
+ })
+ .collect();
+
+ lines.join("\n").into_bytes()