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("mails");
|
||
|
if let Err(error) = create_dir_all("mails") {
|
||
|
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]
|
||
|
}
|