From e068c2d41f1bffb7186ec19675ee0d49c0df8dae Mon Sep 17 00:00:00 2001 From: Alexis Mousset Date: Mon, 2 Jan 2017 23:12:03 +0100 Subject: [PATCH 1/2] feat(email): Use Enveloppe directly --- src/email/mod.rs | 71 +++++++++++++++++++++-------------- src/transport/file/mod.rs | 4 +- src/transport/sendmail/mod.rs | 2 +- src/transport/smtp/mod.rs | 10 ++--- src/transport/stub/mod.rs | 4 +- 5 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/email/mod.rs b/src/email/mod.rs index 2af08d2..47eeb35 100644 --- a/src/email/mod.rs +++ b/src/email/mod.rs @@ -270,9 +270,9 @@ pub struct EmailBuilder { #[derive(PartialEq,Eq,Clone,Debug,Default)] pub struct Envelope { /// The envelope recipients' addresses - to: Vec, + pub to: Vec, /// The envelope sender address - from: String, + pub from: String, } impl Envelope { @@ -728,10 +728,8 @@ impl EmailBuilder { /// Email sendable by an SMTP client pub trait SendableEmail { - /// From address - fn from_address(&self) -> String; - /// To addresses - fn to_addresses(&self) -> Vec; + /// Envelope + fn envelope(&self) -> &Envelope; /// Message ID fn message_id(&self) -> String; /// Message content @@ -741,35 +739,31 @@ pub trait SendableEmail { /// Minimal email structure #[derive(Debug)] pub struct SimpleSendableEmail { - /// From address - from: String, - /// To addresses - to: Vec, - /// Message + /// Message envelope + envelope: Envelope, + /// Message content message: String, } impl SimpleSendableEmail { /// Returns a new email pub fn new(from_address: String, - to_address: Vec, + to_addresses: Vec, message: String) -> SimpleSendableEmail { SimpleSendableEmail { - from: from_address, - to: to_address, + envelope: Envelope { + from: from_address, + to: to_addresses, + }, message: message, } } } impl SendableEmail for SimpleSendableEmail { - fn from_address(&self) -> String { - self.from.clone() - } - - fn to_addresses(&self) -> Vec { - self.to.clone() + fn envelope(&self) -> &Envelope { + &self.envelope } fn message_id(&self) -> String { @@ -782,12 +776,8 @@ impl SendableEmail for SimpleSendableEmail { } impl SendableEmail for Email { - fn to_addresses(&self) -> Vec { - self.envelope.to.clone() - } - - fn from_address(&self) -> String { - self.envelope.from.clone() + fn envelope(&self) -> &Envelope { + &self.envelope } fn message_id(&self) -> String { @@ -799,6 +789,31 @@ impl SendableEmail for Email { } } +/// Email sendable by any type of client, giving access to all fields +pub trait ExtractableEmail { + /// From address + fn from_address(&self) -> Option; + /// To addresses + fn to_addresses(&self) -> Vec; + /// Cc addresses + fn cc_addresses(&self) -> Vec; + /// Bcc addresses + fn bcc_addresses(&self) -> Vec; + /// Replay-To addresses + fn reply_to_address(&self) -> String; + /// Subject + fn subject(&self) -> String; + /// Message ID + fn message_id(&self) -> String; + /// Other Headers + fn headers(&self) -> Vec; + /// html content + fn html(self) -> String; + /// text content + fn text(self) -> String; +} + + #[cfg(test)] mod test { use email_format::{Header, MimeMessage}; @@ -931,8 +946,8 @@ mod test { .build() .unwrap(); - assert_eq!(email.from_address(), "sender@localhost".to_string()); - assert_eq!(email.to_addresses(), + assert_eq!(email.envelope().from, "sender@localhost".to_string()); + assert_eq!(email.envelope().to, vec!["user@localhost".to_string(), "cc@localhost".to_string(), "bcc@localhost".to_string()]); diff --git a/src/transport/file/mod.rs b/src/transport/file/mod.rs index dd1ce1a..6bdac2c 100644 --- a/src/transport/file/mod.rs +++ b/src/transport/file/mod.rs @@ -34,8 +34,8 @@ impl EmailTransport for FileEmailTransport { let log_line = format!("{}: from=<{}> to=<{}>\n", email.message_id(), - email.from_address(), - email.to_addresses().join("> to=<")); + email.envelope().from, + email.envelope().to.join("> to=<")); try!(f.write_all(log_line.as_bytes())); try!(f.write_all(email.message().as_bytes())); diff --git a/src/transport/sendmail/mod.rs b/src/transport/sendmail/mod.rs index cb19b62..4ef989b 100644 --- a/src/transport/sendmail/mod.rs +++ b/src/transport/sendmail/mod.rs @@ -31,7 +31,7 @@ impl EmailTransport for SendmailTransport { fn send(&mut self, email: T) -> SendmailResult { // Spawn the sendmail command let mut process = try!(Command::new(&self.command) - .args(&["-i", "-f", &email.from_address(), &email.to_addresses().join(" ")]) + .args(&["-i", "-f", &email.envelope().from, &email.envelope().to.join(" ")]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .spawn()); diff --git a/src/transport/smtp/mod.rs b/src/transport/smtp/mod.rs index 9e2678f..8efac17 100644 --- a/src/transport/smtp/mod.rs +++ b/src/transport/smtp/mod.rs @@ -290,9 +290,6 @@ impl EmailTransport for SmtpTransport { // Extract email information let message_id = email.message_id(); - let from_address = email.from_address(); - let to_addresses = email.to_addresses(); - let message = email.message(); // Check if the connection is still available if (self.state.connection_reuse_count > 0) && (!self.client.is_connected()) { @@ -383,13 +380,13 @@ impl EmailTransport for SmtpTransport { (false, _) => None, }; - try_smtp!(self.client.mail(&from_address, mail_options), self); + try_smtp!(self.client.mail(&email.envelope().from, mail_options), self); // Log the mail command - info!("{}: from=<{}>", message_id, from_address); + info!("{}: from=<{}>", message_id, email.envelope().from); // Recipient - for to_address in &to_addresses { + for to_address in &email.envelope().to { try_smtp!(self.client.rcpt(&to_address), self); // Log the rcpt command info!("{}: to=<{}>", message_id, to_address); @@ -399,6 +396,7 @@ impl EmailTransport for SmtpTransport { try_smtp!(self.client.data(), self); // Message content + let message = email.message(); let result = self.client.message(&message); if result.is_ok() { diff --git a/src/transport/stub/mod.rs b/src/transport/stub/mod.rs index df2caa0..295c3c6 100644 --- a/src/transport/stub/mod.rs +++ b/src/transport/stub/mod.rs @@ -18,8 +18,8 @@ impl EmailTransport for StubEmailTransport { info!("{}: from=<{}> to=<{:?}>", email.message_id(), - email.from_address(), - email.to_addresses()); + email.envelope().from, + email.envelope().to); Ok(()) } From 315e248d63b35209b04c1e9fb983b890d77bd90d Mon Sep 17 00:00:00 2001 From: Alexis Mousset Date: Sun, 12 Feb 2017 16:22:58 +0100 Subject: [PATCH 2/2] feat(all): Update env_logger --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d116870..f23b048 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ time = "^0.1" uuid = { version = "^0.3", features = ["v4"] } [dev-dependencies] -env_logger = "^0.3" +env_logger = "^0.4" [features] unstable = []