Skip to content

Commit d468aca

Browse files
committed
backend: only include smtp library when not testing.
1 parent 90cb37b commit d468aca

File tree

3 files changed

+48
-39
lines changed

3 files changed

+48
-39
lines changed

backend/src/lib.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ pub struct BridgeState {
8686
pub struct AppState {
8787
pub pool: Pool,
8888
pub jwt_secret: String,
89-
pub mailer: SmtpTransport,
89+
pub mailer: Option<SmtpTransport>,
9090
pub frontend_url: String,
9191
pub sender_email: String,
9292
pub sender_name: String,
@@ -250,7 +250,6 @@ pub(crate) mod tests {
250250
};
251251
use diesel::r2d2::ConnectionManager;
252252
use ipnetwork::Ipv4Network;
253-
use lettre::transport::smtp::authentication::Credentials;
254253
use lru::LruCache;
255254
use rand::TryRngCore;
256255
use rand_core::OsRng;
@@ -295,18 +294,10 @@ pub(crate) mod tests {
295294
) -> web::Data<AppState> {
296295
let pool = pool.unwrap_or_else(|| db_connector::test_connection_pool());
297296

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");
300-
let mailer = SmtpTransport::relay("mail.tinkerforge.com")
301-
.unwrap()
302-
.port(465)
303-
.credentials(Credentials::new(mail, pass))
304-
.build();
305-
306297
let state = AppState {
307298
pool: pool.clone(),
308299
jwt_secret: std::env::var("JWT_SECRET").expect("JWT_SECRET must be set!"),
309-
mailer,
300+
mailer: None,
310301
frontend_url: std::env::var("FRONTEND_URL").expect("FRONTEND_URL must be set!"),
311302
sender_email: String::new(),
312303
sender_name: String::new(),

backend/src/main.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -131,26 +131,28 @@ async fn main() -> std::io::Result<()> {
131131

132132
reset_wg_keys(&pool);
133133

134-
let email = std::env::var("EMAIL_USER").expect("EMAIL_USER must be set");
135-
let pass = std::env::var("EMAIL_PASS").expect("EMAIL_PASS must be set");
136-
let relay = std::env::var("EMAIL_RELAY").expect("EMAIL_RELAY must be set");
137-
let port: u16 = std::env::var("EMAIL_RELAY_PORT")
138-
.expect("EMAIL_RELAY_PORT must be set")
139-
.parse()
140-
.unwrap();
141-
let mailer = SmtpTransport::starttls_relay(&relay)
142-
.unwrap()
143-
.port(port)
144-
.credentials(Credentials::new(email, pass))
145-
.build();
134+
let mailer = {
135+
let email = std::env::var("EMAIL_USER").expect("EMAIL_USER must be set");
136+
let pass = std::env::var("EMAIL_PASS").expect("EMAIL_PASS must be set");
137+
let relay = std::env::var("EMAIL_RELAY").expect("EMAIL_RELAY must be set");
138+
let port: u16 = std::env::var("EMAIL_RELAY_PORT")
139+
.expect("EMAIL_RELAY_PORT must be set")
140+
.parse()
141+
.unwrap();
142+
SmtpTransport::starttls_relay(&relay)
143+
.unwrap()
144+
.port(port)
145+
.credentials(Credentials::new(email, pass))
146+
.build()
147+
};
146148

147149
let sender_email = std::env::var("SENDER_EMAIL").expect("SENDER_EMAIL must be set");
148150
let sender_name = std::env::var("SENDER_NAME").expect("SENDER_NAME must be set");
149151

150152
let state = web::Data::new(AppState {
151153
pool: pool.clone(),
152154
jwt_secret: std::env::var("JWT_SECRET").expect("JWT_SECRET must be set!"),
153-
mailer,
155+
mailer: Some(mailer),
154156
frontend_url: std::env::var("FRONTEND_URL").expect("FRONTEND_URL must be set!"),
155157
sender_email,
156158
sender_name,

backend/src/utils.rs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ use diesel::{
2828
result::Error::NotFound,
2929
PgConnection,
3030
};
31+
#[cfg(not(test))]
3132
use lettre::message::header::ContentType;
33+
#[cfg(not(test))]
3234
use lettre::{Message, Transport};
3335
use rand::Rng;
3436

@@ -159,21 +161,35 @@ pub async fn validate_auth_token(
159161
}
160162

161163
pub fn send_email(email: &str, subject: &str, body: String, state: &web::Data<AppState>) {
162-
let email = Message::builder()
163-
.from(
164-
format!("{} <{}>", state.sender_name, state.sender_email)
165-
.parse()
166-
.unwrap(),
167-
)
168-
.to(email.parse().unwrap())
169-
.subject(subject)
170-
.header(ContentType::TEXT_HTML)
171-
.body(body)
172-
.unwrap();
173-
174-
match state.mailer.send(&email) {
175-
Ok(_) => println!("Email sent successfully!"),
176-
Err(e) => panic!("Could not send email: {e:?}"),
164+
#[cfg(not(test))]
165+
{
166+
if let Some(ref mailer) = state.mailer {
167+
let email = Message::builder()
168+
.from(
169+
format!("{} <{}>", state.sender_name, state.sender_email)
170+
.parse()
171+
.unwrap(),
172+
)
173+
.to(email.parse().unwrap())
174+
.subject(subject)
175+
.header(ContentType::TEXT_HTML)
176+
.body(body)
177+
.unwrap();
178+
179+
match mailer.send(&email) {
180+
Ok(_) => println!("Email sent successfully!"),
181+
Err(e) => panic!("Could not send email: {e:?}"),
182+
}
183+
} else {
184+
println!("No mailer configured, email not sent");
185+
}
186+
}
187+
188+
#[cfg(test)]
189+
{
190+
let _ = body;
191+
let _ = state;
192+
println!("Test mode: Email would be sent to {} with subject '{}'", email, subject);
177193
}
178194
}
179195

0 commit comments

Comments
 (0)