Skip to content

Commit 9237327

Browse files
Merge pull request #7122 from heathdutton/bugfix/5595-add-plain-text-to-emails
Add plain text alternative to email messages
2 parents cd1c0f8 + ed1af76 commit 9237327

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

backend/services/messaging/smtp_service.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import re
12
import urllib.parse
3+
from html import unescape
24

35
from databases import Database
46
from fastapi_mail import MessageSchema, MessageType
7+
from fastapi_mail.schemas import MultipartSubtypeEnum
58
from itsdangerous import URLSafeTimedSerializer
69
from loguru import logger
710

@@ -16,6 +19,22 @@
1619
)
1720

1821

22+
def html_to_text(html_content: str) -> str:
23+
"""Convert HTML to plain text for email alternative body."""
24+
if not html_content:
25+
return ""
26+
text = re.sub(
27+
r"<(style|script)[^>]*>.*?</\1>", "", html_content, flags=re.DOTALL | re.I
28+
)
29+
text = re.sub(r"<br\s*/?>|</p>|</div>|</tr>|</h[1-6]>", "\n", text, flags=re.I)
30+
text = re.sub(r"<[^>]+>", "", text)
31+
text = unescape(text)
32+
text = re.sub(r"[ \t]+", " ", text)
33+
text = re.sub(r"\n ", "\n", text)
34+
text = re.sub(r"\n{3,}", "\n\n", text)
35+
return text.strip()
36+
37+
1938
class SMTPService:
2039
@staticmethod
2140
async def send_verification_email(to_address: str, username: str):
@@ -183,11 +202,15 @@ async def _send_message(
183202
from_address = settings.MAIL_DEFAULT_SENDER
184203
if from_address is None:
185204
raise ValueError("Missing TM_EMAIL_FROM_ADDRESS environment variable")
205+
if text_message is None:
206+
text_message = html_to_text(html_message)
186207
msg = MessageSchema(
187208
recipients=[to_address],
188209
subject=subject,
189-
body=html_message,
190-
subtype=MessageType.html,
210+
body=text_message,
211+
alternative_body=html_message,
212+
subtype=MessageType.plain,
213+
multipart_subtype=MultipartSubtypeEnum.alternative,
191214
)
192215
logger.debug(f"Sending email via SMTP {to_address}")
193216
if settings.LOG_LEVEL == "DEBUG":

0 commit comments

Comments
 (0)