Repository navigation
Conversation
CodeDok
pushed a commit
to CodeDok/mailrise
that referenced
this pull request
Oct 5, 2026
Upgrade to Apprise v2.0.1+ and require Python 3.10+. Security: - Reply 535 to failed SMTP logins instead of leaving the client hanging (YoRyan#101) - Compare passwords in constant time and hide whether a username exists - Lock out IP addresses after repeated failed logins - Warn when SMTP auth is enabled without TLS; add smtp.auth.require_tls - Don't leak router exception details to SMTP clients - Add smtp.data_size_limit and smtp.max_recipients - Sanitize attachment filenames and keep attachment files in a private temporary directory; escape control characters in logged email fields - Load the configuration with YAML's safe loader - Docker: apply Debian security updates, drop pip, root-owned code (YoRyan#170) Fixes and features: - Fix crash on multipart/related HTML emails (YoRyan#135, YoRyan#171) - Refuse unparseable messages instead of crashing - Report non-Apprise notification exceptions as failures - Add sender-based routing (YoRyan#145, YoRyan#157) and dotted usernames in config keys (YoRyan#164) - Add PUID/PGID/TZ Docker build arguments (YoRyan#149) - Fix bdist_wheel build error with recent setuptools (YoRyan#160) CI: test on Python 3.10-3.14, scan the image with Trivy, rebuild weekly, and publish images only to ghcr.io/codedok/mailrise. BREAKING CHANGE: requires Python 3.10+ and Apprise 2; the Docker image runs as UID/GID 1000 and is no longer published to Docker Hub. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes
KeyError: 'multipart/related'when parsing incoming emails that contain rich HTML with inline images or nested multipart structures (such as notifications sent by Vaultwarden, Apple Mail, Outlook, and NVR software).Resolves #135
Relates to #9, #136
Problem
In Python's
email.message.EmailMessage.get_body(), the default preference list is:When an incoming email contains an HTML body with inline images or attachments, the MIME structure wraps it in a
multipart/relatedcontainer. Because'related'is the first preference,msg.get_body()returns the multipart container envelope itself rather than the leaf body part.Attempting to read content from this container raises
KeyError: 'multipart/related'because standard library content managers only extract content from leaf MIME parts. Furthermore, whenmultipart/relatedis nested insidemultipart/alternative, the default preference causesget_body()to bypass alternatives (issue #135).Solution
Pass
preferencelist=('html', 'plain')tomsg.get_body()insrc/mailrise/smtp.py:multipart/relatedcontainers and return the actual leaf text payload (text/htmlortext/plain).tests/test_smtp.py._getmultiparttexthelper as an additional fallback for non-standard MIME hierarchies.Testing
test_multipart_nested_related()totests/test_smtp.pycovering an email with nestedmultipart/alternativecontainingtext/plainand amultipart/relatedHTML part with inline image attachments.tests/test_smtp.pypass.