Use mailer

This commit is contained in:
Mo 2022-10-29 00:42:15 +02:00
parent e860ffa86d
commit 640517b48c

View file

@ -1,4 +1,4 @@
use rocket::form::{Form, FromForm, Strict}; use rocket::form::{Form, Strict};
use rocket::response::status::BadRequest; use rocket::response::status::BadRequest;
use rocket::response::Redirect; use rocket::response::Redirect;
use rocket::{get, post, uri, State}; use rocket::{get, post, uri, State};
@ -6,7 +6,10 @@ use rocket_dyn_templates::Template;
use serde::Serialize; use serde::Serialize;
use std::mem; use std::mem;
use crate::states; use crate::captcha_solutions;
use crate::config;
use crate::forms;
use crate::mailer;
#[derive(Serialize)] #[derive(Serialize)]
struct FormContext { struct FormContext {
@ -24,7 +27,7 @@ pub fn index(
email: Option<String>, email: Option<String>,
telefon: Option<String>, telefon: Option<String>,
message: Option<String>, message: Option<String>,
captcha_solutions: &State<states::SharedCaptchaSolutions>, captcha_solutions: &State<captcha_solutions::SharedCaptchaSolutions>,
) -> Result<Template, BadRequest<()>> { ) -> Result<Template, BadRequest<()>> {
let captcha = captcha::by_name(captcha::Difficulty::Easy, captcha::CaptchaName::Lucy); let captcha = captcha::by_name(captcha::Difficulty::Easy, captcha::CaptchaName::Lucy);
let captcha_base64 = match captcha.as_base64() { let captcha_base64 = match captcha.as_base64() {
@ -46,36 +49,39 @@ pub fn index(
Ok(Template::render("form", &form_context)) Ok(Template::render("form", &form_context))
} }
#[derive(FromForm)]
pub struct ContactForm {
id: u16,
name: String,
email: String,
telefon: String,
message: String,
captcha_answer: String,
}
#[post("/submit", data = "<form>")] #[post("/submit", data = "<form>")]
pub fn submit( pub fn submit(
mut form: Form<Strict<ContactForm>>, mut form: Form<Strict<forms::ContactForm>>,
captcha_solutions: &State<states::SharedCaptchaSolutions>, config: &State<config::Config>,
captcha_solutions: &State<captcha_solutions::SharedCaptchaSolutions>,
mailer: &State<mailer::Mailer>,
) -> Redirect { ) -> Redirect {
let path_prefix = uri!("/contact-form"); let path_prefix = config.path_prefix.clone();
let name = mem::take(&mut form.name);
let email = mem::take(&mut form.email);
let telefon = mem::take(&mut form.telefon);
let message = mem::take(&mut form.message);
if !captcha_solutions.check_answer(form.id, &form.captcha_answer) { if !captcha_solutions.check_answer(form.id, &form.captcha_answer) {
return Redirect::to(uri!( return Redirect::to(
path_prefix, path_prefix
index( + &uri!(index(Some(name), Some(email), Some(telefon), Some(message))).to_string(),
Some(mem::take(&mut form.name)), );
Some(mem::take(&mut form.email)),
Some(mem::take(&mut form.telefon)),
Some(mem::take(&mut form.message)),
)
));
} }
Redirect::to(uri!(path_prefix, success())) match mailer.send(&name, &email, &telefon, &message) {
Ok(_) => (),
Err(_) => {
return Redirect::to(
path_prefix
+ &uri!(index(Some(name), Some(email), Some(telefon), Some(message)))
.to_string(),
)
}
}
Redirect::to(path_prefix + &uri!(success()).to_string())
} }
#[get("/success")] #[get("/success")]