| 
									
										
										
										
											2024-05-29 19:06:16 +09:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | from typing import Optional | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from flask import Flask | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  | from configs import dify_config | 
					
						
							| 
									
										
										
										
											2024-11-30 23:05:22 +08:00
										 |  |  | from dify_app import DifyApp | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Mail: | 
					
						
							|  |  |  |     def __init__(self): | 
					
						
							|  |  |  |         self._client = None | 
					
						
							|  |  |  |         self._default_send_from = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def is_inited(self) -> bool: | 
					
						
							|  |  |  |         return self._client is not None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def init_app(self, app: Flask): | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |         mail_type = dify_config.MAIL_TYPE | 
					
						
							|  |  |  |         if not mail_type: | 
					
						
							|  |  |  |             logging.warning("MAIL_TYPE is not set") | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |         if dify_config.MAIL_DEFAULT_SEND_FROM: | 
					
						
							|  |  |  |             self._default_send_from = dify_config.MAIL_DEFAULT_SEND_FROM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         match mail_type: | 
					
						
							|  |  |  |             case "resend": | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                 import resend  # type: ignore | 
					
						
							| 
									
										
										
										
											2024-11-30 23:05:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |                 api_key = dify_config.RESEND_API_KEY | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  |                 if not api_key: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |                     raise ValueError("RESEND_API_KEY is not set") | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |                 api_url = dify_config.RESEND_API_URL | 
					
						
							| 
									
										
										
										
											2024-01-10 21:14:10 +08:00
										 |  |  |                 if api_url: | 
					
						
							|  |  |  |                     resend.api_url = api_url | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  |                 resend.api_key = api_key | 
					
						
							|  |  |  |                 self._client = resend.Emails | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |             case "smtp": | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  |                 from libs.smtp import SMTPClient | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |                 if not dify_config.SMTP_SERVER or not dify_config.SMTP_PORT: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |                     raise ValueError("SMTP_SERVER and SMTP_PORT are required for smtp mail type") | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |                 if not dify_config.SMTP_USE_TLS and dify_config.SMTP_OPPORTUNISTIC_TLS: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |                     raise ValueError("SMTP_OPPORTUNISTIC_TLS is not supported without enabling SMTP_USE_TLS") | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  |                 self._client = SMTPClient( | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |                     server=dify_config.SMTP_SERVER, | 
					
						
							|  |  |  |                     port=dify_config.SMTP_PORT, | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  |                     username=dify_config.SMTP_USERNAME or "", | 
					
						
							|  |  |  |                     password=dify_config.SMTP_PASSWORD or "", | 
					
						
							|  |  |  |                     _from=dify_config.MAIL_DEFAULT_SEND_FROM or "", | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |                     use_tls=dify_config.SMTP_USE_TLS, | 
					
						
							|  |  |  |                     opportunistic_tls=dify_config.SMTP_OPPORTUNISTIC_TLS, | 
					
						
							| 
									
										
										
										
											2024-02-07 18:08:41 +08:00
										 |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |             case _: | 
					
						
							|  |  |  |                 raise ValueError("Unsupported mail type {}".format(mail_type)) | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def send(self, to: str, subject: str, html: str, from_: Optional[str] = None): | 
					
						
							|  |  |  |         if not self._client: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |             raise ValueError("Mail client is not initialized") | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not from_ and self._default_send_from: | 
					
						
							|  |  |  |             from_ = self._default_send_from | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not from_: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |             raise ValueError("mail from is not set") | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not to: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |             raise ValueError("mail to is not set") | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not subject: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |             raise ValueError("mail subject is not set") | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not html: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |             raise ValueError("mail html is not set") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._client.send( | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "from": from_, | 
					
						
							|  |  |  |                 "to": to, | 
					
						
							|  |  |  |                 "subject": subject, | 
					
						
							|  |  |  |                 "html": html, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-30 23:05:22 +08:00
										 |  |  | def is_enabled() -> bool: | 
					
						
							|  |  |  |     return dify_config.MAIL_TYPE is not None and dify_config.MAIL_TYPE != "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def init_app(app: DifyApp): | 
					
						
							| 
									
										
										
										
											2023-07-14 11:19:26 +08:00
										 |  |  |     mail.init_app(app) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mail = Mail() |