summaryrefslogtreecommitdiffstats
path: root/smtp/src/request.rs
diff options
context:
space:
mode:
Diffstat (limited to 'smtp/src/request.rs')
-rw-r--r--smtp/src/request.rs176
1 files changed, 90 insertions, 86 deletions
diff --git a/smtp/src/request.rs b/smtp/src/request.rs
index 2737836..0a4c094 100644
--- a/smtp/src/request.rs
+++ b/smtp/src/request.rs
@@ -1,27 +1,23 @@
use std::mem;
-use new_tokio_smtp::send_mail::{
- self as smtp,
- MailAddress,
- EnvelopData
-};
+use new_tokio_smtp::send_mail::{self as smtp, EnvelopData, MailAddress};
-use mail_internals::{
- MailType,
- encoder::{EncodingBuffer, EncodableInHeader},
- error::EncodingError
-};
use headers::{
- headers::{Sender, _From, _To},
+ error::BuildInValidationError,
header_components::Mailbox,
- error::{BuildInValidationError}
+ headers::{Sender, _From, _To},
};
use mail::{
+ error::{MailError, OtherValidationError},
Mail,
- error::{MailError, OtherValidationError}
+};
+use mail_internals::{
+ encoder::{EncodableInHeader, EncodingBuffer},
+ error::EncodingError,
+ MailType,
};
-use ::error::{ OtherValidationError as AnotherOtherValidationError };
+use error::OtherValidationError as AnotherOtherValidationError;
/// This type contains a mail and potentially some envelop data.
///
@@ -35,7 +31,7 @@ use ::error::{ OtherValidationError as AnotherOtherValidationError };
#[derive(Clone, Debug)]
pub struct MailRequest {
mail: Mail,
- envelop_data: Option<EnvelopData>
+ envelop_data: Option<EnvelopData>,
}
impl From<Mail> for MailRequest {
@@ -44,13 +40,13 @@ impl From<Mail> for MailRequest {
}
}
-
-
impl MailRequest {
-
/// creates a new `MailRequest` from a `Mail` instance
pub fn new(mail: Mail) -> Self {
- MailRequest { mail, envelop_data: None }
+ MailRequest {
+ mail,
+ envelop_data: None,
+ }
}
/// create a new `MailRequest` and use custom smtp `EnvelopData`
@@ -60,7 +56,10 @@ impl MailRequest {
/// cases where you need to set it manually just import it from
/// `new-tokio-smtp`.
pub fn new_with_envelop(mail: Mail, envelop: EnvelopData) -> Self {
- MailRequest { mail, envelop_data: Some(envelop) }
+ MailRequest {
+ mail,
+ envelop_data: Some(envelop),
+ }
}
/// replace the smtp `EnvelopData`
@@ -69,14 +68,16 @@ impl MailRequest {
}
pub fn _into_mail_with_envelop(self) -> Result<(Mail, EnvelopData), MailError> {
- let envelop =
- if let Some(envelop) = self.envelop_data { envelop }
- else { derive_envelop_data_from_mail(&self.mail)? };
+ let envelop = if let Some(envelop) = self.envelop_data {
+ envelop
+ } else {
+ derive_envelop_data_from_mail(&self.mail)?
+ };
Ok((self.mail, envelop))
}
- #[cfg(not(feature="extended-api"))]
+ #[cfg(not(feature = "extended-api"))]
#[inline(always)]
pub(crate) fn into_mail_with_envelop(self) -> Result<(Mail, EnvelopData), MailError> {
self._into_mail_with_envelop()
@@ -87,7 +88,7 @@ impl MailRequest {
/// If envelop data was explicitly set it is returned.
/// If no envelop data was explicitly given it is derived from the
/// Mail header fields using `derive_envelop_data_from_mail`.
- #[cfg(feature="extended-api")]
+ #[cfg(feature = "extended-api")]
#[inline(always)]
pub fn into_mail_with_envelop(self) -> Result<(Mail, EnvelopData), MailError> {
self._into_mail_with_envelop()
@@ -97,9 +98,13 @@ impl MailRequest {
fn mailaddress_from_mailbox(mailbox: &Mailbox) -> Result<MailAddress, EncodingError> {
let email = &mailbox.email;
let needs_smtputf8 = email.check_if_internationalized();
- let mt = if needs_smtputf8 { MailType::Internationalized } else { MailType::Ascii };
+ let mt = if needs_smtputf8 {
+ MailType::Internationalized
+ } else {
+ MailType::Ascii
+ };
let mut buffer = EncodingBuffer::new(mt);
- {
+ {
let mut writer = buffer.writer();
email.encode(&mut writer)?;
writer.commit_partial_header();
@@ -128,39 +133,36 @@ fn mailaddress_from_mailbox(mailbox: &Mailbox) -> Result<MailAddress, EncodingEr
/// - No To header
/// - A From header with multiple addresses but no Sender header
///
-pub fn derive_envelop_data_from_mail(mail: &Mail)
- -> Result<smtp::EnvelopData, MailError>
-{
+pub fn derive_envelop_data_from_mail(mail: &Mail) -> Result<smtp::EnvelopData, MailError> {
let headers = mail.headers();
- let smtp_from =
- if let Some(sender) = headers.get_single(Sender) {
- let sender = sender?;
- //TODO double check with from field
- mailaddress_from_mailbox(sender)?
- } else {
- let from = headers.get_single(_From)
- .ok_or(OtherValidationError::NoFrom)??;
-
- if from.len() > 1 {
- return Err(BuildInValidationError::MultiMailboxFromWithoutSender.into());
- }
+ let smtp_from = if let Some(sender) = headers.get_single(Sender) {
+ let sender = sender?;
+ //TODO double check with from field
+ mailaddress_from_mailbox(sender)?
+ } else {
+ let from = headers
+ .get_single(_From)
+ .ok_or(OtherValidationError::NoFrom)??;
+
+ if from.len() > 1 {
+ return Err(BuildInValidationError::MultiMailboxFromWithoutSender.into());
+ }
- mailaddress_from_mailbox(from.first())?
- };
+ mailaddress_from_mailbox(from.first())?
+ };
- let smtp_to =
- if let Some(to) = headers.get_single(_To) {
- let to = to?;
- to.try_mapped_ref(mailaddress_from_mailbox)?
- } else {
- return Err(AnotherOtherValidationError::NoTo.into());
- };
+ let smtp_to = if let Some(to) = headers.get_single(_To) {
+ let to = to?;
+ to.try_mapped_ref(mailaddress_from_mailbox)?
+ } else {
+ return Err(AnotherOtherValidationError::NoTo.into());
+ };
//TODO Cc, Bcc
Ok(EnvelopData {
from: Some(smtp_from),
- to: smtp_to
+ to: smtp_to,
})
}
@@ -169,15 +171,8 @@ mod test {
mod derive_envelop_data_from_mail {
use super::super::derive_envelop_data_from_mail;
- use mail::{
- Mail,
- Resource,
- test_utils::CTX
- };
- use headers::{
- headers::{_From, _To, Sender},
- };
-
+ use headers::headers::{Sender, _From, _To};
+ use mail::{test_utils::CTX, Mail, Resource};
fn mock_resource() -> Resource {
Resource::plain_text("abcd↓efg", CTX.unwrap())
@@ -187,11 +182,14 @@ mod test {
fn use_sender_if_given() {
let mut mail = Mail::new_singlepart_mail(mock_resource());
- mail.insert_headers(headers! {
- Sender: "strange@caffe.test",
- _From: ["ape@caffe.test", "epa@caffe.test"],
- _To: ["das@ding.test"]
- }.unwrap());
+ mail.insert_headers(
+ headers! {
+ Sender: "strange@caffe.test",
+ _From: ["ape@caffe.test", "epa@caffe.test"],
+ _To: ["das@ding.test"]
+ }
+ .unwrap(),
+ );
let envelop_data = derive_envelop_data_from_mail(&mail).unwrap();
@@ -204,10 +202,13 @@ mod test {
#[test]
fn use_from_if_no_sender_given() {
let mut mail = Mail::new_singlepart_mail(mock_resource());
- mail.insert_headers(headers! {
- _From: ["ape@caffe.test"],
- _To: ["das@ding.test"]
- }.unwrap());
+ mail.insert_headers(
+ headers! {
+ _From: ["ape@caffe.test"],
+ _To: ["das@ding.test"]
+ }
+ .unwrap(),
+ );
let envelop_data = derive_envelop_data_from_mail(&mail).unwrap();
@@ -220,10 +221,13 @@ mod test {
#[test]
fn fail_if_no_sender_but_multi_mailbox_from() {
let mut mail = Mail::new_singlepart_mail(mock_resource());
- mail.insert_headers(headers! {
- _From: ["ape@caffe.test", "a@b.test"],
- _To: ["das@ding.test"]
- }.unwrap());
+ mail.insert_headers(
+ headers! {
+ _From: ["ape@caffe.test", "a@b.test"],
+ _To: ["das@ding.test"]
+ }
+ .unwrap(),
+ );
let envelop_data = derive_envelop_data_from_mail(&mail);
@@ -234,29 +238,29 @@ mod test {
#[test]
fn use_to() {
let mut mail = Mail::new_singlepart_mail(mock_resource());
- mail.insert_headers(headers! {
- _From: ["ape@caffe.test"],
- _To: ["das@ding.test"]
- }.unwrap());
+ mail.insert_headers(
+ headers! {
+ _From: ["ape@caffe.test"],
+ _To: ["das@ding.test"]
+ }
+ .unwrap(),
+ );
let envelop_data = derive_envelop_data_from_mail(&mail).unwrap();
- assert_eq!(
- envelop_data.to.first().as_str(),
- "das@ding.test"
- );
+ assert_eq!(envelop_data.to.first().as_str(), "das@ding.test");
}
}
mod mailaddress_from_mailbox {
+ use super::super::mailaddress_from_mailbox;
use headers::{
+ header_components::{Email, Mailbox},
HeaderTryFrom,
- header_components::{Mailbox, Email}
};
- use super::super::mailaddress_from_mailbox;
#[test]
- #[cfg_attr(not(feature="test-with-traceing"), ignore)]
+ #[cfg_attr(not(feature = "test-with-traceing"), ignore)]
fn does_not_panic_with_tracing_enabled() {
let mb = Mailbox::try_from("hy@b").unwrap();
mailaddress_from_mailbox(&mb).unwrap();
@@ -294,4 +298,4 @@ mod test {
assert_eq!(address.needs_smtputf8(), true);
}
}
-} \ No newline at end of file
+}