diff --git a/canaille/account.py b/canaille/account.py
index 388ef1da..4458a65c 100644
--- a/canaille/account.py
+++ b/canaille/account.py
@@ -19,7 +19,7 @@ from .forms import (
ForgottenPasswordForm,
profile_form,
)
-from .apputils import base64logo, send_email
+from .apputils import logo, send_email
from .flaskutils import current_user, user_needed, moderator_needed
from .models import User
@@ -100,7 +100,7 @@ def firstlogin(uid):
),
_external=True,
)
- logo, logo_extension = base64logo()
+ logo_cid, logo_filename, logo_raw = logo()
subject = _("Password initialization on {website_name}").format(
website_name=current_app.config.get("NAME", reset_url)
@@ -116,16 +116,15 @@ def firstlogin(uid):
site_name=current_app.config.get("NAME", reset_url),
site_url=base_url,
reset_url=reset_url,
- logo=logo,
- logo_extension=logo_extension,
+ logo="cid:{}".format(logo_cid[1:-1]) if logo_cid else None,
)
success = send_email(
subject=subject,
- sender=current_app.config["SMTP"]["FROM_ADDR"],
recipient=user.mail,
text=text_body,
html=html_body,
+ attachements=[(logo_cid, logo_filename, logo_raw)] if logo_filename else None,
)
if success:
@@ -295,7 +294,7 @@ def forgotten():
),
_external=True,
)
- logo, logo_extension = base64logo()
+ logo_cid, logo_filename, logo_raw = logo()
subject = _("Password reset on {website_name}").format(
website_name=current_app.config.get("NAME", reset_url)
@@ -311,16 +310,15 @@ def forgotten():
site_name=current_app.config.get("NAME", reset_url),
site_url=base_url,
reset_url=reset_url,
- logo=logo,
- logo_extension=logo_extension,
+ logo="cid:{}".format(logo_cid[1:-1]) if logo_cid else None,
)
success = send_email(
subject=subject,
- sender=current_app.config["SMTP"]["FROM_ADDR"],
recipient=user.mail,
text=text_body,
html=html_body,
+ attachements=[(logo_cid, logo_filename, logo_raw)] if logo_filename else None,
)
if success:
diff --git a/canaille/admin/mail.py b/canaille/admin/mail.py
index cbe97c03..aeac5c31 100644
--- a/canaille/admin/mail.py
+++ b/canaille/admin/mail.py
@@ -20,26 +20,12 @@ def reset_html(user):
_external=True,
)
- logo = None
- logo_extension = None
- logo_url = current_app.config.get("LOGO")
- if logo_url:
- logo_extension = logo_url.split(".")[-1]
- if not logo_url.startswith("http"):
- logo_url = "{}/{}".format(request.host_url, logo_url)
- try:
- with urllib.request.urlopen(logo_url) as f:
- logo = base64.b64encode(f.read()).decode("utf-8")
- except (urllib.error.HTTPError, urllib.error.URLError):
- pass
-
return render_template(
"mail/reset.html",
site_name=current_app.config.get("NAME", reset_url),
site_url=base_url,
reset_url=reset_url,
- logo=logo,
- logo_extension=logo_extension,
+ logo=current_app.config.get("LOGO"),
title=_("Password reset on {website_name}").format(
website_name=current_app.config.get("NAME", reset_url)
),
diff --git a/canaille/apputils.py b/canaille/apputils.py
index 8b61c781..0be89522 100644
--- a/canaille/apputils.py
+++ b/canaille/apputils.py
@@ -1,17 +1,18 @@
-import base64
import email.message
import logging
+import mimetypes
import smtplib
import urllib.request
+from email.utils import make_msgid
from flask import current_app, request
-def base64logo():
+def logo():
logo_url = current_app.config.get("LOGO")
if not logo_url:
- return None, None
+ return None, None, None
- logo_extension = logo_url.split(".")[-1]
+ logo_filename = logo_url.split("/")[-1]
if not logo_url.startswith("http"):
if current_app.config.get("SERVER_NAME"):
logo_url = "{}://{}/{}".format(
@@ -24,22 +25,30 @@ def base64logo():
try:
with urllib.request.urlopen(logo_url) as f:
- logo = base64.b64encode(f.read()).decode("utf-8")
+ logo_raw = f.read()
except (urllib.error.HTTPError, urllib.error.URLError):
- logo = None
- logo_extension = None
+ logo_filename = None
+ logo_raw = None
- return logo, logo_extension
+ domain = current_app.config["SMTP"]["FROM_ADDR"].split("@")[-1]
+ logo_cid = make_msgid(domain=domain)
+ return logo_cid, logo_filename, logo_raw
-def send_email(subject, sender, recipient, text, html):
+def send_email(subject, recipient, text, html, sender=None, attachements=None):
msg = email.message.EmailMessage()
msg.set_content(text)
msg.add_alternative(html, subtype="html")
msg["Subject"] = subject
- msg["From"] = sender
+ msg["From"] = sender or current_app.config["SMTP"]["FROM_ADDR"]
msg["To"] = recipient
+ attachements = attachements or []
+ for cid, filename, value in attachements:
+ maintype, subtype = mimetypes.guess_type(filename)[0].split("/")
+ msg.get_payload()[1].add_related(
+ value, maintype=maintype, subtype=subtype, cid=cid
+ )
try:
with smtplib.SMTP(
host=current_app.config["SMTP"]["HOST"],
diff --git a/canaille/templates/mail/firstlogin.html b/canaille/templates/mail/firstlogin.html
index 7f6d81d9..7a6d2c97 100644
--- a/canaille/templates/mail/firstlogin.html
+++ b/canaille/templates/mail/firstlogin.html
@@ -8,12 +8,12 @@
-