Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Dec 18, 2025

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
django-anymail (changelog) >=13.0.0,<14>=14,<15 age adoption passing confidence

Release Notes

anymail/django-anymail (django-anymail)

v14.0

Compare Source

2025-12-17

This release improves handling of Unicode characters everywhere email messages
allow them, based on extensive testing on all supported ESPs. See
International email <https://anymail.dev/en/stable/tips/international_email/#idna>_
in the docs for more information. There are several new workarounds for ESP
bugs with non-ASCII characters, plus a handful of new errors to help you avoid
Unicode bugs Anymail can't work around.

This release also includes support for Django 6.0 (earlier versions worked,
but provoked deprecation warnings) and adds the much-requested ESP Mailtrap.

Breaking changes


(These changes don't affect the vast majority of Anymail users.)

* **International domain names:** When sending email to a non-ASCII domain name,
  use IDNA 2008 with UTS-46 pre-processing rather than obsolete IDNA 2003
  encoding. This ensures email can be sent to newer domains enabled by IDNA 2008.

  This change should make no difference for virtually all real-world email
  addresses that worked with earlier Anymail releases. But trying to send to
  emoji domains or others no longer allowed by IDNA 2008 will now raise an
  ``AnymailInvalidAddress`` error.

  To restore the old behavior or select a different encoding, use the new
  ``IDNA_ENCODER`` setting. See
  `Domains (IDNA) <https://anymail.dev/en/stable/tips/international_email/#idna>`_
  in the docs.

  As part of this change, Anymail now has a direct dependency on the ``idna``
  package. (It was already being installed as a sub-dependency of ``requests``.)

* **Brevo:** Raise an error if metadata or custom header values include Unicode
  characters. This avoids a Brevo API bug that sends unencoded 8-bit headers,
  which can cause bounces or dropped messages.

* **Mailgun:** Raise an error if the ``from_email`` uses EAI (has a Unicode
  local part). This avoids a Mailgun API bug that generates undeliverable
  messages.

* **Resend:** Raise an error if an attachment's filename has an extension that
  doesn't match its content type. This tries to help you avoid a Resend API bug
  that can silently drop sent messages.

* **Scaleway TEM:** Raise an error if any address field uses EAI (has a Unicode
  local part). This avoids a Scaleway API bug that generates undeliverable messages.

Features
~~~~~~~~

* Support Django 6.0.

* Allow Python's modern MIMEPart object as attachments (new in Django 6.0).
  Use MIMEPart for Anymail's ``attach_inline_image`` helpers under Django 6.0
  and later.

* **Mailtrap:** Add support for this ESP.
  (See `docs <https://anymail.dev/en/stable/esps/mailtrap/>`__.
  Thanks to `@cahna`_ for the contribution.)

* **Resend:** Add support for inline images. Identify attachment content type
  using new API parameter, including accurately specifying charset for
  non-ASCII text attachments. (See related Resend breaking change above.)

Fixes
~~~~~

* Handle sending attached messages (e.g., forwarded emails) consistently with
  Django's SMTP EmailBackend.

* Exempt webhooks from Django's LoginRequiredMiddleware.
  (Thanks to `@Zerotask`_ for reporting the issue.)

* **Brevo, Mailgun, Mandrill, Postal, Postmark, Scaleway TEM, Unisender Go:**
  Fix Anymail bugs that could cause text attachments with Unicode content
  to display incorrectly in some email clients.

* **Brevo:** Work around a Brevo API bug which loses Unicode display names
  that also contain a comma or certain other punctuation.

* **Mailgun:** Use ``"attachment"`` as the default attachment filename (rather
  than raising an error) for consistency with Anymail's handling of missing
  attachment filenames in other ESPs.

* **Postmark:** Prevent a KeyError in the tracking webhook when handling
  an unsubscribe request due to a bounce. (Thanks to `@dshunfen`_ for reporting
  the issue.)

Other
~~~~~

* **Brevo:** Document a Brevo API bug that causes Unicode attachment
  filenames to display incorrectly in some email clients.

* **Mandrill:** Document a Mandrill API bug that can cause an address with a
  Unicode display name to display incorrectly in some email clients.

* **SendGrid:** Document a SendGrid API bug that causes Unicode attachment
  filenames to display incorrectly in some email clients. Clarify handling and
  documentation of SendGrid API bugs around text attachment content encoding.

* **Unisender Go:** Document a Unisender Go API bug that can cause an Reply-To
  address (only) with a Unicode display name to display incorrectly in some
  email clients.

Deprecations
~~~~~~~~~~~~

* This will be the last Anymail release to support Django 4.0 and 4.1,
  which reached end of extended support on 2023-04-01 and 2023-12-01,
  respectively. (Anymail will continue to support Django 4.2 at least
  through its end of extended support in April, 2026.)

* This will be the last Anymail release to support Python 3.8 and 3.9,
  which reached end of life on 2024-10-07 and 2025-10-31, respectively.

v13.1
-----

*2025-09-03*

Features
~~~~~~~~

* **Scaleway:** Add support for this ESP.
  (See `docs <https://anymail.dev/en/stable/esps/scaleway/>`__.
  Thanks to `@hleroy`_ for the contribution.)

* **SendGrid:** Add optional signature verification for tracking webhooks.
  To support this, Anymail now includes the :pypi:`cryptography` package when
  installed with the ``django-anymail[sendgrid]`` extra.
  (Thanks to `@blag`_ for contributing this improvement. Note this was tested
  against SendGrid's live API by its contributor at the time it was added,
  but cannot be independently verified by Anymail's maintainers as we
  `no longer have access <https://github.com/anymail/django-anymail/issues/432>`__
  to a SendGrid test account.)

v13.0.1
-------

*2025-07-25*

Breaking changes (external)
  • SendGrid: Anymail no longer officially supports SendGrid, because we are
    unable to test it. Although it will probably keep working, you'll get
    warnings about this change in status. See
    Dropping support for SendGrid <https://github.com/anymail/django-anymail/issues/432>__
    for details and actions SendGrid customers can take. (Since this breaking
    change is due to external causes and impacts SendGrid users on all versions
    of Anymail, it is being handled as a minor patch release rather than a semver
    major version change.)

Fixes


* **Amazon SES:** Require boto3 1.24.6 or later to ensure support for the SESv2
  close method. (Thanks to `@mgibeau`_ for identifying the issue.)

v13.0
-----

*2025-04-03*

Breaking changes
  • Postal: Require Python 3.9 or later for Postal tracking webhook support.
    (Postal's signature verification uses the "cryptography" package, which is no
    longer reliably installable with Python 3.8.)

Fixes


* **Mailjet:** Avoid a Mailjet API error when sending an inline image without a
  filename. (Anymail now substitutes ``"attachment"`` for the missing filename.)
  (Thanks to `@chickahoona`_ for reporting the issue.)

* **Mailjet:** Fix a JSON parsing error on Mailjet 429 "too many requests" API
  responses. (Thanks to `@rodrigondec`_ for reporting the issue.)

* **Postmark:** Fix a parsing error when Postmark indicates a sent message has
  been delayed, which can occur if your message stream is paused or throttled or
  when Postmark is experiencing service issues. These messages will now report
  "queued" in the ``anymail_status`` (rather than throwing an error or reporting
  "sent"). (Thanks to `@jmduke`_ for reporting the issue.)

* **Postmark:** Fix an error in inbound handling with long email address display
  names that include non-ASCII characters.

* **SendGrid:** Improve handling of non-string values in ``merge_data`` when using
  legacy templates or inline merge fields. To avoid a confusing SendGrid API error
  message, Anymail now converts numeric merge data values to strings, but will raise
  an AnymailSerializationError for other non-string data in SendGrid substitutions.
  (SendGrid's newer *dynamic* transactional templates do not have this limitation.)
  (Thanks to `@PlusAsh`_ for reporting the issue.)

Other
  • Officially support Django 5.2.

  • Resend: Remove Anymail's workaround for an earlier Resend API bug with
    punctuation in address display names. Resend has fixed the bug.

  • SendGrid: Remove Anymail's workaround for an earlier SendGrid API bug with
    punctuation in address display names. SendGrid has fixed the bug.

v13.1

Compare Source

2025-09-03

Features


* **Scaleway:** Add support for this ESP.
  (See `docs <https://anymail.dev/en/stable/esps/scaleway/>`__.
  Thanks to `@hleroy`_ for the contribution.)

* **SendGrid:** Add optional signature verification for tracking webhooks.
  To support this, Anymail now includes the :pypi:`cryptography` package when
  installed with the ``django-anymail[sendgrid]`` extra.
  (Thanks to `@blag`_ for contributing this improvement. Note this was tested
  against SendGrid's live API by its contributor at the time it was added,
  but cannot be independently verified by Anymail's maintainers as we
  `no longer have access <https://github.com/anymail/django-anymail/issues/432>`__
  to a SendGrid test account.)

v13.0.1
-------

*2025-07-25*

Breaking changes (external)
  • SendGrid: Anymail no longer officially supports SendGrid, because we are
    unable to test it. Although it will probably keep working, you'll get
    warnings about this change in status. See
    Dropping support for SendGrid <https://github.com/anymail/django-anymail/issues/432>__
    for details and actions SendGrid customers can take. (Since this breaking
    change is due to external causes and impacts SendGrid users on all versions
    of Anymail, it is being handled as a minor patch release rather than a semver
    major version change.)

Fixes


* **Amazon SES:** Require boto3 1.24.6 or later to ensure support for the SESv2
  close method. (Thanks to `@mgibeau`_ for identifying the issue.)

v13.0
-----

*2025-04-03*

Breaking changes
  • Postal: Require Python 3.9 or later for Postal tracking webhook support.
    (Postal's signature verification uses the "cryptography" package, which is no
    longer reliably installable with Python 3.8.)

Fixes


* **Mailjet:** Avoid a Mailjet API error when sending an inline image without a
  filename. (Anymail now substitutes ``"attachment"`` for the missing filename.)
  (Thanks to `@chickahoona`_ for reporting the issue.)

* **Mailjet:** Fix a JSON parsing error on Mailjet 429 "too many requests" API
  responses. (Thanks to `@rodrigondec`_ for reporting the issue.)

* **Postmark:** Fix a parsing error when Postmark indicates a sent message has
  been delayed, which can occur if your message stream is paused or throttled or
  when Postmark is experiencing service issues. These messages will now report
  "queued" in the ``anymail_status`` (rather than throwing an error or reporting
  "sent"). (Thanks to `@jmduke`_ for reporting the issue.)

* **Postmark:** Fix an error in inbound handling with long email address display
  names that include non-ASCII characters.

* **SendGrid:** Improve handling of non-string values in ``merge_data`` when using
  legacy templates or inline merge fields. To avoid a confusing SendGrid API error
  message, Anymail now converts numeric merge data values to strings, but will raise
  an AnymailSerializationError for other non-string data in SendGrid substitutions.
  (SendGrid's newer *dynamic* transactional templates do not have this limitation.)
  (Thanks to `@PlusAsh`_ for reporting the issue.)

Other
  • Officially support Django 5.2.

  • Resend: Remove Anymail's workaround for an earlier Resend API bug with
    punctuation in address display names. Resend has fixed the bug.

  • SendGrid: Remove Anymail's workaround for an earlier SendGrid API bug with
    punctuation in address display names. SendGrid has fixed the bug.


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant