| 
									
										
										
										
											2024-05-14 10:44:53 -05:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  | import smtplib | 
					
						
							|  |  |  | from email.mime.multipart import MIMEMultipart | 
					
						
							|  |  |  | from email.mime.text import MIMEText | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SMTPClient: | 
					
						
							| 
									
										
										
										
											2024-08-15 17:53:12 +08:00
										 |  |  |     def __init__( | 
					
						
							|  |  |  |         self, server: str, port: int, username: str, password: str, _from: str, use_tls=False, opportunistic_tls=False | 
					
						
							|  |  |  |     ): | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  |         self.server = server | 
					
						
							|  |  |  |         self.port = port | 
					
						
							|  |  |  |         self._from = _from | 
					
						
							|  |  |  |         self.username = username | 
					
						
							|  |  |  |         self.password = password | 
					
						
							| 
									
										
										
										
											2024-05-30 05:56:46 -05:00
										 |  |  |         self.use_tls = use_tls | 
					
						
							|  |  |  |         self.opportunistic_tls = opportunistic_tls | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def send(self, mail: dict): | 
					
						
							| 
									
										
										
										
											2024-05-14 10:44:53 -05:00
										 |  |  |         smtp = None | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-05-30 05:56:46 -05:00
										 |  |  |             if self.use_tls: | 
					
						
							|  |  |  |                 if self.opportunistic_tls: | 
					
						
							|  |  |  |                     smtp = smtplib.SMTP(self.server, self.port, timeout=10) | 
					
						
							|  |  |  |                     smtp.starttls() | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     smtp = smtplib.SMTP_SSL(self.server, self.port, timeout=10) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 smtp = smtplib.SMTP(self.server, self.port, timeout=10) | 
					
						
							| 
									
										
										
										
											2024-08-15 17:53:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-14 10:44:53 -05:00
										 |  |  |             if self.username and self.password: | 
					
						
							|  |  |  |                 smtp.login(self.username, self.password) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             msg = MIMEMultipart() | 
					
						
							| 
									
										
										
										
											2024-08-15 17:53:12 +08:00
										 |  |  |             msg["Subject"] = mail["subject"] | 
					
						
							|  |  |  |             msg["From"] = self._from | 
					
						
							|  |  |  |             msg["To"] = mail["to"] | 
					
						
							|  |  |  |             msg.attach(MIMEText(mail["html"], "html")) | 
					
						
							| 
									
										
										
										
											2024-05-14 10:44:53 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-15 17:53:12 +08:00
										 |  |  |             smtp.sendmail(self._from, mail["to"], msg.as_string()) | 
					
						
							| 
									
										
										
										
											2024-05-14 10:44:53 -05:00
										 |  |  |         except smtplib.SMTPException as e: | 
					
						
							|  |  |  |             logging.error(f"SMTP error occurred: {str(e)}") | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  |         except TimeoutError as e: | 
					
						
							|  |  |  |             logging.error(f"Timeout occurred while sending email: {str(e)}") | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  |         except Exception as e: | 
					
						
							|  |  |  |             logging.error(f"Unexpected error occurred while sending email: {str(e)}") | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             if smtp: | 
					
						
							|  |  |  |                 smtp.quit() |