Skip to content

Commit cd8cff7

Browse files
authored
feat: do not use format=flowed in outgoing messages (#6256)
Text parts are using quoted-printable encoding which takes care of wrapping long lines, so using format=flowed is unnecessary. This improves compatibility with receivers which do not support format=flowed. Receiving format=flowed messages is still possible, receiver side of Delta Chat is unchanged.
1 parent a319c1e commit cd8cff7

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

src/mimefactory.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use anyhow::{bail, Context as _, Result};
66
use base64::Engine as _;
77
use chrono::TimeZone;
88
use email::Mailbox;
9-
use format_flowed::{format_flowed, format_flowed_quote};
109
use lettre_email::{Address, Header, MimeMultipartType, PartBuilder};
1110
use tokio::fs;
1211

@@ -1300,9 +1299,18 @@ impl MimeFactory {
13001299

13011300
let final_text = placeholdertext.as_deref().unwrap_or(&msg.text);
13021301

1303-
let mut quoted_text = msg
1304-
.quoted_text()
1305-
.map(|quote| format_flowed_quote(&quote) + "\r\n\r\n");
1302+
let mut quoted_text = None;
1303+
if let Some(msg_quoted_text) = msg.quoted_text() {
1304+
let mut some_quoted_text = String::new();
1305+
for quoted_line in msg_quoted_text.split('\n') {
1306+
some_quoted_text += "> ";
1307+
some_quoted_text += quoted_line;
1308+
some_quoted_text += "\r\n";
1309+
}
1310+
some_quoted_text += "\r\n";
1311+
quoted_text = Some(some_quoted_text)
1312+
}
1313+
13061314
if !is_encrypted && msg.param.get_bool(Param::ProtectQuote).unwrap_or_default() {
13071315
// Message is not encrypted but quotes encrypted message.
13081316
quoted_text = Some("> ...\r\n\r\n".to_string());
@@ -1312,7 +1320,6 @@ impl MimeFactory {
13121320
// Delta Chat.
13131321
quoted_text = Some("\r\n".to_string());
13141322
}
1315-
let flowed_text = format_flowed(final_text);
13161323

13171324
let is_reaction = msg.param.get_int(Param::Reaction).unwrap_or_default() != 0;
13181325

@@ -1322,7 +1329,7 @@ impl MimeFactory {
13221329
"{}{}{}{}{}{}",
13231330
fwdhint.unwrap_or_default(),
13241331
quoted_text.unwrap_or_default(),
1325-
escape_message_footer_marks(&flowed_text),
1332+
escape_message_footer_marks(final_text),
13261333
if !final_text.is_empty() && !footer.is_empty() {
13271334
"\r\n\r\n"
13281335
} else {
@@ -1332,10 +1339,8 @@ impl MimeFactory {
13321339
footer
13331340
);
13341341

1335-
let mut main_part = PartBuilder::new().header((
1336-
"Content-Type",
1337-
"text/plain; charset=utf-8; format=flowed; delsp=no",
1338-
));
1342+
let mut main_part =
1343+
PartBuilder::new().header(("Content-Type", "text/plain; charset=utf-8"));
13391344
main_part = self.add_message_text(main_part, message_text);
13401345

13411346
if is_reaction {

src/receive_imf/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ async fn test_classic_mailing_list() -> Result<()> {
10681068
let mime = sent.payload();
10691069

10701070
println!("Sent mime message is:\n\n{mime}\n\n");
1071-
assert!(mime.contains("Content-Type: text/plain; charset=utf-8; format=flowed; delsp=no\r\n"));
1071+
assert!(mime.contains("Content-Type: text/plain; charset=utf-8\r\n"));
10721072
assert!(mime.contains("Subject: =?utf-8?q?Re=3A_=5Bdelta-dev=5D_What=27s_up=3F?=\r\n"));
10731073
assert!(mime.contains("MIME-Version: 1.0\r\n"));
10741074
assert!(mime.contains("In-Reply-To: <38942@posteo.org>\r\n"));

0 commit comments

Comments
 (0)