Skip to content

Commit 97d92e4

Browse files
Ihor BilousIhor Bilous
authored andcommitted
Fix issue #54: Add SendingDomainsApi, related models, tests, examples
1 parent 64f1941 commit 97d92e4

File tree

10 files changed

+561
-0
lines changed

10 files changed

+561
-0
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ The same situation applies to both `client.batch_send()` and `client.sending_api
241241
### Email Templates API:
242242
- Templates management – [`email_templates/templates.py`](examples/email_templates/templates.py)
243243

244+
### Sending Domains API:
245+
- Sending Domains – [`sending_domains/sending_domains.py`](examples/sending_domains/sending_domains.py)
246+
244247
### Suppressions API:
245248
- Suppressions (find & delete) – [`suppressions/suppressions.py`](examples/suppressions/suppressions.py)
246249

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import mailtrap as mt
2+
from mailtrap.models.common import DeletedObject
3+
from mailtrap.models.sending_domains import SendingDomain
4+
from mailtrap.models.sending_domains import SendSetupInstructionsResponse
5+
6+
API_TOKEN = "YOUR_API_TOKEN"
7+
ACCOUNT_ID = "YOUR_ACCOUNT_ID"
8+
9+
client = mt.MailtrapClient(token=API_TOKEN, account_id=ACCOUNT_ID)
10+
sending_domains_api = client.sending_domains_api.sending_domains
11+
12+
13+
def list_sending_domains() -> list[SendingDomain]:
14+
return sending_domains_api.get_list()
15+
16+
17+
def get_sending_domain(domain_id: int) -> SendingDomain:
18+
return sending_domains_api.get_by_id(domain_id)
19+
20+
21+
def create_sending_domain(domain_name: str) -> SendingDomain:
22+
params = mt.CreateSendingDomainParams(domain_name=domain_name)
23+
return sending_domains_api.create(params)
24+
25+
26+
def delete_sending_domain(domain_id: int) -> DeletedObject:
27+
return sending_domains_api.delete(domain_id)
28+
29+
30+
def send_setup_instructions(domain_id: int, email: str) -> SendSetupInstructionsResponse:
31+
params = mt.SendSetupInstructionsParams(email=email)
32+
return sending_domains_api.send_setup_instructions(domain_id, params)
33+
34+
35+
if __name__ == "__main__":
36+
new_domain = create_sending_domain("example.com")
37+
print(new_domain)
38+
39+
domains = list_sending_domains()
40+
print(domains)
41+
42+
domain = get_sending_domain(new_domain.id)
43+
print(domain)
44+
45+
response = send_setup_instructions(new_domain.id, "example@mail.com")
46+
print(response)
47+
48+
deleted_domain = delete_sending_domain(new_domain.id)
49+
print(deleted_domain)

mailtrap/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,7 @@
3030
from .models.messages import UpdateEmailMessageParams
3131
from .models.permissions import PermissionResourceParams
3232
from .models.projects import ProjectParams
33+
from .models.sending_domains import CreateSendingDomainParams
34+
from .models.sending_domains import SendSetupInstructionsParams
3335
from .models.templates import CreateEmailTemplateParams
3436
from .models.templates import UpdateEmailTemplateParams
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from typing import Optional
2+
3+
from mailtrap.http import HttpClient
4+
from mailtrap.models.common import DeletedObject
5+
from mailtrap.models.sending_domains import CreateSendingDomainParams
6+
from mailtrap.models.sending_domains import SendingDomain
7+
from mailtrap.models.sending_domains import SendSetupInstructionsParams
8+
from mailtrap.models.sending_domains import SendSetupInstructionsResponse
9+
10+
11+
class SendingDomainsApi:
12+
def __init__(self, client: HttpClient, account_id: str) -> None:
13+
self._account_id = account_id
14+
self._client = client
15+
16+
def get_list(self) -> list[SendingDomain]:
17+
"""
18+
Get sending domains and their statuses.
19+
"""
20+
response = self._client.get(self._api_path())
21+
domains = response.get("data", [])
22+
return [SendingDomain(**domain) for domain in domains]
23+
24+
def get_by_id(self, sending_domain_id: int) -> SendingDomain:
25+
"""
26+
Get domain data and its status.
27+
"""
28+
response = self._client.get(self._api_path(sending_domain_id))
29+
return SendingDomain(**response)
30+
31+
def create(self, domain_params: CreateSendingDomainParams) -> SendingDomain:
32+
"""
33+
Create a sending domain. To later check the status of the newly created domain,
34+
review the compliance_status and dns_verified fields in the response
35+
of the Get domain by ID or Get sending domains endpoints.
36+
"""
37+
response = self._client.post(
38+
self._api_path(), json={"sending_domain": domain_params.api_data}
39+
)
40+
return SendingDomain(**response)
41+
42+
def delete(self, sending_domain_id: int) -> DeletedObject:
43+
"""
44+
Delete a sending domain.
45+
"""
46+
self._client.delete(self._api_path(sending_domain_id))
47+
return DeletedObject(id=sending_domain_id)
48+
49+
def send_setup_instructions(
50+
self,
51+
sending_domain_id: int,
52+
instructions_params: SendSetupInstructionsParams,
53+
) -> SendSetupInstructionsResponse:
54+
"""
55+
Send sending domain setup instructions.
56+
"""
57+
self._client.post(
58+
f"{self._api_path(sending_domain_id)}/send_setup_instructions",
59+
json=instructions_params.api_data,
60+
)
61+
return SendSetupInstructionsResponse(
62+
message="Instructions email has been sent successfully"
63+
)
64+
65+
def _api_path(self, sending_domain_id: Optional[int] = None) -> str:
66+
path = f"/api/accounts/{self._account_id}/sending_domains"
67+
if sending_domain_id is not None:
68+
path = f"{path}/{sending_domain_id}"
69+
return path

mailtrap/api/sending_domains.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from mailtrap.api.resources.sending_domains import SendingDomainsApi
2+
from mailtrap.http import HttpClient
3+
4+
5+
class SendingDomainsBaseApi:
6+
def __init__(self, client: HttpClient, account_id: str) -> None:
7+
self._account_id = account_id
8+
self._client = client
9+
10+
@property
11+
def sending_domains(self) -> SendingDomainsApi:
12+
return SendingDomainsApi(account_id=self._account_id, client=self._client)

mailtrap/client.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from mailtrap.api.contacts import ContactsBaseApi
99
from mailtrap.api.general import GeneralApi
1010
from mailtrap.api.sending import SendingApi
11+
from mailtrap.api.sending_domains import SendingDomainsBaseApi
1112
from mailtrap.api.suppressions import SuppressionsBaseApi
1213
from mailtrap.api.templates import EmailTemplatesApi
1314
from mailtrap.api.testing import TestingApi
@@ -93,6 +94,14 @@ def suppressions_api(self) -> SuppressionsBaseApi:
9394
client=HttpClient(host=GENERAL_HOST, headers=self.headers),
9495
)
9596

97+
@property
98+
def sending_domains_api(self) -> SendingDomainsBaseApi:
99+
self._validate_account_id()
100+
return SendingDomainsBaseApi(
101+
account_id=cast(str, self.account_id),
102+
client=HttpClient(host=GENERAL_HOST, headers=self.headers),
103+
)
104+
96105
@property
97106
def sending_api(self) -> SendingApi:
98107
http_client = HttpClient(host=self._sending_api_host, headers=self.headers)

mailtrap/models/sending_domains.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from typing import Optional
2+
3+
from pydantic import Field
4+
from pydantic.dataclasses import dataclass
5+
6+
from mailtrap.models.common import RequestParams
7+
8+
9+
@dataclass
10+
class SendingDomainPermissions:
11+
can_read: bool
12+
can_update: bool
13+
can_destroy: bool
14+
15+
16+
@dataclass
17+
class DnsRecord:
18+
key: str
19+
domain: str
20+
type: str
21+
value: str
22+
status: str
23+
name: str
24+
25+
26+
@dataclass
27+
class SendingDomain:
28+
id: int
29+
domain_name: str
30+
demo: bool
31+
compliance_status: str
32+
dns_verified: bool
33+
open_tracking_enabled: bool
34+
click_tracking_enabled: bool
35+
auto_unsubscribe_link_enabled: bool
36+
custom_domain_tracking_enabled: bool
37+
health_alerts_enabled: bool
38+
critical_alerts_enabled: bool
39+
permissions: SendingDomainPermissions
40+
alert_recipient_email: Optional[str] = None
41+
dns_verified_at: Optional[str] = None
42+
dns_records: list[DnsRecord] = Field(default_factory=list)
43+
44+
45+
@dataclass
46+
class CreateSendingDomainParams(RequestParams):
47+
domain_name: str
48+
49+
50+
@dataclass
51+
class SendSetupInstructionsParams(RequestParams):
52+
email: str
53+
54+
55+
@dataclass
56+
class SendSetupInstructionsResponse:
57+
message: str

tests/unit/api/sending_domains/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)