email_setting.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # coding=utf-8
  2. """
  3. @project: maxkb
  4. @Author:虎
  5. @file: system_setting.py
  6. @date:2024/3/19 16:29
  7. @desc:
  8. """
  9. import logging
  10. from django.core.mail.backends.smtp import EmailBackend
  11. from django.db.models import QuerySet
  12. from rest_framework import serializers
  13. from common.exception.app_exception import AppApiException
  14. from django.utils.translation import gettext_lazy as _
  15. from common.utils.logger import maxkb_logger
  16. from system_manage.models import SystemSetting, SettingType
  17. class EmailSettingSerializer(serializers.Serializer):
  18. @staticmethod
  19. def one():
  20. system_setting = QuerySet(SystemSetting).filter(type=SettingType.EMAIL.value).first()
  21. if system_setting is None:
  22. return {}
  23. return system_setting.meta
  24. class Create(serializers.Serializer):
  25. email_host = serializers.CharField(required=True, label=_('SMTP host'))
  26. email_port = serializers.IntegerField(required=True, label=_('SMTP port'))
  27. email_host_user = serializers.CharField(required=True, label=_('Sender\'s email'))
  28. email_host_password = serializers.CharField(required=True, label=_('Password'))
  29. email_use_tls = serializers.BooleanField(required=True, label=_('Whether to enable TLS'))
  30. email_use_ssl = serializers.BooleanField(required=True, label=_('Whether to enable SSL'))
  31. from_email = serializers.EmailField(required=True, label=_('Sender\'s email'))
  32. def is_valid(self, *, raise_exception=False):
  33. super().is_valid(raise_exception=True)
  34. try:
  35. EmailBackend(self.data.get("email_host"),
  36. self.data.get("email_port"),
  37. self.data.get("email_host_user"),
  38. self.data.get("email_host_password"),
  39. self.data.get("email_use_tls"),
  40. False,
  41. self.data.get("email_use_ssl")
  42. ).open()
  43. except Exception as e:
  44. maxkb_logger.error(f'Exception: {e}')
  45. raise AppApiException(1004, _('Email verification failed'))
  46. def update_or_save(self):
  47. self.is_valid(raise_exception=True)
  48. system_setting = QuerySet(SystemSetting).filter(type=SettingType.EMAIL.value).first()
  49. if system_setting is None:
  50. system_setting = SystemSetting(type=SettingType.EMAIL.value)
  51. system_setting.meta = self.to_email_meta()
  52. system_setting.save()
  53. return system_setting.meta
  54. def to_email_meta(self):
  55. return {'email_host': self.data.get('email_host'),
  56. 'email_port': self.data.get('email_port'),
  57. 'email_host_user': self.data.get('email_host_user'),
  58. 'email_host_password': self.data.get('email_host_password'),
  59. 'email_use_tls': self.data.get('email_use_tls'),
  60. 'email_use_ssl': self.data.get('email_use_ssl'),
  61. 'from_email': self.data.get('from_email')
  62. }