From 4928d9b619427a99598c42cbf43e392d25325dad Mon Sep 17 00:00:00 2001 From: sonwr Date: Fri, 13 Mar 2026 04:13:01 +0000 Subject: [PATCH] fix(gmail): RFC 2047 encode draft address headers --- ...fix-gmail-rfc2047-draft-address-headers.md | 5 +++ src/helpers/gmail/mod.rs | 36 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 .changeset/fix-gmail-rfc2047-draft-address-headers.md diff --git a/.changeset/fix-gmail-rfc2047-draft-address-headers.md b/.changeset/fix-gmail-rfc2047-draft-address-headers.md new file mode 100644 index 00000000..affb2430 --- /dev/null +++ b/.changeset/fix-gmail-rfc2047-draft-address-headers.md @@ -0,0 +1,5 @@ +--- +"@googleworkspace/cli": patch +--- + +fix(gmail): RFC 2047 encode non-ASCII draft From/Cc/Bcc headers diff --git a/src/helpers/gmail/mod.rs b/src/helpers/gmail/mod.rs index 3e8d3274..c21aaba0 100644 --- a/src/helpers/gmail/mod.rs +++ b/src/helpers/gmail/mod.rs @@ -506,17 +506,26 @@ impl MessageBuilder<'_> { )); if let Some(from) = self.from { - headers.push_str(&format!("\r\nFrom: {}", sanitize_header_value(from))); + headers.push_str(&format!( + "\r\nFrom: {}", + encode_header_value(&sanitize_header_value(from)) + )); } if let Some(cc) = self.cc { - headers.push_str(&format!("\r\nCc: {}", sanitize_header_value(cc))); + headers.push_str(&format!( + "\r\nCc: {}", + encode_header_value(&sanitize_header_value(cc)) + )); } // The Gmail API reads the Bcc header to route to those recipients, // then strips it before delivery. if let Some(bcc) = self.bcc { - headers.push_str(&format!("\r\nBcc: {}", sanitize_header_value(bcc))); + headers.push_str(&format!( + "\r\nBcc: {}", + encode_header_value(&sanitize_header_value(bcc)) + )); } format!("{}\r\n\r\n{}", headers, body) @@ -1316,6 +1325,27 @@ mod tests { assert!(!raw.contains("Solar — Quote Request")); } + #[test] + fn test_message_builder_encodes_non_ascii_optional_headers() { + let raw = MessageBuilder { + to: "alice@example.com", + subject: "Hello", + from: Some("\"日本語名前\" "), + cc: Some("\"日本語名前\" "), + bcc: Some("\"日本語名前\" "), + threading: None, + html: false, + } + .build("Body"); + + assert!(raw.contains("From: =?UTF-8?B?")); + assert!(raw.contains("Cc: =?UTF-8?B?")); + assert!(raw.contains("Bcc: =?UTF-8?B?")); + assert!(!raw.contains("From: \"日本語名前\" ")); + assert!(!raw.contains("Cc: \"日本語名前\" ")); + assert!(!raw.contains("Bcc: \"日本語名前\" ")); + } + #[test] fn test_message_builder_sanitizes_crlf_injection() { let raw = MessageBuilder {