forked from Github-Mirrors/canaille
Fixed gmail emails image display
This commit is contained in:
parent
fdb3b3ff7e
commit
7aa79999f1
5 changed files with 31 additions and 38 deletions
|
@ -19,7 +19,7 @@ from .forms import (
|
||||||
ForgottenPasswordForm,
|
ForgottenPasswordForm,
|
||||||
profile_form,
|
profile_form,
|
||||||
)
|
)
|
||||||
from .apputils import base64logo, send_email
|
from .apputils import logo, send_email
|
||||||
from .flaskutils import current_user, user_needed, moderator_needed
|
from .flaskutils import current_user, user_needed, moderator_needed
|
||||||
from .models import User
|
from .models import User
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ def firstlogin(uid):
|
||||||
),
|
),
|
||||||
_external=True,
|
_external=True,
|
||||||
)
|
)
|
||||||
logo, logo_extension = base64logo()
|
logo_cid, logo_filename, logo_raw = logo()
|
||||||
|
|
||||||
subject = _("Password initialization on {website_name}").format(
|
subject = _("Password initialization on {website_name}").format(
|
||||||
website_name=current_app.config.get("NAME", reset_url)
|
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_name=current_app.config.get("NAME", reset_url),
|
||||||
site_url=base_url,
|
site_url=base_url,
|
||||||
reset_url=reset_url,
|
reset_url=reset_url,
|
||||||
logo=logo,
|
logo="cid:{}".format(logo_cid[1:-1]) if logo_cid else None,
|
||||||
logo_extension=logo_extension,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
success = send_email(
|
success = send_email(
|
||||||
subject=subject,
|
subject=subject,
|
||||||
sender=current_app.config["SMTP"]["FROM_ADDR"],
|
|
||||||
recipient=user.mail,
|
recipient=user.mail,
|
||||||
text=text_body,
|
text=text_body,
|
||||||
html=html_body,
|
html=html_body,
|
||||||
|
attachements=[(logo_cid, logo_filename, logo_raw)] if logo_filename else None,
|
||||||
)
|
)
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
|
@ -295,7 +294,7 @@ def forgotten():
|
||||||
),
|
),
|
||||||
_external=True,
|
_external=True,
|
||||||
)
|
)
|
||||||
logo, logo_extension = base64logo()
|
logo_cid, logo_filename, logo_raw = logo()
|
||||||
|
|
||||||
subject = _("Password reset on {website_name}").format(
|
subject = _("Password reset on {website_name}").format(
|
||||||
website_name=current_app.config.get("NAME", reset_url)
|
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_name=current_app.config.get("NAME", reset_url),
|
||||||
site_url=base_url,
|
site_url=base_url,
|
||||||
reset_url=reset_url,
|
reset_url=reset_url,
|
||||||
logo=logo,
|
logo="cid:{}".format(logo_cid[1:-1]) if logo_cid else None,
|
||||||
logo_extension=logo_extension,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
success = send_email(
|
success = send_email(
|
||||||
subject=subject,
|
subject=subject,
|
||||||
sender=current_app.config["SMTP"]["FROM_ADDR"],
|
|
||||||
recipient=user.mail,
|
recipient=user.mail,
|
||||||
text=text_body,
|
text=text_body,
|
||||||
html=html_body,
|
html=html_body,
|
||||||
|
attachements=[(logo_cid, logo_filename, logo_raw)] if logo_filename else None,
|
||||||
)
|
)
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
|
|
|
@ -20,26 +20,12 @@ def reset_html(user):
|
||||||
_external=True,
|
_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(
|
return render_template(
|
||||||
"mail/reset.html",
|
"mail/reset.html",
|
||||||
site_name=current_app.config.get("NAME", reset_url),
|
site_name=current_app.config.get("NAME", reset_url),
|
||||||
site_url=base_url,
|
site_url=base_url,
|
||||||
reset_url=reset_url,
|
reset_url=reset_url,
|
||||||
logo=logo,
|
logo=current_app.config.get("LOGO"),
|
||||||
logo_extension=logo_extension,
|
|
||||||
title=_("Password reset on {website_name}").format(
|
title=_("Password reset on {website_name}").format(
|
||||||
website_name=current_app.config.get("NAME", reset_url)
|
website_name=current_app.config.get("NAME", reset_url)
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
import base64
|
|
||||||
import email.message
|
import email.message
|
||||||
import logging
|
import logging
|
||||||
|
import mimetypes
|
||||||
import smtplib
|
import smtplib
|
||||||
import urllib.request
|
import urllib.request
|
||||||
|
from email.utils import make_msgid
|
||||||
from flask import current_app, request
|
from flask import current_app, request
|
||||||
|
|
||||||
|
|
||||||
def base64logo():
|
def logo():
|
||||||
logo_url = current_app.config.get("LOGO")
|
logo_url = current_app.config.get("LOGO")
|
||||||
if not logo_url:
|
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 not logo_url.startswith("http"):
|
||||||
if current_app.config.get("SERVER_NAME"):
|
if current_app.config.get("SERVER_NAME"):
|
||||||
logo_url = "{}://{}/{}".format(
|
logo_url = "{}://{}/{}".format(
|
||||||
|
@ -24,22 +25,30 @@ def base64logo():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with urllib.request.urlopen(logo_url) as f:
|
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):
|
except (urllib.error.HTTPError, urllib.error.URLError):
|
||||||
logo = None
|
logo_filename = None
|
||||||
logo_extension = 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 = email.message.EmailMessage()
|
||||||
msg.set_content(text)
|
msg.set_content(text)
|
||||||
msg.add_alternative(html, subtype="html")
|
msg.add_alternative(html, subtype="html")
|
||||||
msg["Subject"] = subject
|
msg["Subject"] = subject
|
||||||
msg["From"] = sender
|
msg["From"] = sender or current_app.config["SMTP"]["FROM_ADDR"]
|
||||||
msg["To"] = recipient
|
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:
|
try:
|
||||||
with smtplib.SMTP(
|
with smtplib.SMTP(
|
||||||
host=current_app.config["SMTP"]["HOST"],
|
host=current_app.config["SMTP"]["HOST"],
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
</head>
|
</head>
|
||||||
<body style="color: rgba(0,0,0,.87); background: #F8F8F8; padding: 1em; margin: auto; width: 700px; font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif; font-weight: 400; font-size: 14px;">
|
<body style="color: rgba(0,0,0,.87); background: #F8F8F8; padding: 1em; margin: auto; width: 700px; font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif; font-weight: 400; font-size: 14px;">
|
||||||
|
|
||||||
<table cellspacing="0" cellpadding="0" border="0" style="font-weight: 400; background: #fff; box-shadow: 0 1px 2px 0 rgba(34,36,38,.15); margin: 1rem 0; padding: 1em 1em; border-radius: .3rem; border: 1px solid rgba(34,36,38,.15); font-size: 1rem; margin-top: 0; margin-bottom: 0;">
|
<table cellspacing="0" cellpadding="0" border="0" style="font-weight: 400; background: #fff; box-shadow: 0 1px 2px 0 rgba(34,36,38,.15); margin: 1rem 0; padding: 1em 1em; border-radius: .3rem; border: 1px solid rgba(34,36,38,.15); font-size: 1rem; margin-top: 0; margin-bottom: 0; width: 700px;">
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<h3 style="font-weight: 700; line-height: 1.3em; font-size: 1.3rem; padding: .8rem 1rem; margin: 0; box-shadow: none; border: 1px solid #d4d4d5; border-radius: .3rem .3rem 0 0;">
|
<h3 style="font-weight: 700; line-height: 1.3em; font-size: 1.3rem; padding: .8rem 1rem; margin: 0; box-shadow: none; border: 1px solid #d4d4d5; border-radius: .3rem .3rem 0 0;">
|
||||||
{% if logo %}
|
{% if logo %}
|
||||||
<img src="data:image/{{ logo_extension }};base64, {{ logo }}" alt="{{ site_name }}" style="font-size: 1.3rem; border-style: none; width: 50px; display: inline-block; margin-top: .14em; vertical-align: middle;">
|
<img src="{{ logo }}" alt="{{ site_name }}" style="font-size: 1.3rem; border-style: none; width: 50px; display: inline-block; margin-top: .14em; vertical-align: middle;">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div style="font-size: 1.3rem; display: inline-block; padding-left: .75rem; vertical-align: middle;">
|
<div style="font-size: 1.3rem; display: inline-block; padding-left: .75rem; vertical-align: middle;">
|
||||||
{% trans %}Password initialization{% endtrans %}
|
{% trans %}Password initialization{% endtrans %}
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
</head>
|
</head>
|
||||||
<body style="color: rgba(0,0,0,.87); background: #F8F8F8; padding: 1em; margin: auto; width: 700px; font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif; font-weight: 400; font-size: 14px;">
|
<body style="color: rgba(0,0,0,.87); background: #F8F8F8; padding: 1em; margin: auto; width: 700px; font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif; font-weight: 400; font-size: 14px;">
|
||||||
|
|
||||||
<table cellspacing="0" cellpadding="0" border="0" style="font-weight: 400; background: #fff; box-shadow: 0 1px 2px 0 rgba(34,36,38,.15); margin: 1rem 0; padding: 1em 1em; border-radius: .3rem; border: 1px solid rgba(34,36,38,.15); font-size: 1rem; margin-top: 0; margin-bottom: 0;">
|
<table cellspacing="0" cellpadding="0" border="0" style="font-weight: 400; background: #fff; box-shadow: 0 1px 2px 0 rgba(34,36,38,.15); margin: 1rem 0; padding: 1em 1em; border-radius: .3rem; border: 1px solid rgba(34,36,38,.15); font-size: 1rem; margin-top: 0; margin-bottom: 0; width: 700px;">
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<h3 style="font-weight: 700; line-height: 1.3em; font-size: 1.3rem; padding: .8rem 1rem; margin: 0; box-shadow: none; border: 1px solid #d4d4d5; border-radius: .3rem .3rem 0 0;">
|
<h3 style="font-weight: 700; line-height: 1.3em; font-size: 1.3rem; padding: .8rem 1rem; margin: 0; box-shadow: none; border: 1px solid #d4d4d5; border-radius: .3rem .3rem 0 0;">
|
||||||
{% if logo %}
|
{% if logo %}
|
||||||
<img src="data:image/{{ logo_extension }};base64, {{ logo }}" alt="{{ site_name }}" style="font-size: 1.3rem; border-style: none; width: 50px; display: inline-block; margin-top: .14em; vertical-align: middle;">
|
<img src="{{ logo }}" alt="{{ site_name }}" style="font-size: 1.3rem; border-style: none; width: 50px; display: inline-block; margin-top: .14em; vertical-align: middle;">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div style="font-size: 1.3rem; display: inline-block; padding-left: .75rem; vertical-align: middle;">
|
<div style="font-size: 1.3rem; display: inline-block; padding-left: .75rem; vertical-align: middle;">
|
||||||
{% trans %}Password reinitialisation{% endtrans %}
|
{% trans %}Password reinitialisation{% endtrans %}
|
||||||
|
|
Loading…
Reference in a new issue