mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 21:06:31 +03:00
Attempt IMAP and SMTP configuration in parallel
SMTP configurations are tested in a separate async task.
This commit is contained in:
committed by
link2xt
parent
f4e0c6b5f1
commit
9b741825ef
@@ -7,6 +7,7 @@ mod server_params;
|
|||||||
|
|
||||||
use anyhow::{bail, ensure, Context as _, Result};
|
use anyhow::{bail, ensure, Context as _, Result};
|
||||||
use async_std::prelude::*;
|
use async_std::prelude::*;
|
||||||
|
use async_std::task;
|
||||||
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
|
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
|
||||||
|
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
@@ -222,8 +223,42 @@ async fn configure(ctx: &Context, param: &mut LoginParam) -> Result<()> {
|
|||||||
.flat_map(|params| params.expand_ports().into_iter())
|
.flat_map(|params| params.expand_ports().into_iter())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// Configure IMAP
|
|
||||||
progress!(ctx, 600);
|
progress!(ctx, 600);
|
||||||
|
|
||||||
|
// Spawn SMTP configuration task
|
||||||
|
let mut smtp = Smtp::new();
|
||||||
|
|
||||||
|
let context_smtp = ctx.clone();
|
||||||
|
let mut smtp_param = param.smtp.clone();
|
||||||
|
let smtp_addr = param.addr.clone();
|
||||||
|
let smtp_servers: Vec<ServerParams> = servers
|
||||||
|
.iter()
|
||||||
|
.filter(|params| params.protocol == Protocol::SMTP)
|
||||||
|
.cloned()
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let smtp_config_task = task::spawn(async move {
|
||||||
|
let mut smtp_configured = false;
|
||||||
|
for smtp_server in smtp_servers {
|
||||||
|
smtp_param.user = smtp_server.username.clone();
|
||||||
|
smtp_param.server = smtp_server.hostname.clone();
|
||||||
|
smtp_param.port = smtp_server.port;
|
||||||
|
smtp_param.security = smtp_server.socket;
|
||||||
|
|
||||||
|
if try_smtp_one_param(&context_smtp, &smtp_param, &smtp_addr, oauth2, &mut smtp).await {
|
||||||
|
smtp_configured = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if smtp_configured {
|
||||||
|
Some(smtp_param)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Configure IMAP
|
||||||
let (_s, r) = async_std::sync::channel(1);
|
let (_s, r) = async_std::sync::channel(1);
|
||||||
let mut imap = Imap::new(r);
|
let mut imap = Imap::new(r);
|
||||||
|
|
||||||
@@ -246,26 +281,10 @@ async fn configure(ctx: &Context, param: &mut LoginParam) -> Result<()> {
|
|||||||
bail!("IMAP autoconfig did not succeed");
|
bail!("IMAP autoconfig did not succeed");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure SMTP
|
// Wait for SMTP configuration
|
||||||
progress!(ctx, 750);
|
if let Some(smtp_param) = smtp_config_task.await {
|
||||||
let mut smtp = Smtp::new();
|
param.smtp = smtp_param;
|
||||||
|
} else {
|
||||||
let mut smtp_configured = false;
|
|
||||||
for smtp_server in servers
|
|
||||||
.iter()
|
|
||||||
.filter(|params| params.protocol == Protocol::SMTP)
|
|
||||||
{
|
|
||||||
param.smtp.user = smtp_server.username.clone();
|
|
||||||
param.smtp.server = smtp_server.hostname.clone();
|
|
||||||
param.smtp.port = smtp_server.port;
|
|
||||||
param.smtp.security = smtp_server.socket;
|
|
||||||
|
|
||||||
if try_smtp_one_param(ctx, ¶m.smtp, ¶m.addr, oauth2, &mut smtp).await {
|
|
||||||
smtp_configured = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !smtp_configured {
|
|
||||||
bail!("SMTP autoconfig did not succeed");
|
bail!("SMTP autoconfig did not succeed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user