Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpMlMs 278 of 288 menu
◀ ▶

Письмо в 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" или текст сбоя.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить