ispconfig-py/src/ispconfig/mail.py
Kayos 44ce76cb44 feat: full ISPConfig remote API coverage + re-runnable generator (v0.2)
v0.1 shipped ~15 hand-audited methods across sites/dns/mail/databases/clients.
That's enough for daily ops but every new Tort Host / cWHO feature has been
hitting the wall at the edge of that coverage. This extends the SDK to wrap
every method the panel exposes — 312 of them as of Rackham 2026-04-22,
verified against the live list_functions() introspection call with only one
name-mismatch (``__construct``, a PHP lifecycle artifact, not a real API
method).

The hand-audited helpers stay where they are. Every module now has two
clearly-delimited sections: an auto-generated block at the top (emitted by
tools/gen_methods.py from tools/method_inventory.json), and a HAND-EDIT ONLY
BELOW block at the bottom that survives regeneration. Name collisions
between auto and hand always resolve in favor of the hand version — the
generator emits a ``# skipped foo: hand-audited helper takes precedence``
comment in the auto block for traceability.

Pipeline:
- tools/extract_inventory.py reads remote.*.inc.php + remoting.inc.php,
  pulls docblocks + param defaults, dumps one JSON record per method.
  Regex is balanced-paren aware so ``$params = array()`` defaults don't
  truncate the signature at the wrong close-paren (that footgun hid three
  methods from the first run — sites_aps_available_packages_list,
  sites_aps_instance_delete, openvz_vm_add_from_template).
- tools/method_inventory.json is the committed inventory — future ISPConfig
  upgrades diff against this file to see scope at a glance.
- tools/gen_methods.py groups by method-name prefix onto the module classes
  listed in the README table, emits a 1:1 Python wrapper per method with
  the original PHP filename + line number in the docstring, and ensures
  ``from typing import Any`` is present in preexisting modules before
  emitting ``Any`` type annotations.

New submodules (all auto-generated, wired into ISPConfigClient.__init__):
admin, aps, backups, cron, domains, ftp, misc, monitor, openvz, server,
shell, webdav. Existing modules (sites, dns, mail, databases, clients) got
their auto block filled in and their hand-audited helpers preserved.

Escape hatches on the top-level client:
- raw_call(method, *args) routes an arbitrary method name through the same
  session-management + retry + fault-mapping pipeline the typed wrappers
  use. Fix for "panel shipped a new method, SDK hasn't caught up" —
  callers don't have to reach back into _soap.
- list_functions() wraps get_function_list() for panel introspection.

Fault mapping widened: ``no_client_found`` and "no user account" messages
now map to NotFoundError instead of FaultError, matching the existing
``no_domain_found`` convention. Older code that caught raw FaultError
there will still work (NotFoundError extends ISPConfigError) but callers
can now catch the specific type.

Testing:
- tests/test_unit.py — 12 existing pure-unit tests pass unchanged.
- tests/test_smoke.py — extended from 4 read-only calls to 21. One probe
  per new auto-generated module plus raw_call and list_functions smoke
  tests. Methods gated behind admin permission skip gracefully with a
  documented reason (kayos is a reseller, not admin): monitor_jobqueue_count,
  sites_cron_get, sites_ftp_user_get, openvz_get_free_ip,
  quota_get_by_user. Results against Rackham 2026-04-22:
  28 passed, 5 skipped (all documented admin-only), 0 failed.
- ISPCONFIG_TEST_VERIFY_SSL=0 env-var knob added to conftest for panels
  with self-signed or mismatched certs.

Version bump 0.1.0 -> 0.2.0. README restructured into Hand-audited /
Auto-generated / Escape hatch / Footguns sections with a regeneration
recipe for future ISPConfig upgrades. Ruff per-file SLF001 ignore extended
to every submodule (submodules are all authorized callers of the client's
private ``_call`` dispatcher by design). mypy strict passes; ruff check
passes; ruff format applied across src / tools / tests.
2026-04-22 13:58:38 -07:00

1226 lines
49 KiB
Python

"""``mail.*`` — mail domains, mailboxes, forwarders.
Note: the ISPConfig remote method is ``mail_forward_*`` (singular), not
``mail_forwarding_*``. Our wrapper exposes :meth:`MailModule.forward_add`
etc; the old ``forwarding`` names are available as aliases for anyone coming
from the PHP snippets.
"""
from __future__ import annotations
import logging
from collections.abc import Mapping
from typing import TYPE_CHECKING, Any, cast
from .types import MailDomain, MailUser
if TYPE_CHECKING:
from .client import ISPConfigClient
log = logging.getLogger("ispconfig.mail")
class MailModule:
def __init__(self, client: ISPConfigClient) -> None:
self._c = client
# ---- AUTO-GENERATED START (do not hand-edit above this line) ----
# Regenerate with: python3 tools/gen_methods.py
def mail_alias_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_alias_add``.
Source: ``mail.inc.php`` line 424.
PHP signature: ``mail_alias_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_alias_add", ("client_id", client_id), ("params", params))
def mail_alias_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_alias_delete``.
Source: ``mail.inc.php`` line 466.
PHP signature: ``mail_alias_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_alias_delete", ("primary_id", primary_id))
def mail_alias_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_alias_get``.
Source: ``mail.inc.php`` line 410.
PHP signature: ``mail_alias_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_alias_get", ("primary_id", primary_id))
def mail_alias_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_alias_update``.
Source: ``mail.inc.php`` line 444.
PHP signature: ``mail_alias_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_alias_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_aliasdomain_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_aliasdomain_add``.
Source: ``mail.inc.php`` line 111.
PHP signature: ``mail_aliasdomain_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_aliasdomain_add", ("client_id", client_id), ("params", params))
def mail_aliasdomain_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_aliasdomain_delete``.
Source: ``mail.inc.php`` line 133.
PHP signature: ``mail_aliasdomain_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_aliasdomain_delete", ("primary_id", primary_id))
def mail_aliasdomain_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_aliasdomain_get``.
Source: ``mail.inc.php`` line 97.
PHP signature: ``mail_aliasdomain_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_aliasdomain_get", ("primary_id", primary_id))
def mail_aliasdomain_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_aliasdomain_update``.
Source: ``mail.inc.php`` line 121.
PHP signature: ``mail_aliasdomain_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_aliasdomain_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_blacklist_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_blacklist_add``.
Source: ``mail.inc.php`` line 1040.
PHP signature: ``mail_blacklist_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_blacklist_add", ("client_id", client_id), ("params", params))
def mail_blacklist_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_blacklist_delete``.
Source: ``mail.inc.php`` line 1062.
PHP signature: ``mail_blacklist_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_blacklist_delete", ("primary_id", primary_id))
def mail_blacklist_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_blacklist_get``.
Source: ``mail.inc.php`` line 1026.
PHP signature: ``mail_blacklist_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_blacklist_get", ("primary_id", primary_id))
def mail_blacklist_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_blacklist_update``.
Source: ``mail.inc.php`` line 1050.
PHP signature: ``mail_blacklist_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_blacklist_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_catchall_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_catchall_add``.
Source: ``mail.inc.php`` line 543.
PHP signature: ``mail_catchall_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_catchall_add", ("client_id", client_id), ("params", params))
def mail_catchall_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_catchall_delete``.
Source: ``mail.inc.php`` line 564.
PHP signature: ``mail_catchall_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_catchall_delete", ("primary_id", primary_id))
def mail_catchall_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_catchall_get``.
Source: ``mail.inc.php`` line 529.
PHP signature: ``mail_catchall_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_catchall_get", ("primary_id", primary_id))
def mail_catchall_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_catchall_update``.
Source: ``mail.inc.php`` line 553.
PHP signature: ``mail_catchall_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_catchall_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_domain_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_domain_add``.
Source: ``mail.inc.php`` line 57.
PHP signature: ``mail_domain_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_domain_add", ("client_id", client_id), ("params", params))
def mail_domain_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_domain_delete``.
Source: ``mail.inc.php`` line 86.
PHP signature: ``mail_domain_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_domain_delete", ("primary_id", primary_id))
def mail_domain_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_domain_get``.
Source: ``mail.inc.php`` line 43.
PHP signature: ``mail_domain_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_domain_get", ("primary_id", primary_id))
def mail_domain_get_by_domain(self, domain: Any) -> Any:
"""
Fetch the mail_domain record for the provided domain.
Source: ``mail.inc.php`` line 1132.
PHP signature: ``mail_domain_get_by_domain($session_id, $domain)``.
Params (from PHPDoc):
the (string): fully qualified domain (or subdomain)
Returns: array - array of arrays corresponding to the mail_domain table's records
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_domain_get_by_domain", ("domain", domain))
def mail_domain_set_status(self, primary_id: Any, status: Any) -> Any:
"""
Auto-generated wrapper for ``mail_domain_set_status``.
Source: ``mail.inc.php`` line 1147.
PHP signature: ``mail_domain_set_status($session_id, $primary_id, $status)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_domain_set_status", ("primary_id", primary_id), ("status", status))
def mail_domain_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_domain_update``.
Source: ``mail.inc.php`` line 75.
PHP signature: ``mail_domain_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_domain_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_fetchmail_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_fetchmail_add``.
Source: ``mail.inc.php`` line 940.
PHP signature: ``mail_fetchmail_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_fetchmail_add", ("client_id", client_id), ("params", params))
def mail_fetchmail_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_fetchmail_delete``.
Source: ``mail.inc.php`` line 962.
PHP signature: ``mail_fetchmail_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_fetchmail_delete", ("primary_id", primary_id))
def mail_fetchmail_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_fetchmail_get``.
Source: ``mail.inc.php`` line 926.
PHP signature: ``mail_fetchmail_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_fetchmail_get", ("primary_id", primary_id))
def mail_fetchmail_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_fetchmail_update``.
Source: ``mail.inc.php`` line 950.
PHP signature: ``mail_fetchmail_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_fetchmail_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_filter_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_filter_add``.
Source: ``mail.inc.php`` line 1090.
PHP signature: ``mail_filter_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_filter_add", ("client_id", client_id), ("params", params))
def mail_filter_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_filter_delete``.
Source: ``mail.inc.php`` line 1112.
PHP signature: ``mail_filter_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_filter_delete", ("primary_id", primary_id))
def mail_filter_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_filter_get``.
Source: ``mail.inc.php`` line 1076.
PHP signature: ``mail_filter_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_filter_get", ("primary_id", primary_id))
def mail_filter_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_filter_update``.
Source: ``mail.inc.php`` line 1100.
PHP signature: ``mail_filter_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_filter_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_forward_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_forward_add``.
Source: ``mail.inc.php`` line 493.
PHP signature: ``mail_forward_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_forward_add", ("client_id", client_id), ("params", params))
def mail_forward_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_forward_delete``.
Source: ``mail.inc.php`` line 515.
PHP signature: ``mail_forward_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_forward_delete", ("primary_id", primary_id))
def mail_forward_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_forward_get``.
Source: ``mail.inc.php`` line 479.
PHP signature: ``mail_forward_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_forward_get", ("primary_id", primary_id))
def mail_forward_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_forward_update``.
Source: ``mail.inc.php`` line 503.
PHP signature: ``mail_forward_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_forward_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_mailinglist_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_mailinglist_add``.
Source: ``mail.inc.php`` line 160.
PHP signature: ``mail_mailinglist_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_mailinglist_add", ("client_id", client_id), ("params", params))
def mail_mailinglist_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_mailinglist_delete``.
Source: ``mail.inc.php`` line 182.
PHP signature: ``mail_mailinglist_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_mailinglist_delete", ("primary_id", primary_id))
def mail_mailinglist_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_mailinglist_get``.
Source: ``mail.inc.php`` line 146.
PHP signature: ``mail_mailinglist_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_mailinglist_get", ("primary_id", primary_id))
def mail_mailinglist_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_mailinglist_update``.
Source: ``mail.inc.php`` line 171.
PHP signature: ``mail_mailinglist_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_mailinglist_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_policy_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_policy_add``.
Source: ``mail.inc.php`` line 890.
PHP signature: ``mail_policy_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_policy_add", ("client_id", client_id), ("params", params))
def mail_policy_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_policy_delete``.
Source: ``mail.inc.php`` line 912.
PHP signature: ``mail_policy_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_policy_delete", ("primary_id", primary_id))
def mail_policy_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_policy_get``.
Source: ``mail.inc.php`` line 876.
PHP signature: ``mail_policy_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_policy_get", ("primary_id", primary_id))
def mail_policy_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_policy_update``.
Source: ``mail.inc.php`` line 900.
PHP signature: ``mail_policy_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_policy_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_relay_domain_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_domain_add``.
Source: ``mail.inc.php`` line 678.
PHP signature: ``mail_relay_domain_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_relay_domain_add", ("client_id", client_id), ("params", params))
def mail_relay_domain_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_domain_delete``.
Source: ``mail.inc.php`` line 688.
PHP signature: ``mail_relay_domain_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_relay_domain_delete", ("primary_id", primary_id))
def mail_relay_domain_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_domain_get``.
Source: ``mail.inc.php`` line 699.
PHP signature: ``mail_relay_domain_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_relay_domain_get", ("primary_id", primary_id))
def mail_relay_domain_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_domain_update``.
Source: ``mail.inc.php`` line 713.
PHP signature: ``mail_relay_domain_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_relay_domain_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_relay_recipient_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_recipient_add``.
Source: ``mail.inc.php`` line 642.
PHP signature: ``mail_relay_recipient_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_relay_recipient_add", ("client_id", client_id), ("params", params))
def mail_relay_recipient_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_recipient_delete``.
Source: ``mail.inc.php`` line 664.
PHP signature: ``mail_relay_recipient_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_relay_recipient_delete", ("primary_id", primary_id))
def mail_relay_recipient_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_recipient_get``.
Source: ``mail.inc.php`` line 627.
PHP signature: ``mail_relay_recipient_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_relay_recipient_get", ("primary_id", primary_id))
def mail_relay_recipient_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_relay_recipient_update``.
Source: ``mail.inc.php`` line 652.
PHP signature: ``mail_relay_recipient_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_relay_recipient_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_spamfilter_blacklist_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_blacklist_add``.
Source: ``mail.inc.php`` line 790.
PHP signature: ``mail_spamfilter_blacklist_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_blacklist_add", ("client_id", client_id), ("params", params))
def mail_spamfilter_blacklist_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_blacklist_delete``.
Source: ``mail.inc.php`` line 812.
PHP signature: ``mail_spamfilter_blacklist_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_blacklist_delete", ("primary_id", primary_id))
def mail_spamfilter_blacklist_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_blacklist_get``.
Source: ``mail.inc.php`` line 776.
PHP signature: ``mail_spamfilter_blacklist_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_blacklist_get", ("primary_id", primary_id))
def mail_spamfilter_blacklist_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_blacklist_update``.
Source: ``mail.inc.php`` line 800.
PHP signature: ``mail_spamfilter_blacklist_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_spamfilter_blacklist_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_spamfilter_user_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_user_add``.
Source: ``mail.inc.php`` line 840.
PHP signature: ``mail_spamfilter_user_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_user_add", ("client_id", client_id), ("params", params))
def mail_spamfilter_user_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_user_delete``.
Source: ``mail.inc.php`` line 862.
PHP signature: ``mail_spamfilter_user_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_user_delete", ("primary_id", primary_id))
def mail_spamfilter_user_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_user_get``.
Source: ``mail.inc.php`` line 826.
PHP signature: ``mail_spamfilter_user_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_user_get", ("primary_id", primary_id))
def mail_spamfilter_user_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_user_update``.
Source: ``mail.inc.php`` line 850.
PHP signature: ``mail_spamfilter_user_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_spamfilter_user_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_spamfilter_whitelist_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_whitelist_add``.
Source: ``mail.inc.php`` line 740.
PHP signature: ``mail_spamfilter_whitelist_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_whitelist_add", ("client_id", client_id), ("params", params))
def mail_spamfilter_whitelist_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_whitelist_delete``.
Source: ``mail.inc.php`` line 762.
PHP signature: ``mail_spamfilter_whitelist_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_whitelist_delete", ("primary_id", primary_id))
def mail_spamfilter_whitelist_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_whitelist_get``.
Source: ``mail.inc.php`` line 726.
PHP signature: ``mail_spamfilter_whitelist_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_spamfilter_whitelist_get", ("primary_id", primary_id))
def mail_spamfilter_whitelist_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_spamfilter_whitelist_update``.
Source: ``mail.inc.php`` line 750.
PHP signature: ``mail_spamfilter_whitelist_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_spamfilter_whitelist_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_transport_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_transport_add``.
Source: ``mail.inc.php`` line 591.
PHP signature: ``mail_transport_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_transport_add", ("client_id", client_id), ("params", params))
def mail_transport_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_transport_delete``.
Source: ``mail.inc.php`` line 613.
PHP signature: ``mail_transport_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_transport_delete", ("primary_id", primary_id))
def mail_transport_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_transport_get``.
Source: ``mail.inc.php`` line 577.
PHP signature: ``mail_transport_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_transport_get", ("primary_id", primary_id))
def mail_transport_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_transport_update``.
Source: ``mail.inc.php`` line 601.
PHP signature: ``mail_transport_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_transport_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_user_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_add``.
Source: ``mail.inc.php`` line 226.
PHP signature: ``mail_user_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_add", ("client_id", client_id), ("params", params))
def mail_user_backup(self, primary_id: Any, action_type: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_backup``.
Source: ``mail.inc.php`` line 366.
PHP signature: ``mail_user_backup($session_id, $primary_id, $action_type)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_backup", ("primary_id", primary_id), ("action_type", action_type))
def mail_user_backup_list(self, primary_id: Any = None) -> Any:
"""
Auto-generated wrapper for ``mail_user_backup_list``.
Source: ``mail.inc.php`` line 343.
PHP signature: ``mail_user_backup_list($session_id, $primary_id = null)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_backup_list", ("primary_id", primary_id))
def mail_user_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_delete``.
Source: ``mail.inc.php`` line 279.
PHP signature: ``mail_user_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_delete", ("primary_id", primary_id))
def mail_user_filter_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_filter_add``.
Source: ``mail.inc.php`` line 303.
PHP signature: ``mail_user_filter_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_filter_add", ("client_id", client_id), ("params", params))
def mail_user_filter_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_filter_delete``.
Source: ``mail.inc.php`` line 328.
PHP signature: ``mail_user_filter_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_filter_delete", ("primary_id", primary_id))
def mail_user_filter_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_filter_get``.
Source: ``mail.inc.php`` line 291.
PHP signature: ``mail_user_filter_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_filter_get", ("primary_id", primary_id))
def mail_user_filter_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_filter_update``.
Source: ``mail.inc.php`` line 315.
PHP signature: ``mail_user_filter_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_user_filter_update",
("client_id", client_id),
("primary_id", primary_id),
("params", params),
)
def mail_user_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_get``.
Source: ``mail.inc.php`` line 193.
PHP signature: ``mail_user_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_get", ("primary_id", primary_id))
def mail_user_get_all_by_client(self, client_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_get_all_by_client``.
Source: ``mail.inc.php`` line 207.
PHP signature: ``mail_user_get_all_by_client($session_id, $client_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_user_get_all_by_client", ("client_id", client_id))
def mail_user_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_user_update``.
Source: ``mail.inc.php`` line 255.
PHP signature: ``mail_user_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_user_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mail_whitelist_add(self, client_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_whitelist_add``.
Source: ``mail.inc.php`` line 990.
PHP signature: ``mail_whitelist_add($session_id, $client_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_whitelist_add", ("client_id", client_id), ("params", params))
def mail_whitelist_delete(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_whitelist_delete``.
Source: ``mail.inc.php`` line 1012.
PHP signature: ``mail_whitelist_delete($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_whitelist_delete", ("primary_id", primary_id))
def mail_whitelist_get(self, primary_id: Any) -> Any:
"""
Auto-generated wrapper for ``mail_whitelist_get``.
Source: ``mail.inc.php`` line 976.
PHP signature: ``mail_whitelist_get($session_id, $primary_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mail_whitelist_get", ("primary_id", primary_id))
def mail_whitelist_update(self, client_id: Any, primary_id: Any, params: Any) -> Any:
"""
Auto-generated wrapper for ``mail_whitelist_update``.
Source: ``mail.inc.php`` line 1000.
PHP signature: ``mail_whitelist_update($session_id, $client_id, $primary_id, $params)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call(
"mail_whitelist_update", ("client_id", client_id), ("primary_id", primary_id), ("params", params)
)
def mailquota_get_by_user(self, client_id: Any) -> Any:
"""
Auto-generated wrapper for ``mailquota_get_by_user``.
Source: ``mail.inc.php`` line 1171.
PHP signature: ``mailquota_get_by_user($session_id, $client_id)``.
AUTO-GENERATED - param shapes may need verification against your
ISPConfig version. File issues at Sulkta-Coop/ispconfig-py.
"""
return self._c._call("mailquota_get_by_user", ("client_id", client_id))
# ---- AUTO-GENERATED END ----
# ---- HAND-EDIT ONLY BELOW ----
# ---- HAND-EDIT ONLY BELOW ----
# ---- HAND-EDIT ONLY BELOW ----
# ---- mail domains -------------------------------------------------
def domain_get(self, primary_id: int) -> MailDomain:
return cast(MailDomain, self._c._call("mail_domain_get", ("primary_id", int(primary_id))))
def domain_get_by_domain(self, domain: str) -> list[MailDomain]:
return self._c._call("mail_domain_get_by_domain", ("domain", domain)) or []
def domain_add(self, client_id: int, params: Mapping[str, Any]) -> int:
return int(
self._c._call(
"mail_domain_add",
("client_id", int(client_id)),
("params", dict(params)),
)
)
def domain_update(self, client_id: int, primary_id: int, params: Mapping[str, Any]) -> int:
return int(
self._c._call(
"mail_domain_update",
("client_id", int(client_id)),
("primary_id", int(primary_id)),
("params", dict(params)),
)
)
def domain_delete(self, primary_id: int) -> int:
return int(self._c._call("mail_domain_delete", ("primary_id", int(primary_id))))
# ---- mail users ---------------------------------------------------
def user_get(self, primary_id: int | Mapping[str, Any]) -> MailUser | list[MailUser]:
"""Fetch a mailuser.
Pass an int ``mailuser_id`` to get a single row, or a dict of filter
key/values (e.g. ``{'email': 'x@y.com'}``) to get a list.
.. note::
ISPConfig's SOAP is inconsistent: a filter dict that matches
multiple rows returns an array, but a filter dict that matches
*exactly one* row sometimes returns a single map instead of a
1-element array. When a filter dict is passed we always normalize
to a list so callers can iterate without surprises.
"""
if isinstance(primary_id, Mapping):
result = self._c._call("mail_user_get", ("primary_id", dict(primary_id)))
if result is None:
return cast(list[MailUser], [])
if isinstance(result, list):
return cast(list[MailUser], result)
# single-hit quirk — wrap into a list for consistency.
return cast(list[MailUser], [result])
return cast(MailUser, self._c._call("mail_user_get", ("primary_id", int(primary_id))))
def user_add(self, client_id: int, params: Mapping[str, Any]) -> int:
return int(
self._c._call(
"mail_user_add",
("client_id", int(client_id)),
("params", dict(params)),
)
)
def user_update(self, client_id: int, primary_id: int, params: Mapping[str, Any]) -> int:
return int(
self._c._call(
"mail_user_update",
("client_id", int(client_id)),
("primary_id", int(primary_id)),
("params", dict(params)),
)
)
def user_delete(self, primary_id: int) -> int:
return int(self._c._call("mail_user_delete", ("primary_id", int(primary_id))))
# ---- mail forward -------------------------------------------------
def forward_add(self, client_id: int, params: Mapping[str, Any]) -> int:
return int(
self._c._call(
"mail_forward_add",
("client_id", int(client_id)),
("params", dict(params)),
)
)
def forward_update(self, client_id: int, primary_id: int, params: Mapping[str, Any]) -> int:
return int(
self._c._call(
"mail_forward_update",
("client_id", int(client_id)),
("primary_id", int(primary_id)),
("params", dict(params)),
)
)
def forward_delete(self, primary_id: int) -> int:
return int(self._c._call("mail_forward_delete", ("primary_id", int(primary_id))))
# Aliases for callers coming from the old ``mail_forwarding_*`` PHP names.
forwarding_add = forward_add
forwarding_update = forward_update
forwarding_delete = forward_delete
# ---- helpers ------------------------------------------------------
def create_mailbox(
self,
client_id: int,
domain: str,
local_part: str,
password: str,
*,
server_id: int = 1,
quota_mb: int = 1024,
name: str | None = None,
) -> int:
"""Shorthand for ``user_add`` with typical defaults.
Returns the new ``mailuser_id``.
"""
email = f"{local_part}@{domain}"
params: dict[str, Any] = {
"server_id": int(server_id),
"email": email,
"login": email,
"password": password,
"name": name or local_part,
"quota": int(quota_mb) * 1024 * 1024, # ISPConfig stores bytes
"postfix": "y",
"access": "y",
"disableimap": "n",
"disablepop3": "n",
"disablesmtp": "n",
}
return self.user_add(client_id, params)