Resend: new ESP (#341)

Add support for Resend.com backend and webhooks.

Closes #341
This commit is contained in:
Mike Edmunds
2023-10-25 12:23:57 -07:00
committed by GitHub
parent 823a161927
commit b5ef492466
13 changed files with 1932 additions and 24 deletions

View File

@@ -20,6 +20,7 @@ and notes about any quirks or limitations:
mandrill
postal
postmark
resend
sendgrid
sparkpost
@@ -28,38 +29,39 @@ Anymail feature support
-----------------------
The table below summarizes the Anymail features supported for each ESP.
(Scroll it to the left and right to see all ESPs.)
.. currentmodule:: anymail.message
.. rst-class:: sticky-left
============================================ ============ ======= ============ =========== ========== =========== ========== ========== ========== ===========
Email Service Provider |Amazon SES| |Brevo| |MailerSend| |Mailgun| |Mailjet| |Mandrill| |Postal| |Postmark| |SendGrid| |SparkPost|
============================================ ============ ======= ============ =========== ========== =========== ========== ========== ========== ===========
============================================ ============ ======= ============ =========== ========== =========== ========== ========== ======== ========== ===========
Email Service Provider |Amazon SES| |Brevo| |MailerSend| |Mailgun| |Mailjet| |Mandrill| |Postal| |Postmark| |Resend| |SendGrid| |SparkPost|
============================================ ============ ======= ============ =========== ========== =========== ========== ========== ======== ========== ===========
.. rubric:: :ref:`Anymail send options <anymail-send-options>`
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:attr:`~AnymailMessage.envelope_sender` Yes No No Domain only Yes Domain only Yes No No Yes
:attr:`~AnymailMessage.metadata` Yes Yes No Yes Yes Yes No Yes Yes Yes
:attr:`~AnymailMessage.merge_metadata` No No No Yes Yes Yes No Yes Yes Yes
:attr:`~AnymailMessage.send_at` No Yes Yes Yes No Yes No No Yes Yes
:attr:`~AnymailMessage.tags` Yes Yes Yes Yes Max 1 tag Yes Max 1 tag Max 1 tag Yes Max 1 tag
:attr:`~AnymailMessage.track_clicks` No No Yes Yes Yes Yes No Yes Yes Yes
:attr:`~AnymailMessage.track_opens` No No Yes Yes Yes Yes No Yes Yes Yes
:ref:`amp-email` Yes No No Yes No No No No Yes Yes
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:attr:`~AnymailMessage.envelope_sender` Yes No No Domain only Yes Domain only Yes No No No Yes
:attr:`~AnymailMessage.metadata` Yes Yes No Yes Yes Yes No Yes Yes Yes Yes
:attr:`~AnymailMessage.merge_metadata` No No No Yes Yes Yes No Yes No Yes Yes
:attr:`~AnymailMessage.send_at` No Yes Yes Yes No Yes No No No Yes Yes
:attr:`~AnymailMessage.tags` Yes Yes Yes Yes Max 1 tag Yes Max 1 tag Max 1 tag Yes Yes Max 1 tag
:attr:`~AnymailMessage.track_clicks` No No Yes Yes Yes Yes No Yes No Yes Yes
:attr:`~AnymailMessage.track_opens` No No Yes Yes Yes Yes No Yes No Yes Yes
:ref:`amp-email` Yes No No Yes No No No No No Yes Yes
.. rubric:: :ref:`templates-and-merge`
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:attr:`~AnymailMessage.template_id` Yes Yes Yes Yes Yes Yes No Yes Yes Yes
:attr:`~AnymailMessage.merge_data` Yes No Yes Yes Yes Yes No Yes Yes Yes
:attr:`~AnymailMessage.merge_global_data` Yes Yes (emulated) (emulated) Yes Yes No Yes Yes Yes
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:attr:`~AnymailMessage.template_id` Yes Yes Yes Yes Yes Yes No Yes No Yes Yes
:attr:`~AnymailMessage.merge_data` Yes No Yes Yes Yes Yes No Yes No Yes Yes
:attr:`~AnymailMessage.merge_global_data` Yes Yes (emulated) (emulated) Yes Yes No Yes No Yes Yes
.. rubric:: :ref:`Status <esp-send-status>` and :ref:`event tracking <event-tracking>`
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:attr:`~AnymailMessage.anymail_status` Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
|AnymailTrackingEvent| from webhooks Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:attr:`~AnymailMessage.anymail_status` Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
|AnymailTrackingEvent| from webhooks Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
.. rubric:: :ref:`Inbound handling <inbound>`
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|AnymailInboundEvent| from webhooks Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
============================================ ============ ======= ============ =========== ========== =========== ========== ========== ========== ===========
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|AnymailInboundEvent| from webhooks Yes Yes Yes Yes Yes Yes Yes Yes No Yes Yes
============================================ ============ ======= ============ =========== ========== =========== ========== ========== ======== ========== ===========
Trying to choose an ESP? Please **don't** start with this table. It's far more
@@ -75,6 +77,7 @@ meaningless. (And even specific features don't matter if you don't plan to use t
.. |Mandrill| replace:: :ref:`mandrill-backend`
.. |Postal| replace:: :ref:`postal-backend`
.. |Postmark| replace:: :ref:`postmark-backend`
.. |Resend| replace:: :ref:`resend-backend`
.. |SendGrid| replace:: :ref:`sendgrid-backend`
.. |SparkPost| replace:: :ref:`sparkpost-backend`
.. |AnymailTrackingEvent| replace:: :class:`~anymail.signals.AnymailTrackingEvent`