@@ -79,8 +79,8 @@ async def _send_imap_id(imap: aioimaplib.IMAP4 | aioimaplib.IMAP4_SSL) -> None:
7979 logger .warning (f"IMAP ID command failed: { e !s} " )
8080
8181
82- def _create_smtp_ssl_context (verify_ssl : bool ) -> ssl .SSLContext | None :
83- """Create SSL context for SMTP connections.
82+ def _create_ssl_context (verify_ssl : bool ) -> ssl .SSLContext | None :
83+ """Create SSL context for SMTP/IMAP connections.
8484
8585 Returns None for default verification, or permissive context
8686 for self-signed certificates when verify_ssl=False.
@@ -93,6 +93,10 @@ def _create_smtp_ssl_context(verify_ssl: bool) -> ssl.SSLContext | None:
9393 return ctx
9494
9595
96+ # Backwards-compatible alias
97+ _create_smtp_ssl_context = _create_ssl_context
98+
99+
96100class EmailClient :
97101 def __init__ (self , email_server : EmailServer , sender : str | None = None ):
98102 self .email_server = email_server
@@ -104,9 +108,16 @@ def __init__(self, email_server: EmailServer, sender: str | None = None):
104108 self .smtp_start_tls = self .email_server .start_ssl
105109 self .smtp_verify_ssl = self .email_server .verify_ssl
106110
111+ def _imap_connect (self ) -> aioimaplib .IMAP4_SSL | aioimaplib .IMAP4 :
112+ """Create a new IMAP connection with the configured SSL context."""
113+ if self .email_server .use_ssl :
114+ imap_ssl_context = _create_ssl_context (self .email_server .verify_ssl )
115+ return self .imap_class (self .email_server .host , self .email_server .port , ssl_context = imap_ssl_context )
116+ return self .imap_class (self .email_server .host , self .email_server .port )
117+
107118 def _get_smtp_ssl_context (self ) -> ssl .SSLContext | None :
108119 """Get SSL context for SMTP connections based on verify_ssl setting."""
109- return _create_smtp_ssl_context (self .smtp_verify_ssl )
120+ return _create_ssl_context (self .smtp_verify_ssl )
110121
111122 @staticmethod
112123 def _parse_recipients (email_message ) -> list [str ]:
@@ -403,7 +414,7 @@ async def get_email_count(
403414 flagged : bool | None = None ,
404415 answered : bool | None = None ,
405416 ) -> int :
406- imap = self .imap_class ( self . email_server . host , self . email_server . port )
417+ imap = self ._imap_connect ( )
407418 try :
408419 # Wait for the connection to be established
409420 await imap ._client_task
@@ -449,7 +460,7 @@ async def get_emails_metadata_stream(
449460 flagged : bool | None = None ,
450461 answered : bool | None = None ,
451462 ) -> AsyncGenerator [dict [str , Any ], None ]:
452- imap = self .imap_class ( self . email_server . host , self . email_server . port )
463+ imap = self ._imap_connect ( )
453464 try :
454465 # Wait for the connection to be established
455466 await imap ._client_task
@@ -563,7 +574,7 @@ async def _fetch_email_with_formats(self, imap, email_id: str) -> list | None:
563574 return None
564575
565576 async def get_email_body_by_id (self , email_id : str , mailbox : str = "INBOX" ) -> dict [str , Any ] | None :
566- imap = self .imap_class ( self . email_server . host , self . email_server . port )
577+ imap = self ._imap_connect ( )
567578 try :
568579 # Wait for the connection to be established
569580 await imap ._client_task
@@ -618,7 +629,7 @@ async def download_attachment(
618629 Returns:
619630 A dictionary with download result information.
620631 """
621- imap = self .imap_class ( self . email_server . host , self . email_server . port )
632+ imap = self ._imap_connect ( )
622633 try :
623634 await imap ._client_task
624635 await imap .wait_hello_from_server ()
@@ -853,8 +864,11 @@ async def append_to_sent(
853864 Returns:
854865 True if successfully saved, False otherwise
855866 """
856- imap_class = aioimaplib .IMAP4_SSL if incoming_server .use_ssl else aioimaplib .IMAP4
857- imap = imap_class (incoming_server .host , incoming_server .port )
867+ if incoming_server .use_ssl :
868+ imap_ssl_context = _create_ssl_context (incoming_server .verify_ssl )
869+ imap = aioimaplib .IMAP4_SSL (incoming_server .host , incoming_server .port , ssl_context = imap_ssl_context )
870+ else :
871+ imap = aioimaplib .IMAP4 (incoming_server .host , incoming_server .port )
858872
859873 # Common Sent folder names across different providers
860874 sent_folder_candidates = [
@@ -928,7 +942,7 @@ async def append_to_sent(
928942
929943 async def delete_emails (self , email_ids : list [str ], mailbox : str = "INBOX" ) -> tuple [list [str ], list [str ]]:
930944 """Delete emails by their UIDs. Returns (deleted_ids, failed_ids)."""
931- imap = self .imap_class ( self . email_server . host , self . email_server . port )
945+ imap = self ._imap_connect ( )
932946 deleted_ids = []
933947 failed_ids = []
934948
0 commit comments