Hugo Osvaldo Barrera: 2 smtp: also send emails to Cc and Bcc smtp: avoid some unnecessary cloning 2 files changed, 14 insertions(+), 14 deletions(-)
Copy & paste the following snippet into your terminal to import this patchset into git:
curl -s https://lists.sr.ht/~soywod/pimalaya/patches/40091/mbox | git am -3Learn more about email & git
--- src/sender/smtp/smtp.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sender/smtp/smtp.rs b/src/sender/smtp/smtp.rs index aafe809..1cfaaf5 100644 --- a/src/sender/smtp/smtp.rs +++ b/src/sender/smtp/smtp.rs @@ -106,9 +106,9 @@ impl<'a> Sender for Smtp<'a> { email = mailparse::parse_mail(&buffer).map_err(Error::ParseEmailError)?; }; + let headers = email.get_headers(); let envelope = Envelope::new( - email - .get_headers() + headers .get_first_header("From") .and_then(|header| addrparse_header(header).ok()) .and_then(|addrs| addrs.first().cloned()) @@ -118,10 +118,11 @@ impl<'a> Sender for Smtp<'a> { } MailAddr::Single(single) => single.addr.parse().ok(), }), - email - .get_headers() + headers .get_all_headers("To") .into_iter() + .chain(headers.get_all_headers("Cc").into_iter()) + .chain(headers.get_all_headers("Bcc").into_iter()) .flat_map(|header| addrparse_header(header)) .flat_map(|addrs| { addrs @@ -142,6 +143,8 @@ impl<'a> Sender for Smtp<'a> { ) .map_err(Error::BuildEnvelopeError)?; + // TODO: Bcc should be removed from headers before sending the email. + self.transport()? .send_raw(&envelope, email.raw_bytes) .map_err(Error::SendError)?; -- 2.40.0
I found that *some* MTAs drop the Bcc header for you, but it's not safe to rely on this.
--- src/sender/smtp/smtp.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/sender/smtp/smtp.rs b/src/sender/smtp/smtp.rs index 1cfaaf5..126247f 100644 --- a/src/sender/smtp/smtp.rs +++ b/src/sender/smtp/smtp.rs @@ -111,7 +111,7 @@ impl<'a> Sender for Smtp<'a> { headers .get_first_header("From") .and_then(|header| addrparse_header(header).ok()) - .and_then(|addrs| addrs.first().cloned()) + .and_then(|addrs| addrs.into_inner().into_iter().next()) .and_then(|addr| match addr { MailAddr::Group(group) => { group.addrs.first().and_then(|addr| addr.addr.parse().ok()) @@ -123,22 +123,19 @@ impl<'a> Sender for Smtp<'a> { .into_iter() .chain(headers.get_all_headers("Cc").into_iter()) .chain(headers.get_all_headers("Bcc").into_iter()) - .flat_map(|header| addrparse_header(header)) + .flat_map(addrparse_header) .flat_map(|addrs| { addrs - .iter() + .into_inner() + .into_iter() .map(|addr| match addr { - MailAddr::Group(group) => group - .addrs - .iter() - .map(|addr| addr.addr.clone()) - .collect::<Vec<_>>(), - MailAddr::Single(single) => vec![single.addr.clone()], + MailAddr::Group(group) => group.addrs.into_iter().collect::<Vec<_>>(), + MailAddr::Single(single) => vec![single], }) .collect::<Vec<_>>() }) .flatten() - .flat_map(|addr| addr.parse()) + .flat_map(|addr| addr.addr.parse()) .collect::<Vec<_>>(), ) .map_err(Error::BuildEnvelopeError)?; -- 2.40.0