Add SendableEmail trait

This commit is contained in:
Alexis Mousset
2014-12-10 12:31:45 +01:00
parent 64636c6577
commit cc2be13588
4 changed files with 27 additions and 19 deletions

View File

@@ -32,7 +32,7 @@ fn sendmail(source_address: &str, recipient_addresses: &[&str], message: &str, s
email.from(source_address);
email.body(message);
email.subject(subject);
email.date();
email.date_now();
let mut email_client =
Client::new(
@@ -40,7 +40,7 @@ fn sendmail(source_address: &str, recipient_addresses: &[&str], message: &str, s
Some(my_hostname),
);
email_client.send_email(
email.get_sendable_email()
email
)
}

View File

@@ -104,9 +104,16 @@ impl<S: Connecter + ClientStream + Clone = TcpStream> Client<S> {
}
/// Sends an email
pub fn send_email(&mut self, email: SendableEmail) -> SmtpResult {
pub fn send_email<T: SendableEmail>(&mut self, email: T) -> SmtpResult {
let from_address = email.from_address();
let to_addresses = email.to_addresses();
let message = email.message();
// Connect to the server
try!(self.connect());
if !self.is_connected() {
try!(self.connect());
}
// Extended Hello or Hello
if let Err(error) = self.ehlo() {
@@ -124,15 +131,15 @@ impl<S: Connecter + ClientStream + Clone = TcpStream> Client<S> {
debug!("server {}", self.server_info.as_ref().unwrap());
// Mail
try_smtp!(self.mail(email.from_address.as_slice()) self);
try_smtp!(self.mail(from_address.as_slice()) self);
// Log the mail command
info!("from=<{}>, size={}, nrcpt={}", email.from_address, email.message.len(), email.to_addresses.len());
info!("from=<{}>, size={}, nrcpt={}", from_address, message.len(), to_addresses.len());
// Recipient
// TODO Return rejected addresses
// TODO Manage the number of recipients
for to_address in email.to_addresses.iter() {
for to_address in to_addresses.iter() {
try_smtp!(self.rcpt(to_address.as_slice()) self);
}
@@ -140,14 +147,14 @@ impl<S: Connecter + ClientStream + Clone = TcpStream> Client<S> {
try_smtp!(self.data() self);
// Message content
let sent = try_smtp!(self.message(email.message.as_slice()) self);
let sent = try_smtp!(self.message(message.as_slice()) self);
// Log the rcpt command
info!("to=<{}>, status=sent ({})",
email.to_addresses.connect(">, to=<"), sent);
to_addresses.connect(">, to=<"), sent);
// Quit
try_smtp!(self.quit() self);
//try_smtp!(self.quit() self);
return Ok(sent);
}

View File

@@ -33,10 +33,10 @@
//! email.from("user@example.com");
//! email.subject("Hello world");
//! email.body("Hi, Hello world.");
//! email.date();
//! email.date_now();
//!
//! let mut client = Client::localhost();
//! let result = client.send_email(email.get_sendable_email());
//! let result = client.send_email(email);
//! assert!(result.is_ok());
//! ```
//!
@@ -55,13 +55,13 @@
//! email.body("Hi, Hello world.");
//! email.reply_to("contact@example.com");
//! email.add_header(("X-Custom-Header", "my header"));
//! email.date();
//! email.date_now();
//!
//! let mut client = Client::new(
//! ("server.tld", 10025), // remote server and custom port
//! Some("my.hostname.tld"), // my hostname
//! );
//! let result = client.send_email(email.get_sendable_email());
//! let result = client.send_email(email);
//! assert!(result.is_ok());
//! ```

View File

@@ -9,9 +9,10 @@
//! SMTP sendable email
#[deriving(Clone)]
pub struct SendableEmail {
pub from_address: String,
pub to_addresses: Vec<String>,
pub message: String,
/// Converts to an `Header`
pub trait SendableEmail {
/// Converts to an `Header` struct
fn from_address(&self) -> String;
fn to_addresses(&self) -> Vec<String>;
fn message(&self) -> String;
}