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 @@ - +

{% if logo %} - {{ site_name }} + {{ site_name }} {% endif %}
{% trans %}Password initialization{% endtrans %} diff --git a/canaille/templates/mail/reset.html b/canaille/templates/mail/reset.html index 72d0d42e..4ad69cbd 100644 --- a/canaille/templates/mail/reset.html +++ b/canaille/templates/mail/reset.html @@ -8,12 +8,12 @@ - +

{% if logo %} - {{ site_name }} + {{ site_name }} {% endif %}
{% trans %}Password reinitialisation{% endtrans %}