@@ -10,7 +10,7 @@ use async_smtp::*;
10
10
use crate :: constants:: * ;
11
11
use crate :: context:: Context ;
12
12
use crate :: events:: EventType ;
13
- use crate :: login_param:: { dc_build_tls, CertificateChecks , LoginParam } ;
13
+ use crate :: login_param:: { dc_build_tls, CertificateChecks , LoginParam , ServerLoginParam } ;
14
14
use crate :: oauth2:: * ;
15
15
use crate :: provider:: { get_provider_info, Socket } ;
16
16
use crate :: stock:: StockMessage ;
@@ -94,31 +94,53 @@ impl Smtp {
94
94
. unwrap_or_default ( )
95
95
}
96
96
97
+ /// Connect using configured parameters.
98
+ pub async fn connect_configured ( & mut self , context : & Context ) -> Result < ( ) > {
99
+ if self . is_connected ( ) . await {
100
+ return Ok ( ( ) ) ;
101
+ }
102
+
103
+ let lp = LoginParam :: from_database ( context, "configured_" ) . await ;
104
+ self . connect (
105
+ context,
106
+ & lp. smtp ,
107
+ & lp. addr ,
108
+ lp. server_flags & DC_LP_AUTH_OAUTH2 != 0 ,
109
+ )
110
+ . await
111
+ }
112
+
97
113
/// Connect using the provided login params.
98
- pub async fn connect ( & mut self , context : & Context , lp : & LoginParam ) -> Result < ( ) > {
114
+ pub async fn connect (
115
+ & mut self ,
116
+ context : & Context ,
117
+ lp : & ServerLoginParam ,
118
+ addr : & str ,
119
+ oauth2 : bool ,
120
+ ) -> Result < ( ) > {
99
121
if self . is_connected ( ) . await {
100
122
warn ! ( context, "SMTP already connected." ) ;
101
123
return Ok ( ( ) ) ;
102
124
}
103
125
104
- if lp. smtp . server . is_empty ( ) || lp. smtp . port == 0 {
126
+ if lp. server . is_empty ( ) || lp. port == 0 {
105
127
context. emit_event ( EventType :: ErrorNetwork ( "SMTP bad parameters." . into ( ) ) ) ;
106
128
return Err ( Error :: BadParameters ) ;
107
129
}
108
130
109
131
let from =
110
- EmailAddress :: new ( lp . addr . clone ( ) ) . map_err ( |err| Error :: InvalidLoginAddress {
111
- address : lp . addr . clone ( ) ,
132
+ EmailAddress :: new ( addr. to_string ( ) ) . map_err ( |err| Error :: InvalidLoginAddress {
133
+ address : addr. to_string ( ) ,
112
134
error : err,
113
135
} ) ?;
114
136
115
137
self . from = Some ( from) ;
116
138
117
- let domain = & lp. smtp . server ;
118
- let port = lp. smtp . port ;
139
+ let domain = & lp. server ;
140
+ let port = lp. port ;
119
141
120
- let provider = get_provider_info ( & lp . addr ) ;
121
- let strict_tls = match lp. smtp . certificate_checks {
142
+ let provider = get_provider_info ( addr) ;
143
+ let strict_tls = match lp. certificate_checks {
122
144
CertificateChecks :: Automatic => provider. map_or ( false , |provider| provider. strict_tls ) ,
123
145
CertificateChecks :: Strict => true ,
124
146
CertificateChecks :: AcceptInvalidCertificates
@@ -127,17 +149,16 @@ impl Smtp {
127
149
let tls_config = dc_build_tls ( strict_tls) ;
128
150
let tls_parameters = ClientTlsParameters :: new ( domain. to_string ( ) , tls_config) ;
129
151
130
- let ( creds, mechanism) = if 0 != lp . server_flags & ( DC_LP_AUTH_OAUTH2 as i32 ) {
152
+ let ( creds, mechanism) = if oauth2 {
131
153
// oauth2
132
- let addr = & lp. addr ;
133
- let send_pw = & lp. smtp . password ;
154
+ let send_pw = & lp. password ;
134
155
let access_token = dc_get_oauth2_access_token ( context, addr, send_pw, false ) . await ;
135
156
if access_token. is_none ( ) {
136
157
return Err ( Error :: Oauth2Error {
137
158
address : addr. to_string ( ) ,
138
159
} ) ;
139
160
}
140
- let user = & lp. smtp . user ;
161
+ let user = & lp. user ;
141
162
(
142
163
smtp:: authentication:: Credentials :: new (
143
164
user. to_string ( ) ,
@@ -147,8 +168,8 @@ impl Smtp {
147
168
)
148
169
} else {
149
170
// plain
150
- let user = lp. smtp . user . clone ( ) ;
151
- let pw = lp. smtp . password . clone ( ) ;
171
+ let user = lp. user . clone ( ) ;
172
+ let pw = lp. password . clone ( ) ;
152
173
(
153
174
smtp:: authentication:: Credentials :: new ( user, pw) ,
154
175
vec ! [
@@ -158,7 +179,7 @@ impl Smtp {
158
179
)
159
180
} ;
160
181
161
- let security = match lp. smtp . security {
182
+ let security = match lp. security {
162
183
Socket :: STARTTLS | Socket :: Plain => smtp:: ClientSecurity :: Opportunistic ( tls_parameters) ,
163
184
_ => smtp:: ClientSecurity :: Wrapper ( tls_parameters) ,
164
185
} ;
@@ -193,7 +214,7 @@ impl Smtp {
193
214
194
215
context. emit_event ( EventType :: SmtpConnected ( format ! (
195
216
"SMTP-LOGIN as {} ok" ,
196
- lp. smtp . user,
217
+ lp. user,
197
218
) ) ) ;
198
219
199
220
Ok ( ( ) )
0 commit comments