Skip to content

Commit e195a1b

Browse files
committed
backend/docker: Add sender email and name to also brand emails.
This commit also contains changes to use utils::send_email everywhere emails get sent.
1 parent 486a40e commit e195a1b

File tree

12 files changed

+68
-83
lines changed

12 files changed

+68
-83
lines changed

backend/.env.example

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
DATABASE_URL=
22
JWT_SECRET=
3-
MAIL_USER=
4-
MAIL_PASS=
5-
MAIL_RELAY=
6-
MAIL_RELAY_PORT=
3+
EMAIL_USER=
4+
EMAIL_PASS=
5+
EMAIL_RELAY=
6+
EMAIL_RELAY_PORT=
77
FRONTEND_URL=
8+
SENDER_EMAIL=
9+
SENDER_NAME=

backend/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ pub struct AppState {
8888
pub jwt_secret: String,
8989
pub mailer: SmtpTransport,
9090
pub frontend_url: String,
91+
pub sender_email: String,
92+
pub sender_name: String,
9193
}
9294

9395
pub fn clean_recovery_tokens(
@@ -293,8 +295,8 @@ pub(crate) mod tests {
293295
) -> web::Data<AppState> {
294296
let pool = pool.unwrap_or_else(|| db_connector::test_connection_pool());
295297

296-
let mail = std::env::var("MAIL_USER").expect("MAIL must be set");
297-
let pass = std::env::var("MAIL_PASS").expect("MAIL_PASS must be set");
298+
let mail = std::env::var("EMAIL_USER").expect("EMAIL must be set");
299+
let pass = std::env::var("EMAIL_PASS").expect("EMAIL_PASS must be set");
298300
let mailer = SmtpTransport::relay("mail.tinkerforge.com")
299301
.unwrap()
300302
.port(465)
@@ -306,6 +308,8 @@ pub(crate) mod tests {
306308
jwt_secret: std::env::var("JWT_SECRET").expect("JWT_SECRET must be set!"),
307309
mailer,
308310
frontend_url: std::env::var("FRONTEND_URL").expect("FRONTEND_URL must be set!"),
311+
sender_email: String::new(),
312+
sender_name: String::new(),
309313
};
310314

311315
web::Data::new(state)

backend/src/main.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,24 +128,29 @@ async fn main() -> std::io::Result<()> {
128128

129129
reset_wg_keys(&pool);
130130

131-
let mail = std::env::var("MAIL_USER").expect("MAIL_USER must be set");
132-
let pass = std::env::var("MAIL_PASS").expect("MAIL_PASS must be set");
133-
let relay = std::env::var("MAIL_RELAY").expect("MAIL_RELAY must be set");
134-
let port: u16 = std::env::var("MAIL_RELAY_PORT")
135-
.expect("MAIL_RELAY_PORT must be set")
131+
let email = std::env::var("EMAIL_USER").expect("EMAIL_USER must be set");
132+
let pass = std::env::var("EMAIL_PASS").expect("EMAIL_PASS must be set");
133+
let relay = std::env::var("EMAIL_RELAY").expect("EMAIL_RELAY must be set");
134+
let port: u16 = std::env::var("EMAIL_RELAY_PORT")
135+
.expect("EMAIL_RELAY_PORT must be set")
136136
.parse()
137137
.unwrap();
138138
let mailer = SmtpTransport::starttls_relay(&relay)
139139
.unwrap()
140140
.port(port)
141-
.credentials(Credentials::new(mail, pass))
141+
.credentials(Credentials::new(email, pass))
142142
.build();
143143

144+
let sender_email = std::env::var("SENDER_EMAIL").expect("SENDER_EMAIL must be set");
145+
let sender_name = std::env::var("SENDER_NAME").expect("SENDER_NAME must be set");
146+
144147
let state = web::Data::new(AppState {
145148
pool: pool.clone(),
146149
jwt_secret: std::env::var("JWT_SECRET").expect("JWT_SECRET must be set!"),
147150
mailer,
148151
frontend_url: std::env::var("FRONTEND_URL").expect("FRONTEND_URL must be set!"),
152+
sender_email,
153+
sender_name,
149154
});
150155

151156
monitoring::start_monitoring(state.clone());

backend/src/monitoring.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ use std::time::Duration;
33
use actix_web::web;
44
use anyhow::Error;
55
use askama::Template;
6+
use backend::utils;
67
use backend::{utils::get_connection, AppState};
78
use diesel::prelude::*;
89
use diesel::{
910
r2d2::{ConnectionManager, PooledConnection},
1011
PgConnection, QueryDsl,
1112
};
12-
use lettre::{message::header::ContentType, Message, Transport};
1313

1414
#[derive(Template)]
1515
#[template(path = "monitoring.html")]
@@ -38,14 +38,8 @@ fn send_mail(state: &web::Data<AppState>, num_users: i64, num_chargers: i64) ->
3838
server_name: &std::env::var("SERVER_NAME")?,
3939
};
4040
let body = body.render()?;
41-
let mail = Message::builder()
42-
.from("Warp <[email protected]>".parse()?)
43-
.to(std::env::var("MONITORING_MAIL")?.parse()?)
44-
.subject("Monitoring mail")
45-
.header(ContentType::TEXT_HTML)
46-
.body(body)?;
4741

48-
state.mailer.send(&mail)?;
42+
utils::send_email(&std::env::var("MONITORING_EMAIL")?, "Monitoring mail", body, state);
4943

5044
Ok(())
5145
}
@@ -55,7 +49,7 @@ pub fn start_monitoring(state: web::Data<AppState>) {
5549
log::info!("Monitoring Mailer disabled");
5650
return;
5751
}
58-
if let Err(_) = std::env::var("MONITORING_MAIL") {
52+
if let Err(_) = std::env::var("MONITORING_EMAIL") {
5953
log::info!("Monitoring Mailer disabled");
6054
return;
6155
}

backend/src/routes/auth/register.rs

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@ use askama::Template;
2727
use chrono::Days;
2828
use db_connector::models::{users::User, verification::Verification};
2929
use diesel::{prelude::*, result::Error::NotFound};
30-
use lettre::{message::header::ContentType, Message, SmtpTransport, Transport};
3130
use serde::{Deserialize, Serialize};
3231
use utoipa::ToSchema;
3332
use validator::Validate;
3433

3534
use crate::{
3635
error::Error,
3736
routes::auth::VERIFICATION_EXPIRATION_DAYS,
38-
utils::{get_connection, web_block_unpacked},
37+
utils::{self, get_connection, web_block_unpacked},
3938
AppState,
4039
};
4140

@@ -87,20 +86,19 @@ fn send_verification_mail(
8786
name: String,
8887
id: Verification,
8988
email: String,
90-
mailer: SmtpTransport,
91-
frontend_url: String,
89+
state: web::Data<AppState>,
9290
lang: String,
9391
) -> Result<(), actix_web::Error> {
94-
let link = format!("{}/api/auth/verify?id={}", frontend_url, id.id.to_string());
92+
let link = format!("{}/api/auth/verify?id={}", state.frontend_url, id.id.to_string());
9593

96-
let body = match lang.as_str() {
94+
let (body, subject) = match lang.as_str() {
9795
"de" | "de-DE" => {
9896
let template = VerifyEmailDETemplate {
9997
name: &name,
10098
link: &link,
10199
};
102100
match template.render() {
103-
Ok(body) => body,
101+
Ok(body) => (body, "Email verifizieren"),
104102
Err(_err) => return Err(Error::InternalError.into()),
105103
}
106104
}
@@ -110,24 +108,13 @@ fn send_verification_mail(
110108
link: &link,
111109
};
112110
match template.render() {
113-
Ok(body) => body,
111+
Ok(body) => (body, "Verify email"),
114112
Err(_err) => return Err(Error::InternalError.into()),
115113
}
116114
}
117115
};
118116

119-
let email = Message::builder()
120-
.from("Warp <[email protected]>".parse().unwrap())
121-
.to(email.parse().unwrap())
122-
.subject("Verify email")
123-
.header(ContentType::TEXT_HTML)
124-
.body(body)
125-
.unwrap();
126-
127-
match mailer.send(&email) {
128-
Ok(_) => println!("Email sent successfully!"),
129-
Err(e) => panic!("Could not send email: {e:?}"),
130-
}
117+
utils::send_email(&email, subject, body, &state);
131118

132119
Ok(())
133120
}
@@ -230,8 +217,7 @@ pub async fn register(
230217
user_insert.name,
231218
verify,
232219
data.email.clone(),
233-
state.mailer.clone(),
234-
state.frontend_url.clone(),
220+
state.clone(),
235221
lang.into(),
236222
)
237223
.ok();

backend/src/routes/auth/start_recovery.rs

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ use actix_web::{get, web, HttpResponse, Responder};
22
use askama::Template;
33
use db_connector::models::recovery_tokens::RecoveryToken;
44
use diesel::prelude::*;
5-
use lettre::{message::header::ContentType, Message, SmtpTransport, Transport};
65
use serde::Deserialize;
76
use utoipa::IntoParams;
87
use uuid::Uuid;
98

109
use crate::{
1110
error::Error,
1211
routes::user::{get_user, get_user_id},
13-
utils::{get_connection, web_block_unpacked},
12+
utils::{self, get_connection, web_block_unpacked},
1413
AppState,
1514
};
1615

@@ -38,23 +37,22 @@ fn send_email(
3837
name: String,
3938
token_id: Uuid,
4039
email: String,
41-
mailer: SmtpTransport,
42-
frontend_url: String,
40+
state: web::Data<AppState>,
4341
lang: String,
4442
) -> actix_web::Result<()> {
4543
let link = format!(
4644
"{}/recovery?token={}&email={}",
47-
frontend_url, token_id, email
45+
state.frontend_url, token_id, email
4846
);
4947

50-
let body = match lang.as_str() {
48+
let (body, subject) = match lang.as_str() {
5149
"de" | "de-DE" => {
5250
let template = StartRecoveryDETemplate {
5351
name: &name,
5452
link: &link,
5553
};
5654
match template.render() {
57-
Ok(b) => b,
55+
Ok(b) => (b, "Passwort Wiederherstellung"),
5856
Err(_err) => return Err(Error::InternalError.into()),
5957
}
6058
}
@@ -64,26 +62,13 @@ fn send_email(
6462
link: &link,
6563
};
6664
match template.render() {
67-
Ok(b) => b,
65+
Ok(b) => (b, "Password Recovery"),
6866
Err(_err) => return Err(Error::InternalError.into()),
6967
}
7068
}
7169
};
7270

73-
let mail = Message::builder()
74-
.from("Warp <[email protected]>".parse().unwrap())
75-
.to(email.parse().unwrap())
76-
.subject("Password Recovery")
77-
.header(ContentType::TEXT_HTML)
78-
.body(body)
79-
.unwrap();
80-
match mailer.send(&mail) {
81-
Ok(_) => log::debug!("Send password recovery mail was successful."),
82-
Err(err) => {
83-
log::error!("Failed to send: {}", err);
84-
return Err(Error::InternalError.into());
85-
}
86-
}
71+
utils::send_email(&email, subject, body, &state);
8772

8873
Ok(())
8974
}
@@ -147,8 +132,7 @@ pub async fn start_recovery(
147132
user.name,
148133
token_id,
149134
email,
150-
state.mailer.clone(),
151-
state.frontend_url.clone(),
135+
state.clone(),
152136
lang.into(),
153137
)
154138
.ok();

backend/src/routes/user/update_user.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ use validator::Validate;
3333
#[template(path = "email_change_notification_en.html")]
3434
struct EmailChangeNotificationEn {
3535
name: String,
36+
sender_email: String,
3637
}
3738

3839
#[allow(unused)]
3940
#[derive(Template)]
4041
#[template(path = "email_change_notification_de.html")]
4142
struct EmailChangeNotificationDe {
4243
name: String,
44+
sender_email: String,
4345
}
4446

4547
#[allow(unused)]
@@ -54,17 +56,19 @@ fn send_email_change_notification(
5456
"de" => {
5557
let template = EmailChangeNotificationDe {
5658
name: name.to_string(),
59+
sender_email: state.sender_email.clone(),
5760
};
5861
(template.render().unwrap(), "E-Mail-Adresse geändert")
5962
}
6063
_ => {
6164
let template = EmailChangeNotificationEn {
6265
name: name.to_string(),
66+
sender_email: state.sender_email.clone(),
6367
};
6468
(template.render().unwrap(), "Email address changed")
6569
}
6670
};
67-
send_email(&old_email, subject, body, &state.mailer);
71+
send_email(&old_email, subject, body, &state);
6872
});
6973
}
7074

@@ -100,7 +104,7 @@ fn send_verification_mail(
100104
}
101105
};
102106

103-
send_email(&email, subject, body, &state.mailer);
107+
send_email(&email, subject, body, &state);
104108
});
105109
}
106110

backend/src/utils.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,16 @@ pub async fn validate_auth_token(
160160
Ok(())
161161
}
162162

163-
pub fn send_email(email: &str, subject: &str, body: String, mailer: &lettre::SmtpTransport) {
163+
pub fn send_email(email: &str, subject: &str, body: String, state: &web::Data<AppState>, ) {
164164
let email = Message::builder()
165-
.from("Warp <[email protected]>".parse().unwrap())
165+
.from(format!("{} <{}>", state.sender_name, state.sender_email).parse().unwrap())
166166
.to(email.parse().unwrap())
167167
.subject(subject)
168168
.header(ContentType::TEXT_HTML)
169169
.body(body)
170170
.unwrap();
171171

172-
match mailer.send(&email) {
172+
match state.mailer.send(&email) {
173173
Ok(_) => println!("Email sent successfully!"),
174174
Err(e) => panic!("Could not send email: {e:?}"),
175175
}

backend/templates/email_change_notification_de.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
</head>
77
<body>
88
<h3>Hallo {{name}}</h3>
9-
<p>Du hast deine E-Mail-Adresse geändert. Falls Du diese Änderung nicht veranlasst hast, schreibe bitte eine E-Mail an <a href="mailto:[email protected]">[email protected]</a></p>
9+
<p>Du hast deine E-Mail-Adresse geändert. Falls Du diese Änderung nicht veranlasst hast, schreibe bitte eine E-Mail an <a href="mailto:{{sender_email}}">{{sender_email}}</a></p>
1010
</body>
1111
</html>

backend/templates/email_change_notification_en.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
</head>
88
<body>
99
<h3>Hello {{name}}</h3>
10-
<p>You changed your email-address. In case you did not initiate this please write a e-mail to <a href="mailto:[email protected]">[email protected]</a></p>
10+
<p>You changed your email-address. In case you did not initiate this please write a e-mail to <a href="mailto:{{sender_email}}">{{sender_email}}</a></p>
1111
</body>
1212
</html>

0 commit comments

Comments
 (0)