2
0

MailboxModel.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from modules.Mailcow import Mailcow
  2. from models.BaseModel import BaseModel
  3. class MailboxModel(BaseModel):
  4. parser_command = "mailbox"
  5. required_args = {
  6. "add": [["username", "password"]],
  7. "delete": [["username"]],
  8. "get": [["username"]],
  9. "edit": [["username"]]
  10. }
  11. def __init__(
  12. self,
  13. password=None,
  14. username=None,
  15. domain=None,
  16. local_part=None,
  17. active=None,
  18. sogo_access=None,
  19. name=None,
  20. authsource=None,
  21. quota=None,
  22. force_pw_update=None,
  23. tls_enforce_in=None,
  24. tls_enforce_out=None,
  25. tags=None,
  26. sender_acl=None,
  27. **kwargs
  28. ):
  29. self.mailcow = Mailcow()
  30. if username is not None and "@" in username:
  31. self.username = username
  32. self.local_part, self.domain = username.split("@")
  33. else:
  34. self.username = f"{local_part}@{domain}"
  35. self.local_part = local_part
  36. self.domain = domain
  37. self.password = password
  38. self.password2 = password
  39. self.active = active
  40. self.sogo_access = sogo_access
  41. self.name = name
  42. self.authsource = authsource
  43. self.quota = quota
  44. self.force_pw_update = force_pw_update
  45. self.tls_enforce_in = tls_enforce_in
  46. self.tls_enforce_out = tls_enforce_out
  47. self.tags = tags
  48. self.sender_acl = sender_acl
  49. @classmethod
  50. def from_dict(cls, data):
  51. return cls(
  52. domain=data.get("domain"),
  53. local_part=data.get("local_part"),
  54. password=data.get("password"),
  55. password2=data.get("password"),
  56. active=data.get("active", None),
  57. sogo_access=data.get("sogo_access", None),
  58. name=data.get("name", None),
  59. authsource=data.get("authsource", None),
  60. quota=data.get("quota", None),
  61. force_pw_update=data.get("force_pw_update", None),
  62. tls_enforce_in=data.get("tls_enforce_in", None),
  63. tls_enforce_out=data.get("tls_enforce_out", None),
  64. tags=data.get("tags", None),
  65. sender_acl=data.get("sender_acl", None)
  66. )
  67. def getAdd(self):
  68. """
  69. Get the mailbox details as a dictionary for adding, sets default values.
  70. :return: Dictionary containing mailbox details.
  71. """
  72. mailbox = {
  73. "domain": self.domain,
  74. "local_part": self.local_part,
  75. "password": self.password,
  76. "password2": self.password2,
  77. "active": self.active if self.active is not None else 1,
  78. "name": self.name if self.name is not None else "",
  79. "authsource": self.authsource if self.authsource is not None else "mailcow",
  80. "quota": self.quota if self.quota is not None else 0,
  81. "force_pw_update": self.force_pw_update if self.force_pw_update is not None else 0,
  82. "tls_enforce_in": self.tls_enforce_in if self.tls_enforce_in is not None else 0,
  83. "tls_enforce_out": self.tls_enforce_out if self.tls_enforce_out is not None else 0,
  84. "tags": self.tags if self.tags is not None else []
  85. }
  86. return {key: value for key, value in mailbox.items() if value is not None}
  87. def getEdit(self):
  88. """
  89. Get the mailbox details as a dictionary for editing, sets no default values.
  90. :return: Dictionary containing mailbox details.
  91. """
  92. mailbox = {
  93. "domain": self.domain,
  94. "local_part": self.local_part,
  95. "password": self.password,
  96. "password2": self.password2,
  97. "active": self.active,
  98. "name": self.name,
  99. "authsource": self.authsource,
  100. "quota": self.quota,
  101. "force_pw_update": self.force_pw_update,
  102. "tls_enforce_in": self.tls_enforce_in,
  103. "tls_enforce_out": self.tls_enforce_out,
  104. "tags": self.tags
  105. }
  106. return {key: value for key, value in mailbox.items() if value is not None}
  107. def get(self):
  108. """
  109. Get the mailbox details from the mailcow API.
  110. :return: Response from the mailcow API.
  111. """
  112. return self.mailcow.getMailbox(self.username)
  113. def delete(self):
  114. """
  115. Get the mailbox details from the mailcow API.
  116. :return: Response from the mailcow API.
  117. """
  118. return self.mailcow.deleteMailbox(self.username)
  119. def add(self):
  120. """
  121. Get the mailbox details from the mailcow API.
  122. :return: Response from the mailcow API.
  123. """
  124. return self.mailcow.addMailbox(self.getAdd())
  125. def edit(self):
  126. """
  127. Get the mailbox details from the mailcow API.
  128. :return: Response from the mailcow API.
  129. """
  130. return self.mailcow.editMailbox(self.username, self.getEdit())
  131. @classmethod
  132. def add_parser(cls, subparsers):
  133. parser = subparsers.add_parser(
  134. cls.parser_command,
  135. help="Manage mailboxes (add, delete, get, edit)"
  136. )
  137. parser.add_argument("object", choices=list(cls.required_args.keys()), help="Action to perform: add, delete, get, edit")
  138. parser.add_argument("--username", help="Full email address of the mailbox (e.g. user@example.com)")
  139. parser.add_argument("--password", help="Password for the mailbox (required for add)")
  140. parser.add_argument("--active", choices=["1", "0"], help="Activate (1) or deactivate (0) the mailbox")
  141. parser.add_argument("--sogo-access", choices=["1", "0"], help="Redirect mailbox to SOGo after web login (1 = yes, 0 = no)")
  142. parser.add_argument("--name", help="Display name of the mailbox owner")
  143. parser.add_argument("--authsource", help="Authentication source (default: mailcow)")
  144. parser.add_argument("--quota", help="Mailbox quota in bytes (0 = unlimited)")
  145. parser.add_argument("--force-pw-update", choices=["1", "0"], help="Force password update on next login (1 = yes, 0 = no)")
  146. parser.add_argument("--tls-enforce-in", choices=["1", "0"], help="Enforce TLS for incoming emails (1 = yes, 0 = no)")
  147. parser.add_argument("--tls-enforce-out", choices=["1", "0"], help="Enforce TLS for outgoing emails (1 = yes, 0 = no)")
  148. parser.add_argument("--tags", help="Comma-separated list of tags for the mailbox")
  149. parser.add_argument("--sender-acl", help="Comma-separated list of allowed sender addresses for this mailbox")