fix: Outlook email UTF-8 charset for umlauts - add meta charset to HTML body
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
a7b5192e25
commit
33dd694ba1
2 changed files with 20 additions and 6 deletions
|
|
@ -62,7 +62,7 @@ async def _makeGraphCall(
|
||||||
) -> Dict[str, Any]:
|
) -> Dict[str, Any]:
|
||||||
"""Execute a single Microsoft Graph API call."""
|
"""Execute a single Microsoft Graph API call."""
|
||||||
url = f"{_GRAPH_BASE}/{endpoint.lstrip('/')}"
|
url = f"{_GRAPH_BASE}/{endpoint.lstrip('/')}"
|
||||||
contentType = "application/json"
|
contentType = "application/json; charset=utf-8"
|
||||||
if method == "PUT" and isinstance(data, bytes):
|
if method == "PUT" and isinstance(data, bytes):
|
||||||
contentType = "application/octet-stream"
|
contentType = "application/octet-stream"
|
||||||
headers = {
|
headers = {
|
||||||
|
|
@ -271,6 +271,17 @@ class SharepointAdapter(_GraphApiMixin, ServiceAdapter):
|
||||||
# Outlook Adapter
|
# Outlook Adapter
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
_CHARSET_META = '<meta charset="utf-8">'
|
||||||
|
|
||||||
|
def _ensureHtmlCharset(html: str) -> str:
|
||||||
|
"""Ensure HTML body has a charset meta tag so Outlook renders UTF-8 correctly."""
|
||||||
|
if "charset" in html.lower():
|
||||||
|
return html
|
||||||
|
if html.strip().lower().startswith("<html"):
|
||||||
|
return html.replace("<html>", f"<html><head>{_CHARSET_META}</head>", 1)
|
||||||
|
return f"<html><head>{_CHARSET_META}</head><body>{html}</body></html>"
|
||||||
|
|
||||||
|
|
||||||
class OutlookAdapter(_GraphApiMixin, ServiceAdapter):
|
class OutlookAdapter(_GraphApiMixin, ServiceAdapter):
|
||||||
"""ServiceAdapter for Outlook (mail, calendar) via Microsoft Graph."""
|
"""ServiceAdapter for Outlook (mail, calendar) via Microsoft Graph."""
|
||||||
|
|
||||||
|
|
@ -433,9 +444,12 @@ class OutlookAdapter(_GraphApiMixin, ServiceAdapter):
|
||||||
|
|
||||||
attachments: list of {"name": str, "contentBytes": str (base64), "contentType": str}
|
attachments: list of {"name": str, "contentBytes": str (base64), "contentType": str}
|
||||||
"""
|
"""
|
||||||
|
content = body
|
||||||
|
if bodyType.upper() == "HTML":
|
||||||
|
content = _ensureHtmlCharset(body)
|
||||||
message: Dict[str, Any] = {
|
message: Dict[str, Any] = {
|
||||||
"subject": subject,
|
"subject": subject,
|
||||||
"body": {"contentType": bodyType, "content": body},
|
"body": {"contentType": bodyType, "content": content},
|
||||||
"toRecipients": [{"emailAddress": {"address": addr}} for addr in to],
|
"toRecipients": [{"emailAddress": {"address": addr}} for addr in to],
|
||||||
}
|
}
|
||||||
if cc:
|
if cc:
|
||||||
|
|
|
||||||
|
|
@ -261,16 +261,16 @@ Return JSON:
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Clean and format body content
|
|
||||||
cleaned_body = body.strip()
|
cleaned_body = body.strip()
|
||||||
|
_CHARSET_META = '<meta charset="utf-8">'
|
||||||
|
|
||||||
# Check if body is already HTML
|
|
||||||
if cleaned_body.startswith('<html>') or cleaned_body.startswith('<body>') or '<br>' in cleaned_body:
|
if cleaned_body.startswith('<html>') or cleaned_body.startswith('<body>') or '<br>' in cleaned_body:
|
||||||
html_body = cleaned_body
|
html_body = cleaned_body
|
||||||
|
if "charset" not in html_body.lower():
|
||||||
|
html_body = html_body.replace("<html>", f"<html><head>{_CHARSET_META}</head>", 1) if "<html>" in html_body else f"<html><head>{_CHARSET_META}</head><body>{html_body}</body></html>"
|
||||||
else:
|
else:
|
||||||
# Convert plain text to proper HTML formatting
|
|
||||||
html_body = cleaned_body.replace('\n', '<br>')
|
html_body = cleaned_body.replace('\n', '<br>')
|
||||||
html_body = f"<html><body>{html_body}</body></html>"
|
html_body = f"<html><head>{_CHARSET_META}</head><body>{html_body}</body></html>"
|
||||||
|
|
||||||
# Build the email message
|
# Build the email message
|
||||||
message = {
|
message = {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue