diff --git a/Wino.Core/Integration/ImapClientPool.cs b/Wino.Core/Integration/ImapClientPool.cs index bd531566..51b2aaec 100644 --- a/Wino.Core/Integration/ImapClientPool.cs +++ b/Wino.Core/Integration/ImapClientPool.cs @@ -69,15 +69,20 @@ namespace Wino.Core.Integration ImapClientPoolOptions = imapClientPoolOptions; } - private async Task EnsureConnectivityAsync(ImapClient client, bool isCreatedNew) + /// + /// Ensures all supported capabilities are enabled in this connection. + /// Reconnects and reauthenticates if necessary. + /// + /// Whether the client has been newly created. + private async Task EnsureCapabilitiesAsync(ImapClient client, bool isCreatedNew) { try { - await EnsureConnectedAsync(client); - + bool isReconnected = await EnsureConnectedAsync(client); + bool mustDoPostAuthIdentification = false; - if (isCreatedNew && client.IsConnected) + if ((isCreatedNew || isReconnected) && client.IsConnected) { // Activate supported pre-auth capabilities. if (client.Capabilities.HasFlag(ImapCapabilities.Compress)) @@ -106,7 +111,7 @@ namespace Wino.Core.Integration await EnsureAuthenticatedAsync(client); - if (isCreatedNew && client.IsAuthenticated) + if ((isCreatedNew || isReconnected) && client.IsAuthenticated) { if (mustDoPostAuthIdentification) await client.IdentifyAsync(_implementation); @@ -147,14 +152,14 @@ namespace Wino.Core.Integration if (_clients.TryPop(out ImapClient item)) { - await EnsureConnectivityAsync(item, false); + await EnsureCapabilitiesAsync(item, false); return item; } var client = CreateNewClient(); - await EnsureConnectivityAsync(client, true); + await EnsureCapabilitiesAsync(client, true); return client; } @@ -224,9 +229,10 @@ namespace Wino.Core.Integration _ => SecureSocketOptions.None }; - public async Task EnsureConnectedAsync(ImapClient client) + /// True if the connection is newly established. + public async Task EnsureConnectedAsync(ImapClient client) { - if (client.IsConnected) return; + if (client.IsConnected) return false; client.ServerCertificateValidationCallback = MyServerCertificateValidationCallback; @@ -249,6 +255,9 @@ namespace Wino.Core.Integration WriteToProtocolLog($"Supported authentication mechanisms: {string.Join(", ", supportedAuthMethods)}"); } } + + return true; + } private void WriteToProtocolLog(string message)