sendora 2.0.0__tar.gz → 2.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sendora-2.0.0 → sendora-2.0.2}/CHANGELOG.md +13 -0
- {sendora-2.0.0 → sendora-2.0.2}/PKG-INFO +54 -54
- {sendora-2.0.0 → sendora-2.0.2}/README.md +53 -53
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_version.py +1 -1
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/types.py +10 -5
- {sendora-2.0.0 → sendora-2.0.2}/.gitignore +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/LICENSE +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/pyproject.toml +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/__init__.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_account.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_answers.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_client.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_errors.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_json.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_keys.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_model.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_options.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_pages.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_retry.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_transport.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_webhooks.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_wire.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/py.typed +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/__init__.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/broadcasts.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/domains.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/email.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/erasures.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/inbound.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/inbound_domains.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/messages.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/server.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/servers.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/streams.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/suppressions.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/tokens.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/webhooks.py +0 -0
- {sendora-2.0.0 → sendora-2.0.2}/src/sendora/skills/sendora/SKILL.md +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.2
|
|
4
|
+
|
|
5
|
+
- The README says what `payment_required` means in each of its four cases:
|
|
6
|
+
the first payment has not arrived, an invoice is unpaid, payment is
|
|
7
|
+
paused, or the subscription has ended. No call changes.
|
|
8
|
+
|
|
9
|
+
## 2.0.1
|
|
10
|
+
|
|
11
|
+
- The docstrings of `ServerLimit.period`, `InboundCap.limit` and a refused
|
|
12
|
+
batch item's `resets_at` say what an account's month is. An account that
|
|
13
|
+
pays by card counts a month from the day and time of its first payment,
|
|
14
|
+
and any other account the calendar month in UTC. No call changes.
|
|
15
|
+
|
|
3
16
|
## 2.0.0
|
|
4
17
|
|
|
5
18
|
- The error code `unpaid_limit_reached` is removed, since the API no
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sendora
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: The Python client for Sendora's email API.
|
|
5
5
|
Project-URL: Homepage, https://sendora.se/docs
|
|
6
6
|
License-Expression: MIT
|
|
@@ -494,59 +494,59 @@ except SendoraError as error:
|
|
|
494
494
|
print([(entry.address, entry.reason) for entry in error.suppressed])
|
|
495
495
|
```
|
|
496
496
|
|
|
497
|
-
| Code | Status | Meaning
|
|
498
|
-
| --------------------------------- | ------ |
|
|
499
|
-
| `invalid_request` | 400 | A field is wrong; `issues` says which.
|
|
500
|
-
| `idempotency_key_required` | 400 | A batch was sent without a key.
|
|
501
|
-
| `unauthorized` | 401 | The key is missing, malformed or revoked.
|
|
502
|
-
| `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind.
|
|
503
|
-
| `payment_required` | 402 | The
|
|
504
|
-
| `account_paused` | 403 | Sendora has paused the account.
|
|
505
|
-
| `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream.
|
|
506
|
-
| `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression.
|
|
507
|
-
| `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe.
|
|
508
|
-
| `not_found` | 404 | No such id on this server, or no such suppressed address.
|
|
509
|
-
| `domain_exists` | 409 | The account already has the domain; `existing_id` names it.
|
|
510
|
-
| `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it.
|
|
511
|
-
| `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified.
|
|
512
|
-
| `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it.
|
|
513
|
-
| `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it.
|
|
514
|
-
| `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it.
|
|
515
|
-
| `default_stream` | 409 | The default stream cannot be archived.
|
|
516
|
-
| `last_token` | 409 | The only live key cannot be revoked.
|
|
517
|
-
| `last_secret` | 409 | The only live secret of a webhook cannot be deleted.
|
|
518
|
-
| `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many.
|
|
519
|
-
| `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many.
|
|
520
|
-
| `server_exists` | 409 | The account already has a server with that name.
|
|
521
|
-
| `server_limit` | 409 | The account has as many servers as it may; `max` says how many.
|
|
522
|
-
| `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed.
|
|
523
|
-
| `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later.
|
|
524
|
-
| `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast.
|
|
525
|
-
| `from_domain_not_verified` | 422 | The From domain is not a verified sending domain.
|
|
526
|
-
| `stream_not_found` | 422 | `stream_id` names no stream of this server.
|
|
527
|
-
| `stream_archived` | 422 | The stream is archived and takes no new messages.
|
|
528
|
-
| `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it.
|
|
529
|
-
| `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list.
|
|
530
|
-
| `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional.
|
|
531
|
-
| `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which.
|
|
532
|
-
| `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel.
|
|
533
|
-
| `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part.
|
|
534
|
-
| `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out.
|
|
535
|
-
| `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them.
|
|
536
|
-
| `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them.
|
|
537
|
-
| `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server.
|
|
538
|
-
| `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode.
|
|
539
|
-
| `idempotency_key_mismatch` | 422 | The key was used before with a different body.
|
|
540
|
-
| `content_expired` | 410 | The received message's content window has passed; the message itself stays.
|
|
541
|
-
| `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told.
|
|
542
|
-
| `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once.
|
|
543
|
-
| `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`.
|
|
544
|
-
| `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`.
|
|
545
|
-
| `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why.
|
|
546
|
-
| `timeout` | none | A step of the request took longer than `timeout`.
|
|
547
|
-
| `unexpected_response` | any | An answer without a JSON error body, such as from a proxy.
|
|
548
|
-
| `invalid_signature` | none | A webhook's signature is missing, malformed or wrong.
|
|
549
|
-
| `stale_signature` | none | A webhook's signature is older than the tolerance.
|
|
497
|
+
| Code | Status | Meaning |
|
|
498
|
+
| --------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------- |
|
|
499
|
+
| `invalid_request` | 400 | A field is wrong; `issues` says which. |
|
|
500
|
+
| `idempotency_key_required` | 400 | A batch was sent without a key. |
|
|
501
|
+
| `unauthorized` | 401 | The key is missing, malformed or revoked. |
|
|
502
|
+
| `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind. |
|
|
503
|
+
| `payment_required` | 402 | The first payment has not arrived, an invoice is unpaid, payment is paused, or the subscription has ended. |
|
|
504
|
+
| `account_paused` | 403 | Sendora has paused the account. |
|
|
505
|
+
| `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream. |
|
|
506
|
+
| `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression. |
|
|
507
|
+
| `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe. |
|
|
508
|
+
| `not_found` | 404 | No such id on this server, or no such suppressed address. |
|
|
509
|
+
| `domain_exists` | 409 | The account already has the domain; `existing_id` names it. |
|
|
510
|
+
| `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it. |
|
|
511
|
+
| `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified. |
|
|
512
|
+
| `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it. |
|
|
513
|
+
| `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it. |
|
|
514
|
+
| `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it. |
|
|
515
|
+
| `default_stream` | 409 | The default stream cannot be archived. |
|
|
516
|
+
| `last_token` | 409 | The only live key cannot be revoked. |
|
|
517
|
+
| `last_secret` | 409 | The only live secret of a webhook cannot be deleted. |
|
|
518
|
+
| `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many. |
|
|
519
|
+
| `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many. |
|
|
520
|
+
| `server_exists` | 409 | The account already has a server with that name. |
|
|
521
|
+
| `server_limit` | 409 | The account has as many servers as it may; `max` says how many. |
|
|
522
|
+
| `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed. |
|
|
523
|
+
| `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later. |
|
|
524
|
+
| `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast. |
|
|
525
|
+
| `from_domain_not_verified` | 422 | The From domain is not a verified sending domain. |
|
|
526
|
+
| `stream_not_found` | 422 | `stream_id` names no stream of this server. |
|
|
527
|
+
| `stream_archived` | 422 | The stream is archived and takes no new messages. |
|
|
528
|
+
| `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it. |
|
|
529
|
+
| `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list. |
|
|
530
|
+
| `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional. |
|
|
531
|
+
| `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which. |
|
|
532
|
+
| `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel. |
|
|
533
|
+
| `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part. |
|
|
534
|
+
| `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out. |
|
|
535
|
+
| `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them. |
|
|
536
|
+
| `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them. |
|
|
537
|
+
| `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server. |
|
|
538
|
+
| `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode. |
|
|
539
|
+
| `idempotency_key_mismatch` | 422 | The key was used before with a different body. |
|
|
540
|
+
| `content_expired` | 410 | The received message's content window has passed; the message itself stays. |
|
|
541
|
+
| `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told. |
|
|
542
|
+
| `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once. |
|
|
543
|
+
| `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`. |
|
|
544
|
+
| `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`. |
|
|
545
|
+
| `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why. |
|
|
546
|
+
| `timeout` | none | A step of the request took longer than `timeout`. |
|
|
547
|
+
| `unexpected_response` | any | An answer without a JSON error body, such as from a proxy. |
|
|
548
|
+
| `invalid_signature` | none | A webhook's signature is missing, malformed or wrong. |
|
|
549
|
+
| `stale_signature` | none | A webhook's signature is older than the tolerance. |
|
|
550
550
|
|
|
551
551
|
`error.retryable` is true when waiting and calling again could succeed.
|
|
552
552
|
Neither the key nor a request's subject, text, HTML or attachments is ever
|
|
@@ -472,59 +472,59 @@ except SendoraError as error:
|
|
|
472
472
|
print([(entry.address, entry.reason) for entry in error.suppressed])
|
|
473
473
|
```
|
|
474
474
|
|
|
475
|
-
| Code | Status | Meaning
|
|
476
|
-
| --------------------------------- | ------ |
|
|
477
|
-
| `invalid_request` | 400 | A field is wrong; `issues` says which.
|
|
478
|
-
| `idempotency_key_required` | 400 | A batch was sent without a key.
|
|
479
|
-
| `unauthorized` | 401 | The key is missing, malformed or revoked.
|
|
480
|
-
| `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind.
|
|
481
|
-
| `payment_required` | 402 | The
|
|
482
|
-
| `account_paused` | 403 | Sendora has paused the account.
|
|
483
|
-
| `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream.
|
|
484
|
-
| `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression.
|
|
485
|
-
| `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe.
|
|
486
|
-
| `not_found` | 404 | No such id on this server, or no such suppressed address.
|
|
487
|
-
| `domain_exists` | 409 | The account already has the domain; `existing_id` names it.
|
|
488
|
-
| `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it.
|
|
489
|
-
| `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified.
|
|
490
|
-
| `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it.
|
|
491
|
-
| `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it.
|
|
492
|
-
| `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it.
|
|
493
|
-
| `default_stream` | 409 | The default stream cannot be archived.
|
|
494
|
-
| `last_token` | 409 | The only live key cannot be revoked.
|
|
495
|
-
| `last_secret` | 409 | The only live secret of a webhook cannot be deleted.
|
|
496
|
-
| `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many.
|
|
497
|
-
| `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many.
|
|
498
|
-
| `server_exists` | 409 | The account already has a server with that name.
|
|
499
|
-
| `server_limit` | 409 | The account has as many servers as it may; `max` says how many.
|
|
500
|
-
| `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed.
|
|
501
|
-
| `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later.
|
|
502
|
-
| `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast.
|
|
503
|
-
| `from_domain_not_verified` | 422 | The From domain is not a verified sending domain.
|
|
504
|
-
| `stream_not_found` | 422 | `stream_id` names no stream of this server.
|
|
505
|
-
| `stream_archived` | 422 | The stream is archived and takes no new messages.
|
|
506
|
-
| `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it.
|
|
507
|
-
| `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list.
|
|
508
|
-
| `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional.
|
|
509
|
-
| `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which.
|
|
510
|
-
| `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel.
|
|
511
|
-
| `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part.
|
|
512
|
-
| `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out.
|
|
513
|
-
| `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them.
|
|
514
|
-
| `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them.
|
|
515
|
-
| `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server.
|
|
516
|
-
| `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode.
|
|
517
|
-
| `idempotency_key_mismatch` | 422 | The key was used before with a different body.
|
|
518
|
-
| `content_expired` | 410 | The received message's content window has passed; the message itself stays.
|
|
519
|
-
| `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told.
|
|
520
|
-
| `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once.
|
|
521
|
-
| `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`.
|
|
522
|
-
| `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`.
|
|
523
|
-
| `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why.
|
|
524
|
-
| `timeout` | none | A step of the request took longer than `timeout`.
|
|
525
|
-
| `unexpected_response` | any | An answer without a JSON error body, such as from a proxy.
|
|
526
|
-
| `invalid_signature` | none | A webhook's signature is missing, malformed or wrong.
|
|
527
|
-
| `stale_signature` | none | A webhook's signature is older than the tolerance.
|
|
475
|
+
| Code | Status | Meaning |
|
|
476
|
+
| --------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------- |
|
|
477
|
+
| `invalid_request` | 400 | A field is wrong; `issues` says which. |
|
|
478
|
+
| `idempotency_key_required` | 400 | A batch was sent without a key. |
|
|
479
|
+
| `unauthorized` | 401 | The key is missing, malformed or revoked. |
|
|
480
|
+
| `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind. |
|
|
481
|
+
| `payment_required` | 402 | The first payment has not arrived, an invoice is unpaid, payment is paused, or the subscription has ended. |
|
|
482
|
+
| `account_paused` | 403 | Sendora has paused the account. |
|
|
483
|
+
| `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream. |
|
|
484
|
+
| `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression. |
|
|
485
|
+
| `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe. |
|
|
486
|
+
| `not_found` | 404 | No such id on this server, or no such suppressed address. |
|
|
487
|
+
| `domain_exists` | 409 | The account already has the domain; `existing_id` names it. |
|
|
488
|
+
| `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it. |
|
|
489
|
+
| `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified. |
|
|
490
|
+
| `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it. |
|
|
491
|
+
| `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it. |
|
|
492
|
+
| `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it. |
|
|
493
|
+
| `default_stream` | 409 | The default stream cannot be archived. |
|
|
494
|
+
| `last_token` | 409 | The only live key cannot be revoked. |
|
|
495
|
+
| `last_secret` | 409 | The only live secret of a webhook cannot be deleted. |
|
|
496
|
+
| `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many. |
|
|
497
|
+
| `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many. |
|
|
498
|
+
| `server_exists` | 409 | The account already has a server with that name. |
|
|
499
|
+
| `server_limit` | 409 | The account has as many servers as it may; `max` says how many. |
|
|
500
|
+
| `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed. |
|
|
501
|
+
| `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later. |
|
|
502
|
+
| `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast. |
|
|
503
|
+
| `from_domain_not_verified` | 422 | The From domain is not a verified sending domain. |
|
|
504
|
+
| `stream_not_found` | 422 | `stream_id` names no stream of this server. |
|
|
505
|
+
| `stream_archived` | 422 | The stream is archived and takes no new messages. |
|
|
506
|
+
| `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it. |
|
|
507
|
+
| `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list. |
|
|
508
|
+
| `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional. |
|
|
509
|
+
| `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which. |
|
|
510
|
+
| `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel. |
|
|
511
|
+
| `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part. |
|
|
512
|
+
| `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out. |
|
|
513
|
+
| `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them. |
|
|
514
|
+
| `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them. |
|
|
515
|
+
| `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server. |
|
|
516
|
+
| `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode. |
|
|
517
|
+
| `idempotency_key_mismatch` | 422 | The key was used before with a different body. |
|
|
518
|
+
| `content_expired` | 410 | The received message's content window has passed; the message itself stays. |
|
|
519
|
+
| `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told. |
|
|
520
|
+
| `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once. |
|
|
521
|
+
| `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`. |
|
|
522
|
+
| `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`. |
|
|
523
|
+
| `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why. |
|
|
524
|
+
| `timeout` | none | A step of the request took longer than `timeout`. |
|
|
525
|
+
| `unexpected_response` | any | An answer without a JSON error body, such as from a proxy. |
|
|
526
|
+
| `invalid_signature` | none | A webhook's signature is missing, malformed or wrong. |
|
|
527
|
+
| `stale_signature` | none | A webhook's signature is older than the tolerance. |
|
|
528
528
|
|
|
529
529
|
`error.retryable` is true when waiting and calling again could succeed.
|
|
530
530
|
Neither the key nor a request's subject, text, HTML or attachments is ever
|
|
@@ -397,7 +397,8 @@ class RefusedBatchItem(Answer):
|
|
|
397
397
|
retry_after: On ``rate_limited``, the seconds to wait.
|
|
398
398
|
cap: On ``monthly_cap_reached``, the messages allowed a month.
|
|
399
399
|
used: On ``monthly_cap_reached``, the messages sent this month.
|
|
400
|
-
resets_at: On ``monthly_cap_reached``, when the month
|
|
400
|
+
resets_at: On ``monthly_cap_reached``, when the month ends and the
|
|
401
|
+
count starts again.
|
|
401
402
|
"""
|
|
402
403
|
|
|
403
404
|
index: int
|
|
@@ -917,7 +918,9 @@ class ServerLimit(Answer):
|
|
|
917
918
|
Attributes:
|
|
918
919
|
scope: Whose limit it is: the account's, the server's own, or the
|
|
919
920
|
test cap the account's test servers share.
|
|
920
|
-
period: The UTC minute or the
|
|
921
|
+
period: The UTC minute, or the month it counts over: from the day
|
|
922
|
+
and time of the first payment for a paying account's live
|
|
923
|
+
server, otherwise the calendar month in UTC.
|
|
921
924
|
limit: The emails allowed in the period, one per recipient.
|
|
922
925
|
used: The emails the period has taken so far.
|
|
923
926
|
resets_at: When the period ends and the count starts again.
|
|
@@ -950,9 +953,11 @@ class InboundCap(Answer):
|
|
|
950
953
|
"""The account's monthly cap on received mail, apart from the limits on sending.
|
|
951
954
|
|
|
952
955
|
Attributes:
|
|
953
|
-
limit: The emails the account may receive in
|
|
954
|
-
|
|
955
|
-
|
|
956
|
+
limit: The emails the account may receive in its month, over every
|
|
957
|
+
inbound stream. A paying account's month runs from the day and
|
|
958
|
+
time of its first payment, and any other account's is the
|
|
959
|
+
calendar month in UTC. It is the account's monthly cap on
|
|
960
|
+
sending until an administrator moves it in the dashboard.
|
|
956
961
|
used: The emails received this month so far, one per recipient.
|
|
957
962
|
resets_at: When the month ends and the count starts again.
|
|
958
963
|
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|