From 62df24c5b1640cac0b52e51b326a1df845cdc356 Mon Sep 17 00:00:00 2001 From: Alexis Mousset Date: Sun, 25 Oct 2015 17:47:07 +0100 Subject: [PATCH] Add file transport --- benches/{smtp.rs => transport_smtp.rs} | 0 examples/transport_file.rs | 20 ++++++++++ src/lib.rs | 2 +- src/transport/error.rs | 2 +- src/transport/file/mod.rs | 52 ++++++++++++++++++++++++++ src/transport/mod.rs | 2 +- src/transport/smtp/authentication.rs | 4 +- src/transport/stub/mod.rs | 2 +- tests/lib.rs | 1 + tests/transport_file.rs | 19 ++++++++++ 10 files changed, 98 insertions(+), 6 deletions(-) rename benches/{smtp.rs => transport_smtp.rs} (100%) create mode 100644 examples/transport_file.rs create mode 100644 src/transport/file/mod.rs create mode 100644 tests/transport_file.rs diff --git a/benches/smtp.rs b/benches/transport_smtp.rs similarity index 100% rename from benches/smtp.rs rename to benches/transport_smtp.rs diff --git a/examples/transport_file.rs b/examples/transport_file.rs new file mode 100644 index 0000000..3720a64 --- /dev/null +++ b/examples/transport_file.rs @@ -0,0 +1,20 @@ +extern crate lettre; + +use lettre::transport::file::FileEmailTransport; +use lettre::transport::EmailTransport; +use lettre::email::EmailBuilder; + + +fn main() { + let mut sender = FileEmailTransport::new("/tmp/"); + let email = EmailBuilder::new() + .to("root@localhost") + .from("user@localhost") + .body("Hello World!") + .subject("Hello") + .build() + .unwrap(); + let result = sender.send(email); + println!("{:?}", result); + assert!(result.is_ok()); +} diff --git a/src/lib.rs b/src/lib.rs index bcab438..5a91ca9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -151,7 +151,7 @@ #[macro_use] extern crate log; -extern crate rustc_serialize as serialize; +extern crate rustc_serialize; extern crate crypto; extern crate time; extern crate uuid; diff --git a/src/transport/error.rs b/src/transport/error.rs index e14db85..af7fd25 100644 --- a/src/transport/error.rs +++ b/src/transport/error.rs @@ -6,7 +6,7 @@ use std::fmt::{Display, Formatter}; use std::fmt; use transport::smtp::response::{Severity, Response}; -use serialize::base64::FromBase64Error; +use rustc_serialize::base64::FromBase64Error; use self::Error::*; /// An enum of all error kinds. diff --git a/src/transport/file/mod.rs b/src/transport/file/mod.rs new file mode 100644 index 0000000..ef3f1a3 --- /dev/null +++ b/src/transport/file/mod.rs @@ -0,0 +1,52 @@ +//! TODO + +use std::path::{Path, PathBuf}; +use std::io::prelude::*; +use std::fs::File; + +use transport::error::EmailResult; +use transport::smtp::response::Response; +use transport::EmailTransport; +use transport::smtp::response::{Code, Category, Severity}; +use email::SendableEmail; + + +/// TODO +pub struct FileEmailTransport { + path: PathBuf, +} + +impl FileEmailTransport { + /// Creates a new transport to the given directory + pub fn new>(path: P) -> FileEmailTransport { + let mut path_buf = PathBuf::new(); + path_buf.push(path); + FileEmailTransport {path: path_buf} + } +} + +impl EmailTransport for FileEmailTransport { + fn send(&mut self, email: T) -> EmailResult { + let mut file = self.path.clone(); + file.push(format!("{}.txt", email.message_id())); + + let mut f = try!(File::create(file.as_path())); + + let log_line = format!("{}: from=<{}> to=<{}>\n", + email.message_id(), + email.from_address(), + email.to_addresses().join("> to=<")); + + try!(f.write_all(log_line.as_bytes())); + try!(f.write_all(format!("{}", email.message()).as_bytes())); + + info!("{} status=", log_line); + + Ok(Response::new(Code::new(Severity::PositiveCompletion, Category::MailSystem, 0), + vec![format!("Ok: email written to {}", file.to_str().unwrap_or("non-UTF-8 path"))])) + } + + fn close(&mut self) { + () + } +} diff --git a/src/transport/mod.rs b/src/transport/mod.rs index a658e8a..95b4ac7 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -2,7 +2,7 @@ pub mod smtp; pub mod error; pub mod stub; -// pub mod file; +pub mod file; use transport::error::EmailResult; use email::SendableEmail; diff --git a/src/transport/smtp/authentication.rs b/src/transport/smtp/authentication.rs index 6cb71e6..1d2afc8 100644 --- a/src/transport/smtp/authentication.rs +++ b/src/transport/smtp/authentication.rs @@ -3,8 +3,8 @@ use std::fmt::{Display, Formatter}; use std::fmt; -use serialize::base64::{self, ToBase64, FromBase64}; -use serialize::hex::ToHex; +use rustc_serialize::base64::{self, ToBase64, FromBase64}; +use rustc_serialize::hex::ToHex; use crypto::hmac::Hmac; use crypto::md5::Md5; use crypto::mac::Mac; diff --git a/src/transport/stub/mod.rs b/src/transport/stub/mod.rs index d4383cc..b45a0f2 100644 --- a/src/transport/stub/mod.rs +++ b/src/transport/stub/mod.rs @@ -13,7 +13,7 @@ pub struct StubEmailTransport; impl EmailTransport for StubEmailTransport { fn send(&mut self, email: T) -> EmailResult { - info!("message '{}': from '{}' to '{:?}'", + info!("{}: from=<{}> to=<{:?}>", email.message_id(), email.from_address(), email.to_addresses()); diff --git a/tests/lib.rs b/tests/lib.rs index 57e5150..45a6ab9 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -2,3 +2,4 @@ extern crate lettre; mod transport_smtp; mod transport_stub; +mod transport_file; diff --git a/tests/transport_file.rs b/tests/transport_file.rs new file mode 100644 index 0000000..eeb2219 --- /dev/null +++ b/tests/transport_file.rs @@ -0,0 +1,19 @@ +extern crate lettre; + +use lettre::transport::file::FileEmailTransport; +use lettre::transport::EmailTransport; +use lettre::email::EmailBuilder; + +#[test] +fn file_transport() { + let mut sender = FileEmailTransport::new("/tmp/"); + let email = EmailBuilder::new() + .to("root@localhost") + .from("user@localhost") + .body("Hello World!") + .subject("Hello") + .build() + .unwrap(); + let result = sender.send(email); + assert!(result.is_ok()); +}