From 3a2b42f5c383239406da699ed48e3cb0daafa55a Mon Sep 17 00:00:00 2001 From: rustmailer Date: Sun, 30 Nov 2025 17:40:10 +0800 Subject: [PATCH] fixZ: Send IMAP ID command after successful authentication to ensure compatibility with 163 mail servers #25 --- src/modules/imap/capabilities.rs | 1 - src/modules/imap/manager.rs | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/modules/imap/capabilities.rs b/src/modules/imap/capabilities.rs index 18932c4..24bbf33 100644 --- a/src/modules/imap/capabilities.rs +++ b/src/modules/imap/capabilities.rs @@ -16,7 +16,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . - use crate::modules::error::code::ErrorCode; use crate::modules::imap::session::SessionStream; use crate::{modules::error::BichonResult, raise_error}; diff --git a/src/modules/imap/manager.rs b/src/modules/imap/manager.rs index adc512a..15548e9 100644 --- a/src/modules/imap/manager.rs +++ b/src/modules/imap/manager.rs @@ -28,7 +28,7 @@ use crate::modules::imap::client::Client; use crate::modules::imap::oauth2::OAuth2; use crate::modules::imap::session::SessionStream; use crate::modules::oauth2::token::OAuth2AccessToken; -use crate::{decrypt, raise_error}; +use crate::{bichon_version, decrypt, raise_error}; use async_imap::Session; use tracing::error; @@ -143,6 +143,19 @@ impl ImapConnectionManager { .await; return Err(error); } + + if capabilities.has_str("ID") || capabilities.has_str("id") { + session + .id([ + ("name", Some("bichon")), + ("version", Some(bichon_version!())), + ("vendor", Some("rustmailer")), + ]) + .await + .map_err(|e| { + raise_error!(format!("{:#?}", e), ErrorCode::ImapCommandFailed) + })?; + } } Err(error) => { error!("Failed to fetch IMAP capabilities: {:#?}", error);