committed by
							
								 GitHub
								GitHub
							
						
					
				
				 5 changed files with 162 additions and 9 deletions
			
			
		| @ -0,0 +1,63 @@ | |||||
|  | use std::error::Error; | ||||
|  | use native_tls::{Protocol, TlsConnector}; | ||||
|  | use lettre::{EmailTransport, SmtpTransport, ClientTlsParameters, ClientSecurity}; | ||||
|  | use lettre::smtp::{ConnectionReuseParameters, SmtpTransportBuilder}; | ||||
|  | use lettre::smtp::authentication::Credentials; | ||||
|  | use lettre_email::EmailBuilder; | ||||
|  | 
 | ||||
|  | use MailConfig; | ||||
|  | 
 | ||||
|  | fn mailer(config: &MailConfig) -> SmtpTransport { | ||||
|  |     let client_security = if config.smtp_ssl { | ||||
|  |         let mut tls_builder = TlsConnector::builder().unwrap(); | ||||
|  |         tls_builder.supported_protocols(&[Protocol::Tlsv11, Protocol::Tlsv12]).unwrap(); | ||||
|  |         ClientSecurity::Required( | ||||
|  |             ClientTlsParameters::new(config.smtp_host.to_owned(), tls_builder.build().unwrap()) | ||||
|  |         ) | ||||
|  |     } else { | ||||
|  |         ClientSecurity::None | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     let smtp_transport = SmtpTransportBuilder::new( | ||||
|  |         (config.smtp_host.to_owned().as_str(), config.smtp_port), | ||||
|  |         client_security | ||||
|  |     ).unwrap(); | ||||
|  | 
 | ||||
|  |     let smtp_transport = match (&config.smtp_username, &config.smtp_password) { | ||||
|  |         (Some(username), Some(password)) => { | ||||
|  |             smtp_transport.credentials(Credentials::new(username.to_owned(), password.to_owned())) | ||||
|  |         }, | ||||
|  |         (_, _) => smtp_transport, | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     smtp_transport | ||||
|  |         .smtp_utf8(true) | ||||
|  |         .connection_reuse(ConnectionReuseParameters::NoReuse) | ||||
|  |         .build() | ||||
|  | } | ||||
|  | 
 | ||||
|  | pub fn send_password_hint(address: &str, hint: Option<String>, config: &MailConfig) -> Result<(), String> { | ||||
|  |     let (subject, body) = if let Some(hint) = hint { | ||||
|  |         ("Your master password hint", | ||||
|  |          format!( | ||||
|  |             "You (or someone) recently requested your master password hint.\n\n\ | ||||
|  |              Your hint is:  \"{}\"\n\n\ | ||||
|  |              If you did not request your master password hint you can safely ignore this email.\n", | ||||
|  |             hint)) | ||||
|  |     } else { | ||||
|  |         ("Sorry, you have no password hint...", | ||||
|  |          "Sorry, you have not specified any password hint...\n".to_string()) | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     let email = EmailBuilder::new() | ||||
|  |         .to(address) | ||||
|  |         .from((config.smtp_from.to_owned(), "Bitwarden-rs")) | ||||
|  |         .subject(subject) | ||||
|  |         .body(body) | ||||
|  |         .build().unwrap(); | ||||
|  | 
 | ||||
|  |     match mailer(config).send(&email) { | ||||
|  |         Ok(_) => Ok(()), | ||||
|  |         Err(e) => Err(e.description().to_string()), | ||||
|  |     } | ||||
|  | } | ||||
					Loading…
					
					
				
		Reference in new issue