Getting rid of AWS SES to send emails
Dependencies
- [2]
D4SBRY6KInitial patch - [3]
X7GJK2QDUpdate - [4]
LE34RHBBFixing a CORS bug - [5]
IFYNLE5HCargo.nix - [6]
4KITFMYLCrate2nix - [7]
YYJ76Q7VInitial attempt at CI/CD - [8]
AAJTMEJAKeep cookie around for longer than a session
Change contents
- replacement in api/src/ssh.rs at line 1537
let email_body = rusoto_ses::Body {text: Some(rusoto_ses::Content {data: format!(include_str!("discussions/new_change_email"),author = self.user,disc = n,name = name,message = header.message,owner = self.owner,repo = self.repo,host = self.config.host,hash = hash,login = &login,),charset: Some(EMAIL_CHARSET.to_string()),}),html: Some(rusoto_ses::Content {data: body_html,charset: Some(EMAIL_CHARSET.to_string()),}),let email_body = crate::email::Body {plain: format!(include_str!("discussions/new_change_email"),author = self.user,disc = n,name = name,message = header.message,owner = self.owner,repo = self.repo,host = self.config.host,hash = hash,login = &login,),html: body_html, - replacement in api/src/ssh.rs at line 1556
crate::email::send_email(&config, obj, email_body, address).awaitcrate::email::send_email(&config, &obj, email_body, &address).await - replacement in api/src/main.rs at line 642
Rusoto(#[from] rusoto_core::RusotoError<rusoto_ses::SendEmailError>),Lettre(#[from] lettre::error::Error),#[error(transparent)]LettreAddress(#[from] lettre::address::AddressError), - replacement in api/src/email.rs at line 1
use crate::Config;use rusoto_core;use rusoto_ses;use tracing::*;use crate::{Config, Error};use lettre::{Message, Transport, message::MultiPart}; - edit in api/src/email.rs at line 13
#[derive(Debug, Clone)]pub struct Body {pub plain: String,pub html: String,} - replacement in api/src/email.rs at line 21[2.486200]→[2.486200:486270](∅→∅),[2.486270]→[3.10891:11717](∅→∅),[3.11717]→[4.9537:9632](∅→∅),[4.9632]→[3.11813:11914](∅→∅),[3.11813]→[3.11813:11914](∅→∅)
subject: String,body: rusoto_ses::Body,address: String,) -> Result<(), rusoto_core::RusotoError<rusoto_ses::SendEmailError>> {if let Some(config_email) = config.email.clone() {let subject = rusoto_ses::Content {data: subject,charset: Some("utf-8".to_string()),};debug!("sending an email to {:?}", address);let client = rusoto_core::request::HttpClient::new().unwrap();let email = rusoto_ses::SendEmailRequest {message: rusoto_ses::Message { body, subject },source: config.email_source.clone(),destination: rusoto_ses::Destination {to_addresses: Some(vec![address]),..rusoto_ses::Destination::default()},..rusoto_ses::SendEmailRequest::default()};use rusoto_ses::Ses;let result =rusoto_ses::SesClient::new_with(client, config_email, config.aws_ses_zone.clone()).send_email(email).await?;debug!("result = {:?}", result);subject: &str,body: Body,address: &str,) -> Result<(), Error> {if let Some(ref mailer) = config.email {let email = Message::builder().from(config.email_source.parse()?).to(address.parse()?).subject(subject).multipart(MultiPart::alternative_plain_html(body.plain, body.html))?;match mailer.send(&email) {Ok(_) => println!("Email sent successfully!"),Err(e) => panic!("Could not send email: {e:?}"),} - edit in api/src/config_file.rs at line 6
pub server: String,pub user: String, - edit in api/src/config_file.rs at line 9
pub region: String, - edit in api/src/config_file.rs at line 14
}#[derive(Default, Clone, Serialize, Deserialize)]pub struct PostgresConfig {pub host: String,pub port: Option<u16>,pub readonly_port: Option<u16>,pub local_port: Option<u16>,pub user: String,pub password: String,pub db: String,pub log: Option<String>,pub ca_file: Option<String>,#[serde(default = "bool_true")]pub use_tls: bool,}fn bool_true() -> bool {true - replacement in api/src/config_file.rs at line 29
pub email: EmailConfig,pub email: Option<EmailConfig>, - edit in api/src/config.rs at line 5
use rusoto_credential; - replacement in api/src/config.rs at line 39
pub email: Option<rusoto_credential::StaticProvider>,pub email: Option<lettre::SmtpTransport>, - edit in api/src/config.rs at line 41
pub aws_ses_zone: rusoto_core::Region, - replacement in api/src/config.rs at line 225[2.539199]→[3.12063:12087](∅→∅),[3.12087]→[2.539463:539519](∅→∅),[2.539463]→[2.539463:539519](∅→∅),[2.539519]→[4.10179:10244](∅→∅)
email: email(),email_source: config_file.email.source.clone(),aws_ses_zone: config_file.email.region.parse().unwrap(),email: email(&config_file),email_source: config_file.email.as_ref().map(|x| x.source.clone()).unwrap_or(String::new()), - replacement in api/src/config.rs at line 298
fn email() -> Option<rusoto_credential::StaticProvider> {Some(rusoto_credential::StaticProvider::new(std::env::var("aws_access_key_id").ok()?,std::env::var("aws_access_key").ok()?,None,None,))fn email(config: &config_file::ConfigFile) -> Option<lettre::SmtpTransport> {if let Some(ref email) = config.email {let creds = lettre::transport::smtp::authentication::Credentials::new(email.user.clone(),std::env::var("SMTP_PASSWORD").unwrap(),);Some(lettre::SmtpTransport::relay(&email.server).unwrap().credentials(creds).build(),)} else {None} - edit in api/src/auth.rs at line 297
/*pub const EMAIL_CHARSET: &'static str = "UTF-8";pub const BLOCKQUOTE_STYLE: cuach::PreEscaped<&'static str> =cuach::PreEscaped("border-left:2px solid #666666;padding-left:10px;margin:30px 0 30px 30px;");*/ - edit in api/src/auth.rs at line 364
let charset = "UTF-8".to_string(); - replacement in api/src/auth.rs at line 371
rusoto_ses::Body {text: Some(rusoto_ses::Content {data: format!("Welcome to the nest.crate::email::Body {html: body_html,plain: format!("Welcome to the nest. - replacement in api/src/auth.rs at line 380
config.hostname, token),charset: Some(charset.clone()),}),html: Some(rusoto_ses::Content {data: body_html,charset: Some(charset),}),config.hostname, token), - replacement in api/src/auth.rs at line 391
rusoto_ses::Body {text: Some(rusoto_ses::Content {data: format!("Hi,crate::email::Body {html: body_html,plain: format!("Hi, - replacement in api/src/auth.rs at line 400
", config.hostname, token),charset: Some(charset.clone())}),html: Some(rusoto_ses::Content {data: body_html,charset: Some(charset)})", config.hostname, token) - replacement in api/src/auth.rs at line 403
Ok(crate::email::send_email(config, subject, body, address).await?)Ok(crate::email::send_email(config, &subject, body, &address).await?) - replacement in api/Cargo.toml at line 21
chrono = "0.4.42"chrono = { version = "0.4.42", features = ["serde"] } - edit in api/Cargo.toml at line 45
lettre = "0.11.22" - edit in api/Cargo.toml at line 61
rusoto_core = "0.48.0"rusoto_credential = "0.48.0"rusoto_ses = "0.48.0" - replacement in Cargo.nix at line 1028
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 1032
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 1040
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 1138
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 1202
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 1206
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 1290
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 1294
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 1373
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 1459
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 1521
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 1525
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 1529
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 1577
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 1634
packageId = "http 1.4.0";packageId = "http"; - edit in Cargo.nix at line 1660
"base64 0.13.1" = rec {crateName = "base64";version = "0.13.1";edition = "2018";sha256 = "1s494mqmzjb766fy1kqlccgfg2sdcjb6hzbvzqv2jw65fdi5h6wy";authors = ["Alice Maz <alice@alicemaz.com>""Marshall Pierce <marshall@mpierce.org>"];features = {"default" = [ "std" ];};resolvedDefaultFeatures = [ "default" "std" ];}; - edit in Cargo.nix at line 4774
}];};"dirs-next" = rec {crateName = "dirs-next";version = "2.0.0";edition = "2018";sha256 = "1q9kr151h9681wwp6is18750ssghz6j9j7qm7qi1ngcwy7mzi35r";libName = "dirs_next";authors = ["The @xdg-rs members"];dependencies = [{name = "cfg-if";packageId = "cfg-if"; - edit in Cargo.nix at line 4775
{name = "dirs-sys-next";packageId = "dirs-sys-next";} - edit in Cargo.nix at line 4808
"dirs-sys-next" = rec {crateName = "dirs-sys-next";version = "0.1.2";edition = "2018";sha256 = "0kavhavdxv4phzj4l0psvh55hszwnr0rcz8sxbvx20pyqi2a3gaf";libName = "dirs_sys_next";authors = ["The @xdg-rs members"];dependencies = [{name = "libc";packageId = "libc";target = { target, features }: (target."unix" or false);}{name = "redox_users";packageId = "redox_users";usesDefaultFeatures = false;target = { target, features }: ("redox" == target."os" or null);}{name = "winapi";packageId = "winapi";target = { target, features }: (target."windows" or false);features = [ "knownfolders" "objbase" "shlobj" "winbase" "winerror" ];}];}; - edit in Cargo.nix at line 5061
};"email-encoding" = rec {crateName = "email-encoding";version = "0.4.1";edition = "2021";sha256 = "1dkhcqmhgc25m437fzxhkvhd135yc4xd9pzpsc77i7lv9m8fd64j";libName = "email_encoding";dependencies = [{name = "base64";packageId = "base64 0.22.1";usesDefaultFeatures = false;}{name = "memchr";packageId = "memchr";usesDefaultFeatures = false;}];features = {"default" = [ "std" ];"std" = [ "base64/std" "memchr/std" ];};resolvedDefaultFeatures = [ "default" "std" ];};"email_address" = rec {crateName = "email_address";version = "0.2.9";edition = "2018";sha256 = "0jf4v3npa524c7npy7w3jl0a6gng26f51a4bgzs3jqna12dz2yg0";authors = ["Simon Johnston <johnstonskj@gmail.com>"];features = {"default" = [ "serde_support" ];"serde" = [ "dep:serde" ];"serde_support" = [ "serde" ];}; - edit in Cargo.nix at line 6207
};"h2 0.3.27" = rec {crateName = "h2";version = "0.3.27";edition = "2018";sha256 = "0b92141hilij015av6i5ziw9xfx4py3lbjy17yc35z5ih01sbv0b";authors = ["Carl Lerche <me@carllerche.com>""Sean McArthur <sean@seanmonstar.com>"];dependencies = [{name = "bytes";packageId = "bytes";}{name = "fnv";packageId = "fnv";}{name = "futures-core";packageId = "futures-core";usesDefaultFeatures = false;}{name = "futures-sink";packageId = "futures-sink";usesDefaultFeatures = false;}{name = "futures-util";packageId = "futures-util";usesDefaultFeatures = false;}{name = "http";packageId = "http 0.2.12";}{name = "indexmap";packageId = "indexmap";features = [ "std" ];}{name = "slab";packageId = "slab";}{name = "tokio";packageId = "tokio";features = [ "io-util" ];}{name = "tokio-util";packageId = "tokio-util";features = [ "codec" "io" ];}{name = "tracing";packageId = "tracing";usesDefaultFeatures = false;features = [ "std" ];}];devDependencies = [{name = "tokio";packageId = "tokio";features = [ "rt-multi-thread" "macros" "sync" "net" ];}];features = {}; - replacement in Cargo.nix at line 6208
"h2 0.4.12" = rec {"h2" = rec { - replacement in Cargo.nix at line 6242
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 6472
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 6502
packageId = "http 1.4.0";packageId = "http"; - edit in Cargo.nix at line 6642
};};"hostname" = rec {crateName = "hostname";version = "0.4.2";edition = "2021";sha256 = "1g8cfg0a1v8y5a0zkncbns8hh24amjgskl39cc583wxfawsslyk1";dependencies = [{name = "cfg-if";packageId = "cfg-if";}{name = "libc";packageId = "libc";target = { target, features }: ((target."unix" or false) || ("redox" == target."os" or null));}{name = "windows-link";packageId = "windows-link";target = { target, features }: ("windows" == target."os" or null);}];features = { - edit in Cargo.nix at line 6667
resolvedDefaultFeatures = [ "default" ]; - edit in Cargo.nix at line 6732
};"http 0.2.12" = rec {crateName = "http";version = "0.2.12";edition = "2018";sha256 = "1w81s4bcbmcj9bjp7mllm8jlz6b31wzvirz8bgpzbqkpwmbvn730";authors = ["Alex Crichton <alex@alexcrichton.com>""Carl Lerche <me@carllerche.com>""Sean McArthur <sean@seanmonstar.com>"];dependencies = [{name = "bytes";packageId = "bytes";}{name = "fnv";packageId = "fnv";}{name = "itoa";packageId = "itoa";}]; - replacement in Cargo.nix at line 6733
"http 1.4.0" = rec {"http" = rec { - edit in Cargo.nix at line 6757
};"http-body 0.4.6" = rec {crateName = "http-body";version = "0.4.6";edition = "2018";sha256 = "1lmyjfk6bqk6k9gkn1dxq770sb78pqbqshga241hr5p995bb5skw";libName = "http_body";authors = ["Carl Lerche <me@carllerche.com>""Lucio Franco <luciofranco14@gmail.com>""Sean McArthur <sean@seanmonstar.com>"];dependencies = [{name = "bytes";packageId = "bytes";}{name = "http";packageId = "http 0.2.12";}{name = "pin-project-lite";packageId = "pin-project-lite";}]; - replacement in Cargo.nix at line 6758
"http-body 1.0.1" = rec {"http-body" = rec { - replacement in Cargo.nix at line 6776
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 6804
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 6808
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 6844
"hyper 0.14.32" = rec {crateName = "hyper";version = "0.14.32";edition = "2018";sha256 = "1rvcb0smz8q1i0y6p7rwxr02x5sclfg2hhxf3g0774zczn0cgps1";authors = ["Sean McArthur <sean@seanmonstar.com>"];dependencies = [{name = "bytes";packageId = "bytes";}{name = "futures-channel";packageId = "futures-channel";}{name = "futures-core";packageId = "futures-core";usesDefaultFeatures = false;}{name = "futures-util";packageId = "futures-util";usesDefaultFeatures = false;}{name = "h2";packageId = "h2 0.3.27";optional = true;}{name = "http";packageId = "http 0.2.12";}{name = "http-body";packageId = "http-body 0.4.6";}{name = "httparse";packageId = "httparse";}{name = "httpdate";packageId = "httpdate";}{name = "itoa";packageId = "itoa";}{name = "pin-project-lite";packageId = "pin-project-lite";}{name = "socket2";packageId = "socket2 0.5.10";optional = true;features = [ "all" ];}{name = "tokio";packageId = "tokio";features = [ "sync" ];}{name = "tower-service";packageId = "tower-service";}{name = "tracing";packageId = "tracing";usesDefaultFeatures = false;features = [ "std" ];}{name = "want";packageId = "want";}];devDependencies = [{name = "futures-util";packageId = "futures-util";usesDefaultFeatures = false;features = [ "alloc" ];}{name = "tokio";packageId = "tokio";features = [ "fs" "macros" "io-std" "io-util" "rt" "rt-multi-thread" "sync" "time" "test-util" ];}];features = {"ffi" = [ "libc" ];"full" = [ "client" "http1" "http2" "server" "stream" "runtime" ];"h2" = [ "dep:h2" ];"http2" = [ "h2" ];"libc" = [ "dep:libc" ];"runtime" = [ "tcp" "tokio/rt" "tokio/time" ];"socket2" = [ "dep:socket2" ];"tcp" = [ "socket2" "tokio/net" "tokio/rt" "tokio/time" ];};resolvedDefaultFeatures = [ "client" "default" "h2" "http1" "http2" "socket2" "stream" "tcp" ];};"hyper 1.8.1" = rec {"hyper" = rec { - replacement in Cargo.nix at line 6874
packageId = "h2 0.4.12";packageId = "h2"; - replacement in Cargo.nix at line 6879
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 6883
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 6963
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 6967
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 7037
"hyper-tls 0.5.0" = rec {"hyper-tls" = rec { - edit in Cargo.nix at line 7039
version = "0.5.0";edition = "2018";sha256 = "01crgy13102iagakf6q4mb75dprzr7ps1gj0l5hxm1cvm7gks66n";libName = "hyper_tls";authors = ["Sean McArthur <sean@seanmonstar.com>"];dependencies = [{name = "bytes";packageId = "bytes";}{name = "hyper";packageId = "hyper 0.14.32";usesDefaultFeatures = false;features = [ "tcp" "client" ];}{name = "native-tls";packageId = "native-tls";}{name = "tokio";packageId = "tokio";}{name = "tokio-native-tls";packageId = "tokio-native-tls";}];devDependencies = [{name = "hyper";packageId = "hyper 0.14.32";usesDefaultFeatures = false;features = [ "http1" ];}{name = "tokio";packageId = "tokio";features = [ "io-std" "macros" "io-util" ];}];features = {"vendored" = [ "native-tls/vendored" ];};};"hyper-tls 0.6.0" = rec {crateName = "hyper-tls"; - replacement in Cargo.nix at line 7057
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 7134
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 7138
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 7142
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 7165
packageId = "socket2 0.6.1";packageId = "socket2"; - replacement in Cargo.nix at line 7213
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 7641
resolvedDefaultFeatures = [ "alloc" "compiled_data" "std" ];resolvedDefaultFeatures = [ "alloc" "compiled_data" "default" "std" ]; - edit in Cargo.nix at line 8286
"lettre" = rec {crateName = "lettre";version = "0.11.22";edition = "2024";sha256 = "0j9kbgx98k4zn2hvd38jdsl8s5snmn55gjrrs0r674nbyqbmd9hd";authors = ["Alexis Mousset <contact@amousset.me>""Paolo Barbolini <paolo@paolo565.org>"];dependencies = [{name = "base64";packageId = "base64 0.22.1";optional = true;}{name = "email-encoding";packageId = "email-encoding";optional = true;}{name = "email_address";packageId = "email_address";usesDefaultFeatures = false;}{name = "fastrand";packageId = "fastrand";optional = true;}{name = "futures-util";packageId = "futures-util";optional = true;usesDefaultFeatures = false;features = [ "io" ];}{name = "hostname";packageId = "hostname";optional = true;}{name = "httpdate";packageId = "httpdate";optional = true;}{name = "idna";packageId = "idna";}{name = "mime";packageId = "mime";optional = true;}{name = "native-tls";packageId = "native-tls";optional = true;}{name = "nom";packageId = "nom 8.0.0";}{name = "percent-encoding";packageId = "percent-encoding";optional = true;}{name = "quoted_printable";packageId = "quoted_printable";optional = true;}{name = "socket2";packageId = "socket2";optional = true;}{name = "tokio";packageId = "tokio";rename = "tokio1_crate";optional = true;}{name = "url";packageId = "url";optional = true;}];devDependencies = [{name = "tokio";packageId = "tokio";rename = "tokio1_crate";features = [ "macros" "rt-multi-thread" ];}];features = {"async-std1" = [ "dep:async-std" "dep:async-trait" "dep:futures-io" "dep:futures-util" ];"async-std1-rustls" = [ "async-std1" "rustls" "dep:futures-rustls" ];"async-std1-rustls-tls" = [ "async-std1-rustls" "rustls-tls" ];"aws-lc-rs" = [ "rustls?/aws-lc-rs" ];"boring-tls" = [ "dep:boring" ];"builder" = [ "dep:httpdate" "dep:mime" "dep:fastrand" "dep:quoted_printable" "dep:email-encoding" ];"default" = [ "smtp-transport" "pool" "native-tls" "hostname" "builder" ];"dkim" = [ "dep:base64" "dep:sha2" "dep:rsa" "dep:ed25519-dalek" ];"file-transport" = [ "dep:uuid" "tokio1_crate?/fs" "tokio1_crate?/io-util" ];"file-transport-envelope" = [ "serde" "dep:serde_json" "file-transport" ];"fips" = [ "aws-lc-rs" "rustls?/fips" ];"hostname" = [ "dep:hostname" ];"mime03" = [ "dep:mime" ];"native-tls" = [ "dep:native-tls" ];"pool" = [ "dep:futures-util" ];"ring" = [ "rustls?/ring" ];"rustls" = [ "dep:rustls" ];"rustls-native-certs" = [ "dep:rustls-native-certs" ];"rustls-no-provider" = [ "rustls" ];"rustls-platform-verifier" = [ "dep:rustls-platform-verifier" ];"rustls-tls" = [ "webpki-roots" "rustls" "ring" ];"sendmail-transport" = [ "tokio1_crate?/process" "tokio1_crate?/io-util" "async-std?/unstable" ];"serde" = [ "dep:serde" ];"smtp-transport" = [ "dep:base64" "dep:socket2" "dep:url" "dep:percent-encoding" "tokio1_crate?/rt" "tokio1_crate?/time" "tokio1_crate?/net" ];"tokio1" = [ "dep:tokio1_crate" "dep:async-trait" "dep:futures-io" "dep:futures-util" ];"tokio1-boring-tls" = [ "tokio1" "boring-tls" "dep:tokio1_boring" ];"tokio1-native-tls" = [ "tokio1" "native-tls" "dep:tokio1_native_tls_crate" ];"tokio1-rustls" = [ "tokio1" "rustls" "dep:tokio1_rustls" ];"tokio1-rustls-tls" = [ "tokio1-rustls" "rustls-tls" ];"tracing" = [ "dep:tracing" ];"web" = [ "dep:web-time" ];"webpki-roots" = [ "dep:webpki-roots" ];};resolvedDefaultFeatures = [ "builder" "default" "hostname" "native-tls" "pool" "smtp-transport" ];}; - replacement in Cargo.nix at line 9223
"md-5 0.10.6" = rec {"md-5" = rec { - edit in Cargo.nix at line 9254
"std" = [ "digest/std" ];};resolvedDefaultFeatures = [ "default" "std" ];};"md-5 0.9.1" = rec {crateName = "md-5";version = "0.9.1";edition = "2018";sha256 = "059ajjacz1q3cms7vl6cvhdqs4qdw2nnwj9dq99ryzv0p6djfnkv";libName = "md5";authors = ["RustCrypto Developers"];dependencies = [{name = "block-buffer";packageId = "block-buffer 0.9.0";}{name = "digest";packageId = "digest 0.9.0";}{name = "opaque-debug";packageId = "opaque-debug";}];devDependencies = [{name = "digest";packageId = "digest 0.9.0";features = [ "dev" ];}];features = {"asm" = [ "md5-asm" ];"default" = [ "std" ];"md5-asm" = [ "dep:md5-asm" ]; - edit in Cargo.nix at line 9687
features = [ "serde" ]; - replacement in Cargo.nix at line 9747
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 9759
packageId = "hyper 1.8.1";packageId = "hyper"; - edit in Cargo.nix at line 9787
name = "lettre";packageId = "lettre";}{ - edit in Cargo.nix at line 9851
name = "rusoto_core";packageId = "rusoto_core";}{name = "rusoto_credential";packageId = "rusoto_credential";}{name = "rusoto_ses";packageId = "rusoto_ses";}{ - replacement in Cargo.nix at line 12688
packageId = "md-5 0.10.6";packageId = "md-5"; - edit in Cargo.nix at line 13102
};"quoted_printable" = rec {crateName = "quoted_printable";version = "0.5.2";edition = "2018";sha256 = "0wm9xr8qajngy0lvsf00hy51s6x53w73qzpb0yj2l4lscn2hb3j7";authors = ["Kartikaya Gupta <kats@seldon.staktrace.com>"];features = {"default" = [ "std" ];};resolvedDefaultFeatures = [ "default" "std" ]; - replacement in Cargo.nix at line 13914
packageId = "h2 0.4.12";packageId = "h2"; - replacement in Cargo.nix at line 13920
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 13924
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 13934
packageId = "hyper 1.8.1";packageId = "hyper"; - replacement in Cargo.nix at line 13948
packageId = "hyper-tls 0.6.0";packageId = "hyper-tls"; - replacement in Cargo.nix at line 14077
packageId = "hyper 1.8.1";packageId = "hyper"; - edit in Cargo.nix at line 14326
"rusoto_core" = rec {crateName = "rusoto_core";version = "0.48.0";edition = "2018";sha256 = "18ig9x4n68cgfvhzkyhl9w2qlhk945xczbb9c8r52dd79ss0vcqx";authors = ["Anthony DiMarco <ocramida@gmail.com>""Jimmy Cuadra <jimmy@jimmycuadra.com>""Matthew Mayer <matthewkmayer@gmail.com>""Nikita Pekin <contact@nikitapek.in>"];dependencies = [{name = "async-trait";packageId = "async-trait";}{name = "base64";packageId = "base64 0.13.1";}{name = "bytes";packageId = "bytes";}{name = "crc32fast";packageId = "crc32fast";}{name = "futures";packageId = "futures";}{name = "http";packageId = "http 0.2.12";}{name = "hyper";packageId = "hyper 0.14.32";features = [ "client" "http1" "http2" "tcp" ];}{name = "hyper-tls";packageId = "hyper-tls 0.5.0";optional = true;}{name = "lazy_static";packageId = "lazy_static";}{name = "log";packageId = "log";}{name = "rusoto_credential";packageId = "rusoto_credential";}{name = "rusoto_signature";packageId = "rusoto_signature";}{name = "serde";packageId = "serde";features = [ "derive" ];}{name = "serde_json";packageId = "serde_json";}{name = "tokio";packageId = "tokio";features = [ "time" "io-util" ];}{name = "xml-rs";packageId = "xml-rs";}];buildDependencies = [{name = "rustc_version";packageId = "rustc_version";}];devDependencies = [{name = "serde_json";packageId = "serde_json";}{name = "tokio";packageId = "tokio";features = [ "macros" ];}];features = {"default" = [ "native-tls" ];"encoding" = [ "flate2" ];"flate2" = [ "dep:flate2" ];"hyper-rustls" = [ "dep:hyper-rustls" ];"hyper-tls" = [ "dep:hyper-tls" ];"native-tls" = [ "hyper-tls" ];"nightly-testing" = [ "rusoto_credential/nightly-testing" ];"rustls" = [ "hyper-rustls/native-tokio" ];"rustls-webpki" = [ "hyper-rustls/webpki-tokio" ];};resolvedDefaultFeatures = [ "default" "hyper-tls" "native-tls" ];};"rusoto_credential" = rec {crateName = "rusoto_credential";version = "0.48.0";edition = "2018";sha256 = "019dq3aq6hnfg4xvxdfsnrba08dwvciz0km4nr3n1basvc9nq2pf";authors = ["Anthony DiMarco <ocramida@gmail.com>""Jimmy Cuadra <jimmy@jimmycuadra.com>""Matthew Mayer <matthewkmayer@gmail.com>""Nikita Pekin <contact@nikitapek.in>"];dependencies = [{name = "async-trait";packageId = "async-trait";}{name = "chrono";packageId = "chrono";usesDefaultFeatures = false;features = [ "clock" "serde" ];}{name = "dirs-next";packageId = "dirs-next";}{name = "futures";packageId = "futures";}{name = "hyper";packageId = "hyper 0.14.32";features = [ "client" "http1" "tcp" "stream" ];}{name = "serde";packageId = "serde";features = [ "derive" ];}{name = "serde_json";packageId = "serde_json";}{name = "shlex";packageId = "shlex";}{name = "tokio";packageId = "tokio";features = [ "process" "sync" "time" ];}{name = "zeroize";packageId = "zeroize";}];devDependencies = [{name = "tokio";packageId = "tokio";features = [ "macros" "rt-multi-thread" ];}];features = {};};"rusoto_ses" = rec {crateName = "rusoto_ses";version = "0.48.0";edition = "2018";sha256 = "1k86fiyxip6mjkh7zbbc49rdbqy2qqvi52hr8vs3zfgar0d60rf3";authors = ["Anthony DiMarco <ocramida@gmail.com>""Jimmy Cuadra <jimmy@jimmycuadra.com>""Matthew Mayer <matthewkmayer@gmail.com>""Nikita Pekin <contact@nikitapek.in>"];dependencies = [{name = "async-trait";packageId = "async-trait";}{name = "bytes";packageId = "bytes";}{name = "futures";packageId = "futures";}{name = "rusoto_core";packageId = "rusoto_core";usesDefaultFeatures = false;}{name = "serde_urlencoded";packageId = "serde_urlencoded";}{name = "xml-rs";packageId = "xml-rs";}];features = {"default" = [ "native-tls" ];"deserialize_structs" = [ "bytes/serde" "serde" "serde_derive" ];"native-tls" = [ "rusoto_core/native-tls" ];"rustls" = [ "rusoto_core/rustls" ];"serde" = [ "dep:serde" ];"serde_derive" = [ "dep:serde_derive" ];"serialize_structs" = [ "bytes/serde" "serde" "serde_derive" ];};resolvedDefaultFeatures = [ "default" "native-tls" ];};"rusoto_signature" = rec {crateName = "rusoto_signature";version = "0.48.0";edition = "2018";sha256 = "0wjjn3n3a01xxc1kdwqkrbw6zkgc4w8ia6r93s9lfj4b3i4rbbm5";authors = ["Anthony DiMarco <ocramida@gmail.com>""Jimmy Cuadra <jimmy@jimmycuadra.com>""Matthew Mayer <matthewkmayer@gmail.com>""Nikita Pekin <contact@nikitapek.in>"];dependencies = [{name = "base64";packageId = "base64 0.13.1";}{name = "bytes";packageId = "bytes";}{name = "chrono";packageId = "chrono";usesDefaultFeatures = false;features = [ "clock" ];}{name = "digest";packageId = "digest 0.9.0";}{name = "futures";packageId = "futures";}{name = "hex";packageId = "hex";}{name = "hmac";packageId = "hmac 0.11.0";}{name = "http";packageId = "http 0.2.12";}{name = "hyper";packageId = "hyper 0.14.32";features = [ "stream" ];}{name = "log";packageId = "log";}{name = "md-5";packageId = "md-5 0.9.1";}{name = "percent-encoding";packageId = "percent-encoding";}{name = "pin-project-lite";packageId = "pin-project-lite";}{name = "rusoto_credential";packageId = "rusoto_credential";}{name = "serde";packageId = "serde";}{name = "sha2";packageId = "sha2 0.9.9";}{name = "tokio";packageId = "tokio";features = [ "macros" "rt-multi-thread" ];}];buildDependencies = [{name = "rustc_version";packageId = "rustc_version";}];devDependencies = [{name = "tokio";packageId = "tokio";features = [ "io-util" ];}];}; - edit in Cargo.nix at line 15751
};};"socket2 0.5.10" = rec {crateName = "socket2";version = "0.5.10";edition = "2021";sha256 = "0y067ki5q946w91xlz2sb175pnfazizva6fi3kfp639mxnmpc8z2";authors = ["Alex Crichton <alex@alexcrichton.com>""Thomas de Zeeuw <thomasdezeeuw@gmail.com>"];dependencies = [{name = "libc";packageId = "libc";target = { target, features }: (target."unix" or false);}{name = "windows-sys";packageId = "windows-sys 0.52.0";target = { target, features }: (target."windows" or false);features = [ "Win32_Foundation" "Win32_Networking_WinSock" "Win32_System_IO" "Win32_System_Threading" "Win32_System_WindowsProgramming" ];}];features = { - edit in Cargo.nix at line 15752
resolvedDefaultFeatures = [ "all" ]; - replacement in Cargo.nix at line 15753
"socket2 0.6.1" = rec {"socket2" = rec { - replacement in Cargo.nix at line 16992
packageId = "socket2 0.6.1";packageId = "socket2"; - replacement in Cargo.nix at line 17017
packageId = "socket2 0.6.1";packageId = "socket2"; - replacement in Cargo.nix at line 17210
packageId = "socket2 0.6.1";packageId = "socket2"; - replacement in Cargo.nix at line 17856
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 17860
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 17916
packageId = "http-body 1.0.1";packageId = "http-body"; - replacement in Cargo.nix at line 18308
packageId = "http 1.4.0";packageId = "http"; - replacement in Cargo.nix at line 20841
resolvedDefaultFeatures = [ "Win32" "Win32_Foundation" "Win32_NetworkManagement" "Win32_NetworkManagement_IpHelper" "Win32_Networking" "Win32_Networking_WinSock" "Win32_System" "Win32_System_IO" "Win32_System_Threading" "Win32_System_WindowsProgramming" "default" ];resolvedDefaultFeatures = [ "Win32" "Win32_Foundation" "Win32_NetworkManagement" "Win32_NetworkManagement_IpHelper" "Win32_Networking" "Win32_Networking_WinSock" "Win32_System" "Win32_System_Threading" "default" ]; - edit in Cargo.nix at line 22202
"xml-rs" = rec {crateName = "xml-rs";version = "0.8.28";edition = "2021";crateBin = [];sha256 = "0grdj7xwbki5zrkalrg8dljyf14y4yj3wrj34sbzqp06i9zk7s1s";libName = "xml";authors = ["Vladimir Matveev <vmatveev@citrine.cc>"];}; - replacement in Cargo.lock at line 324
"http 1.4.0","http-body 1.0.1","http","http-body", - replacement in Cargo.lock at line 327
"hyper 1.8.1","hyper", - replacement in Cargo.lock at line 357
"http 1.4.0","http-body 1.0.1","http","http-body", - replacement in Cargo.lock at line 381
"http 1.4.0","http-body 1.0.1","http","http-body", - replacement in Cargo.lock at line 399
"http 1.4.0","http", - replacement in Cargo.lock at line 425
"http 1.4.0","http", - replacement in Cargo.lock at line 440[3.17611]→[3.17611:17626](∅→∅),[3.17626]→[2.616957:616977](∅→∅),[2.616957]→[2.616957:616977](∅→∅),[2.616977]→[3.17627:17643](∅→∅)
"http 1.4.0","http-body 1.0.1","hyper 1.8.1","http","http-body","hyper", - replacement in Cargo.lock at line 464
"http 1.4.0","http", - edit in Cargo.lock at line 473
version = "0.13.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"[[package]]name = "base64" - edit in Cargo.lock at line 1523
][[package]]name = "dirs-next"version = "2.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"dependencies = ["cfg-if","dirs-sys-next", - edit in Cargo.lock at line 1530
dependencies = ["libc","redox_users","winapi",][[package]]name = "dirs-sys-next"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" - edit in Cargo.lock at line 1626
name = "email-encoding"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6"dependencies = ["base64 0.22.1","memchr",][[package]]name = "email_address"version = "0.2.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"[[package]] - edit in Cargo.lock at line 1991[3.27520]→[2.651655:651682](∅→∅),[2.651655]→[2.651655:651682](∅→∅),[2.651682]→[3.27521:27540](∅→∅),[3.27540]→[2.651701:651766](∅→∅),[2.651701]→[2.651701:651766](∅→∅),[2.651766]→[3.27541:27619](∅→∅),[3.27619]→[2.651844:652005](∅→∅),[2.651844]→[2.651844:652005](∅→∅)
][[package]]name = "h2"version = "0.3.27"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d"dependencies = ["bytes","fnv","futures-core","futures-sink","futures-util","http 0.2.12","indexmap","slab","tokio","tokio-util","tracing", - replacement in Cargo.lock at line 2004
"http 1.4.0","http", - replacement in Cargo.lock at line 2067
"http 1.4.0","http", - replacement in Cargo.lock at line 2079
"http 1.4.0","http", - edit in Cargo.lock at line 2141
name = "hostname"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd"dependencies = ["cfg-if","libc","windows-link",][[package]] - edit in Cargo.lock at line 2178
version = "0.2.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"dependencies = ["bytes","fnv","itoa",][[package]]name = "http" - edit in Cargo.lock at line 2184
][[package]]name = "http-body"version = "0.4.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"dependencies = ["bytes","http 0.2.12","pin-project-lite", - replacement in Cargo.lock at line 2193
"http 1.4.0","http", - replacement in Cargo.lock at line 2204
"http 1.4.0","http-body 1.0.1","http","http-body", - edit in Cargo.lock at line 2220[2.658289]→[2.658289:658561](∅→∅),[2.658561]→[3.29080:29094](∅→∅),[3.29094]→[2.658575:658667](∅→∅),[2.658575]→[2.658575:658667](∅→∅),[2.658667]→[3.29095:29114](∅→∅),[3.29114]→[2.658679:658730](∅→∅),[2.658679]→[2.658679:658730](∅→∅)
[[package]]name = "hyper"version = "0.14.32"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"dependencies = ["bytes","futures-channel","futures-core","futures-util","h2 0.3.27","http 0.2.12","http-body 0.4.6","httparse","httpdate","itoa","pin-project-lite","socket2 0.5.10","tokio","tower-service","tracing","want",] - replacement in Cargo.lock at line 2231
"h2 0.4.12","http 1.4.0","http-body 1.0.1","h2","http","http-body", - replacement in Cargo.lock at line 2250
"http 1.4.0","hyper 1.8.1","http","hyper", - edit in Cargo.lock at line 2258
][[package]]name = "hyper-tls"version = "0.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"dependencies = ["bytes","hyper 0.14.32","native-tls","tokio","tokio-native-tls", - replacement in Cargo.lock at line 2268
"hyper 1.8.1","hyper", - replacement in Cargo.lock at line 2287[2.660358]→[3.29577:29592](∅→∅),[3.29592]→[2.660373:660393](∅→∅),[2.660373]→[2.660373:660393](∅→∅),[2.660393]→[3.29593:29609](∅→∅)
"http 1.4.0","http-body 1.0.1","hyper 1.8.1","http","http-body","hyper", - replacement in Cargo.lock at line 2294
"socket2 0.6.1","socket2", - edit in Cargo.lock at line 2659
name = "lettre"version = "0.11.22"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0da65617f6cb926332d039cb578aad56178da86e128db6a1b09f4c94fa5b3349"dependencies = ["base64 0.22.1","email-encoding","email_address","fastrand","futures-util","hostname","httpdate","idna","mime","native-tls","nom 8.0.0","percent-encoding","quoted_printable","socket2","tokio","url",][[package]] - edit in Cargo.lock at line 2935
][[package]]name = "md-5"version = "0.9.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15"dependencies = ["block-buffer 0.9.0","digest 0.9.0","opaque-debug", - replacement in Cargo.lock at line 3094
"http 1.4.0","http", - replacement in Cargo.lock at line 3097
"hyper 1.8.1","hyper", - edit in Cargo.lock at line 3104
"lettre", - edit in Cargo.lock at line 3120
"rusoto_core","rusoto_credential","rusoto_ses", - replacement in Cargo.lock at line 4104
"md-5 0.10.6","md-5", - edit in Cargo.lock at line 4242
name = "quoted_printable"version = "0.5.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972"[[package]] - replacement in Cargo.lock at line 4500
"h2 0.4.12","http 1.4.0","http-body 1.0.1","h2","http","http-body", - replacement in Cargo.lock at line 4504
"hyper 1.8.1","hyper", - replacement in Cargo.lock at line 4506
"hyper-tls 0.6.0","hyper-tls", - edit in Cargo.lock at line 4571
][[package]]name = "rusoto_core"version = "0.48.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1db30db44ea73551326269adcf7a2169428a054f14faf9e1768f2163494f2fa2"dependencies = ["async-trait","base64 0.13.1","bytes","crc32fast","futures","http 0.2.12","hyper 0.14.32","hyper-tls 0.5.0","lazy_static","log","rusoto_credential","rusoto_signature","rustc_version","serde","serde_json","tokio","xml-rs",][[package]]name = "rusoto_credential"version = "0.48.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ee0a6c13db5aad6047b6a44ef023dbbc21a056b6dab5be3b79ce4283d5c02d05"dependencies = ["async-trait","chrono","dirs-next","futures","hyper 0.14.32","serde","serde_json","shlex","tokio","zeroize",][[package]]name = "rusoto_ses"version = "0.48.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c365601ac8eab93ff446198a1237c6c2e3d572226cad7fe094d5dcd87d7406cd"dependencies = ["async-trait","bytes","futures","rusoto_core","serde_urlencoded","xml-rs",][[package]]name = "rusoto_signature"version = "0.48.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a5ae95491c8b4847931e291b151127eccd6ff8ca13f33603eb3d0035ecb05272"dependencies = ["base64 0.13.1","bytes","chrono","digest 0.9.0","futures","hex","hmac 0.11.0","http 0.2.12","hyper 0.14.32","log","md-5 0.9.1","percent-encoding","pin-project-lite","rusoto_credential","rustc_version","serde","sha2 0.9.9","tokio", - edit in Cargo.lock at line 5026[2.715489]→[3.53965:53984](∅→∅),[3.53984]→[2.715507:715572](∅→∅),[2.715507]→[2.715507:715572](∅→∅),[2.715572]→[3.53985:54063](∅→∅),[3.54063]→[2.715650:715714](∅→∅),[2.715650]→[2.715650:715714](∅→∅),[2.715714]→[3.54064:54081](∅→∅)
version = "0.5.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"dependencies = ["libc","windows-sys 0.52.0",][[package]]name = "socket2" - replacement in Cargo.lock at line 5438
"socket2 0.6.1","socket2", - replacement in Cargo.lock at line 5495
"socket2 0.6.1","socket2", - replacement in Cargo.lock at line 5655
"http 1.4.0","http-body 1.0.1","http","http-body", - replacement in Cargo.lock at line 5765
"http 1.4.0","http", - edit in Cargo.lock at line 6697[2.747670]→[2.747670:747686](∅→∅),[2.747686]→[3.66584:66603](∅→∅),[3.66603]→[2.747705:747770](∅→∅),[2.747705]→[2.747705:747770](∅→∅),[2.747770]→[3.66604:66682](∅→∅),[3.66682]→[2.747848:747861](∅→∅),[2.747848]→[2.747848:747861](∅→∅)
name = "xml-rs"version = "0.8.28"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"[[package]]