Tristan Daniël Maat
9c5f1dbca3
We should probably read configuration to determine where mail should go, but for now should suffice.
51 lines
1.4 KiB
Rust
51 lines
1.4 KiB
Rust
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 = "<email>")]
|
|
fn mail_post(email: Form<Email>) -> Result<Flash<Redirect>, Flash<Redirect>> {
|
|
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<Route> {
|
|
routes![mail_post]
|
|
}
|