tuimail/src/connect.rs
2026-02-17 20:36:24 +01:00

51 lines
1.5 KiB
Rust

use std::net::TcpStream;
use native_tls::TlsStream;
use crate::config::Config;
pub(crate) enum ImapSession {
Plain(imap::Session<TcpStream>),
Tls(imap::Session<TlsStream<TcpStream>>),
}
impl ImapSession {
pub(crate) fn noop(&mut self) -> imap::error::Result<()> {
match self {
Self::Plain(s) => s.noop(),
Self::Tls(s) => s.noop(),
}
}
pub(crate) fn logout(&mut self) -> imap::error::Result<()> {
match self {
Self::Plain(s) => s.logout(),
Self::Tls(s) => s.logout(),
}
}
}
pub(crate) fn connect(config: &Config) -> Result<ImapSession, String> {
let imap_cfg = &config.imap;
if imap_cfg.use_tls {
let tls = native_tls::TlsConnector::builder()
.build()
.map_err(|e| e.to_string())?;
let client = imap::connect(
(&*imap_cfg.host, imap_cfg.port),
&imap_cfg.host,
&tls,
)
.map_err(|e| e.to_string())?;
let session = client
.login(&imap_cfg.username, &imap_cfg.password)
.map_err(|(e, _)| e.to_string())?;
Ok(ImapSession::Tls(session))
} else {
let stream =
TcpStream::connect((&*imap_cfg.host, imap_cfg.port)).map_err(|e| e.to_string())?;
let client = imap::Client::new(stream);
let session = client
.login(&imap_cfg.username, &imap_cfg.password)
.map_err(|(e, _)| e.to_string())?;
Ok(ImapSession::Plain(session))
}
}