Ошибка отправки в Rust
Запись в каталог тоже может завершиться сбоем: каталог недоступен, нет прав или диск переполнен. Исход передачи возвращают в варианте успеха или ошибки, и программа сама решает, завершаться или идти дальше.
Сначала сохраним обычное сообщение и напечатаем результат:
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),
}
println!("next step");
}
После строки saved или текста
сбоя на экране появится next step.
Печать ошибки не обязана обрывать main,
если после сопоставления есть другой код.
Укажем несуществующий каталог и разберем сбой без выхода из функции:
use lettre::{FileTransport, Message, Transport};
fn main() {
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("/no/such/mail/dir");
match sender.send(&email) {
Ok(_) => println!("saved"),
Err(e) => println!("{}", e),
}
println!("after fail");
}
Дан адрес:
user@example.com
Соберите сообщение с этим получателем,
сохраните его в out и после
сопоставления исхода передачи выведите
"done" в любом случае.
Скажите, напечатается ли "after fail"
в примере с неверным каталогом, если
ветка сбоя только выводит текст ошибки.
Дан адрес:
sender@example.com
Разберите этот адрес отправителя через
сопоставление, при сбое выведите текст
и завершите main, при успехе
сохраните короткое сообщение в out.