Письмо в Rust
Готовое сообщение задает, кто отправитель, кто получатель и какой простой текст лежит в теле. Сборка идет цепочкой шагов, а каждый шаг может вернуть сбой, который разбирают до передачи в транспорт.
Создайте проект Cargo и из его корня выполните команду добавления крейта с поддержкой записи в файл:
cargo add lettre --features file-transport,builder
Перед отправкой создайте каталог out
и соберите короткое сообщение с учебными
адресами на example.com:
use lettre::{FileTransport, Message, Transport};
fn main() {
match std::fs::create_dir_all("out") {
Ok(()) => {}
Err(e) => {
println!("{}", e);
return;
}
}
let from_addr = match "sender@example.com".parse() {
Ok(a) => a,
Err(e) => {
println!("{}", e);
return;
}
};
let to_addr = match "user@example.com".parse() {
Ok(a) => a,
Err(e) => {
println!("{}", e);
return;
}
};
let email = match Message::builder()
.from(from_addr)
.to(to_addr)
.subject("Hi")
.body(String::from("hello"))
{
Ok(m) => m,
Err(e) => {
println!("{}", e);
return;
}
};
let sender = FileTransport::new("out");
match sender.send(&email) {
Ok(_) => println!("saved"),
Err(e) => println!("{}", e),
}
}
При успехе в out появится файл
с текстом письма, а на экране строка
saved. Сбой разбора адреса или
тела попадет в ветку с текстом ошибки.
Два сообщения подряд можно сохранить в один каталог, разбирая каждый исход отдельно:
use lettre::{FileTransport, Message, Transport};
fn main() {
match std::fs::create_dir_all("out") {
Ok(()) => {}
Err(e) => {
println!("{}", e);
return;
}
}
let sender = FileTransport::new("out");
let from_addr = match "sender@example.com".parse() {
Ok(a) => a,
Err(e) => {
println!("{}", e);
return;
}
};
let first_to = match "user@example.com".parse() {
Ok(a) => a,
Err(e) => {
println!("{}", e);
return;
}
};
let first = match Message::builder()
.from(from_addr)
.to(first_to)
.subject("Hi")
.body(String::from("hello"))
{
Ok(m) => m,
Err(e) => {
println!("{}", e);
return;
}
};
match sender.send(&first) {
Ok(_) => println!("first"),
Err(e) => println!("{}", e),
}
let second_to = match "team@example.com".parse() {
Ok(a) => a,
Err(e) => {
println!("{}", e);
return;
}
};
let from_again = match "sender@example.com".parse() {
Ok(a) => a,
Err(e) => {
println!("{}", e);
return;
}
};
let second = match Message::builder()
.from(from_again)
.to(second_to)
.subject("Hi")
.body(String::from("again"))
{
Ok(m) => m,
Err(e) => {
println!("{}", e);
return;
}
};
match sender.send(&second) {
Ok(_) => println!("second"),
Err(e) => println!("{}", e),
}
}
Дан адрес:
team@example.com
Разберите его в тип ящика через сопоставление,
укажите как получателя в сборке и сохраните
сообщение в out с темой "Ping"
и телом "ok".
Скажите, на каком шаге появится сбой, если строка получателя не похожа на адрес электронной почты.
Дан адрес:
sender@example.com
Запишите функцию, которая собирает
сообщение с этим отправителем, получателем
user@example.com и телом из
одного слова, а в main разберите
ее исход и напечатайте "built"
или текст сбоя.