use std::fs::create_dir_all; use lettre::{FileTransport, Transport}; use lettre_email::EmailBuilder; use rocket::request::{Form, FromForm}; use rocket::response::{Flash, Redirect}; use rocket::{post, routes, Route}; #[derive(FromForm)] struct Email { mail: String, subject: String, message: String, } fn send_mail(email: &Email) -> Result<(), String> { let email = EmailBuilder::new() .to("tm@tlater.net") .from(email.mail.clone()) .subject(email.subject.clone()) .text(email.message.clone()) .build() .map_err(|err| format!("Invalid email contents: {}", err))?; let mut mailer = FileTransport::new("/srv/mail"); if let Err(error) = create_dir_all("/srv/mail") { println!("Could not create mail directory: {}", error); }; mailer.send(email.into()).map_err(|err| { println!("Could not save mail: {}", err); "Failed to send email due to internal issues; please try again later".to_string() })?; Ok(()) } #[post("/mail.html", data = "")] fn mail_post(email: Form) -> Result, Flash> { match send_mail(&email) { Ok(_) => Ok(Flash::success( Redirect::to("/mail.html"), "Email sent successfully", )), Err(err) => Err(Flash::error(Redirect::to("/mail.html"), err)), } } pub fn routes() -> Vec { routes![mail_post] }