Replace email builder by a new implementation (#393)

* Update dependencies (#386)

* Update dependencies and set MSRV to 1.40

* update hyperx

* Use display instead of description for errors

* Make hostname an optional feature

* Envelope from headers

* Update hyperx to 1.0

* rename builder to message

* Cleanup and make Transport send Messages

* Update rustls from 0.16 to 0.17

* Move transports into a common folder

* Merge imports from same crate

* Add message creation example to the site

* Hide "extern crate" in doc examples

* Add References and In-Reply-To methods

* Add message-id header

* Add blog posts and improve doc examples
This commit is contained in:
Alexis Mousset
2020-04-18 23:10:03 +02:00
committed by GitHub
parent a440ae5c79
commit 53aa5b4df6
63 changed files with 3753 additions and 1513 deletions

View File

@@ -1,32 +0,0 @@
use lettre::builder::EmailBuilder;
use lettre::{EmailAddress, Envelope};
#[test]
fn build_with_envelope_test() {
let e = Envelope::new(
Some(EmailAddress::new("from@example.org".to_string()).unwrap()),
vec![EmailAddress::new("to@example.org".to_string()).unwrap()],
)
.unwrap();
let _email = EmailBuilder::new()
.envelope(e)
.subject("subject")
.text("message")
.build()
.unwrap();
}
#[test]
fn build_with_envelope_without_from_test() {
let e = Envelope::new(
None,
vec![EmailAddress::new("to@example.org".to_string()).unwrap()],
)
.unwrap();
assert!(EmailBuilder::new()
.envelope(e)
.subject("subject")
.text("message")
.build()
.is_err());
}

View File

@@ -1,11 +1,14 @@
use std::env::{self, consts::EXE_EXTENSION};
use std::path::Path;
use std::process::Command;
use std::{
env::{self, consts::EXE_EXTENSION},
path::Path,
process::Command,
};
use walkdir::WalkDir;
#[test]
fn book_test() {
skeptic_test(Path::new("README.md"));
// README needs to be compatible with latest release
//skeptic_test(Path::new("README.md"));
for entry in WalkDir::new("website").into_iter().filter(|e| {
e.as_ref()
@@ -35,7 +38,6 @@ fn skeptic_test(path: &Path) {
.expect("Failed to spawn process")
.wait()
.expect("Failed to run process");
assert!(
result.success(),
format!("Failed to run rustdoc tests on {:?}", path)

View File

@@ -1,10 +1,10 @@
#[cfg(all(test, feature = "smtp-transport", feature = "connection-pool"))]
mod test {
use lettre::{ClientSecurity, Email, EmailAddress, Envelope, SmtpClient};
use lettre::{SmtpConnectionManager, Transport};
use lettre::{
ClientSecurity, Email, EmailAddress, Envelope, SmtpClient, SmtpConnectionManager, Transport,
};
use r2d2::Pool;
use std::sync::mpsc;
use std::thread;
use std::{sync::mpsc, thread};
fn email(message: &str) -> Email {
Email::new(

View File

@@ -1,40 +1,36 @@
#[cfg(test)]
#[cfg(feature = "file-transport")]
mod test {
use lettre::file::FileTransport;
use lettre::{Email, EmailAddress, Envelope, Transport};
use std::env::temp_dir;
use std::fs::remove_file;
use std::fs::File;
use std::io::Read;
use lettre::{transport::file::FileTransport, Message, Transport};
use std::{
env::temp_dir,
fs::{remove_file, File},
io::Read,
};
#[test]
fn file_transport() {
let mut sender = FileTransport::new(temp_dir());
let email = Email::new(
Envelope::new(
Some(EmailAddress::new("user@localhost".to_string()).unwrap()),
vec![EmailAddress::new("root@localhost".to_string()).unwrap()],
)
.unwrap(),
"id".to_string(),
"Hello ß☺ example".to_string().into_bytes(),
);
let message_id = email.message_id().to_string();
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse().unwrap())
.reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
.to("Hei <hei@domain.tld>".parse().unwrap())
.subject("Happy new year")
.date("Tue, 15 Nov 1994 08:12:31 GMT".parse().unwrap())
.body("Be happy!")
.unwrap();
let result = sender.send(email);
assert!(result.is_ok());
let id = result.unwrap();
let file = format!("{}/{}.json", temp_dir().to_str().unwrap(), message_id);
let file = temp_dir().join(format!("{}.json", id));
let mut f = File::open(file.clone()).unwrap();
let mut buffer = String::new();
let _ = f.read_to_string(&mut buffer);
assert_eq!(
buffer,
"{\"envelope\":{\"forward_path\":[\"root@localhost\"],\"reverse_path\":\"user@localhost\"},\"message_id\":\"id\",\"message\":[72,101,108,108,111,32,195,159,226,152,186,32,101,120,97,109,112,108,101]}"
);
"{\"envelope\":{\"forward_path\":[\"hei@domain.tld\"],\"reverse_path\":\"nobody@domain.tld\"},\"message\":[70,114,111,109,58,32,78,111,66,111,100,121,32,60,110,111,98,111,100,121,64,100,111,109,97,105,110,46,116,108,100,62,13,10,82,101,112,108,121,45,84,111,58,32,89,117,105,110,32,60,121,117,105,110,64,100,111,109,97,105,110,46,116,108,100,62,13,10,84,111,58,32,72,101,105,32,60,104,101,105,64,100,111,109,97,105,110,46,116,108,100,62,13,10,83,117,98,106,101,99,116,58,32,72,97,112,112,121,32,110,101,119,32,121,101,97,114,13,10,68,97,116,101,58,32,84,117,101,44,32,49,53,32,78,111,118,32,49,57,57,52,32,48,56,58,49,50,58,51,49,32,71,77,84,13,10,13,10,66,101,32,104,97,112,112,121,33]}");
remove_file(file).unwrap();
}
}

View File

@@ -1,21 +1,18 @@
#[cfg(test)]
#[cfg(feature = "sendmail-transport")]
mod test {
use lettre::sendmail::SendmailTransport;
use lettre::{Email, EmailAddress, Envelope, Transport};
use lettre::{transport::sendmail::SendmailTransport, Message, Transport};
#[test]
fn sendmail_transport_simple() {
let mut sender = SendmailTransport::new();
let email = Email::new(
Envelope::new(
Some(EmailAddress::new("user@localhost".to_string()).unwrap()),
vec![EmailAddress::new("root@localhost".to_string()).unwrap()],
)
.unwrap(),
"id".to_string(),
"Hello ß☺ example".to_string().into_bytes(),
);
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse().unwrap())
.reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
.to("Hei <hei@domain.tld>".parse().unwrap())
.subject("Happy new year")
.body("Be happy!")
.unwrap();
let result = sender.send(email);
println!("{:?}", result);

View File

@@ -1,20 +1,17 @@
#[cfg(test)]
#[cfg(feature = "smtp-transport")]
mod test {
use lettre::{ClientSecurity, Email, EmailAddress, Envelope, SmtpClient, Transport};
use lettre::{ClientSecurity, Message, SmtpClient, Transport};
#[test]
fn smtp_transport_simple() {
let email = Email::new(
Envelope::new(
Some(EmailAddress::new("user@localhost".to_string()).unwrap()),
vec![EmailAddress::new("root@localhost".to_string()).unwrap()],
)
.unwrap(),
"id".to_string(),
"Hello ß☺ example".to_string().into_bytes(),
);
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse().unwrap())
.reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
.to("Hei <hei@domain.tld>".parse().unwrap())
.subject("Happy new year")
.body("Be happy!")
.unwrap();
SmtpClient::new("127.0.0.1:2525", ClientSecurity::None)
.unwrap()
.transport()

View File

@@ -1,29 +1,17 @@
use lettre::stub::StubTransport;
use lettre::{Email, EmailAddress, Envelope, Transport};
use lettre::{transport::stub::StubTransport, Message, Transport};
#[test]
fn stub_transport() {
let mut sender_ok = StubTransport::new_positive();
let mut sender_ko = StubTransport::new(Err(()));
let email_ok = Email::new(
Envelope::new(
Some(EmailAddress::new("user@localhost".to_string()).unwrap()),
vec![EmailAddress::new("root@localhost".to_string()).unwrap()],
)
.unwrap(),
"id".to_string(),
"Hello ß☺ example".to_string().into_bytes(),
);
let email_ko = Email::new(
Envelope::new(
Some(EmailAddress::new("user@localhost".to_string()).unwrap()),
vec![EmailAddress::new("root@localhost".to_string()).unwrap()],
)
.unwrap(),
"id".to_string(),
"Hello ß☺ example".to_string().into_bytes(),
);
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse().unwrap())
.reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
.to("Hei <hei@domain.tld>".parse().unwrap())
.subject("Happy new year")
.body("Be happy!")
.unwrap();
sender_ok.send(email_ok).unwrap();
sender_ko.send(email_ko).unwrap_err();
sender_ok.send(email.clone()).unwrap();
sender_ko.send(email).unwrap_err();
}