Preserve original sender and authentication results if the original email is preserved in the alias (#1780)
Co-authored-by: Adrià Casajús <adria.casajus@proton.ch>
This commit is contained in:
parent
40663358d8
commit
76b05e0d64
|
@ -20,6 +20,7 @@ X_SPAM_STATUS = "X-Spam-Status"
|
||||||
LIST_UNSUBSCRIBE = "List-Unsubscribe"
|
LIST_UNSUBSCRIBE = "List-Unsubscribe"
|
||||||
LIST_UNSUBSCRIBE_POST = "List-Unsubscribe-Post"
|
LIST_UNSUBSCRIBE_POST = "List-Unsubscribe-Post"
|
||||||
RETURN_PATH = "Return-Path"
|
RETURN_PATH = "Return-Path"
|
||||||
|
AUTHENTICATION_RESULTS = "Authentication-Results"
|
||||||
|
|
||||||
# headers used to DKIM sign in order of preference
|
# headers used to DKIM sign in order of preference
|
||||||
DKIM_HEADERS = [
|
DKIM_HEADERS = [
|
||||||
|
|
|
@ -514,9 +514,8 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle):
|
||||||
server_default=BlockBehaviourEnum.return_2xx.name,
|
server_default=BlockBehaviourEnum.return_2xx.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
# to keep existing behavior, the server default is TRUE whereas for new user, the default value is FALSE
|
|
||||||
include_header_email_header = sa.Column(
|
include_header_email_header = sa.Column(
|
||||||
sa.Boolean, default=False, nullable=False, server_default="1"
|
sa.Boolean, default=True, nullable=False, server_default="1"
|
||||||
)
|
)
|
||||||
|
|
||||||
# bitwise flags. Allow for future expansion
|
# bitwise flags. Allow for future expansion
|
||||||
|
|
|
@ -846,22 +846,21 @@ def forward_email_to_mailbox(
|
||||||
f"""Email sent to {alias.email} from an invalid address and cannot be replied""",
|
f"""Email sent to {alias.email} from an invalid address and cannot be replied""",
|
||||||
)
|
)
|
||||||
|
|
||||||
delete_all_headers_except(
|
headers_to_keep = [
|
||||||
msg,
|
headers.FROM,
|
||||||
[
|
headers.TO,
|
||||||
headers.FROM,
|
headers.CC,
|
||||||
headers.TO,
|
headers.SUBJECT,
|
||||||
headers.CC,
|
headers.DATE,
|
||||||
headers.SUBJECT,
|
# do not delete original message id
|
||||||
headers.DATE,
|
headers.MESSAGE_ID,
|
||||||
# do not delete original message id
|
# References and In-Reply-To are used for keeping the email thread
|
||||||
headers.MESSAGE_ID,
|
headers.REFERENCES,
|
||||||
# References and In-Reply-To are used for keeping the email thread
|
headers.IN_REPLY_TO,
|
||||||
headers.REFERENCES,
|
] + headers.MIME_HEADERS
|
||||||
headers.IN_REPLY_TO,
|
if user.include_header_email_header:
|
||||||
]
|
headers_to_keep.append(headers.AUTHENTICATION_RESULTS)
|
||||||
+ headers.MIME_HEADERS,
|
delete_all_headers_except(msg, headers_to_keep)
|
||||||
)
|
|
||||||
|
|
||||||
# create PGP email if needed
|
# create PGP email if needed
|
||||||
if mailbox.pgp_enabled() and user.is_premium() and not alias.disable_pgp:
|
if mailbox.pgp_enabled() and user.is_premium() and not alias.disable_pgp:
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
Received: by mail-ed1-f49.google.com with SMTP id ej4so13657316edb.7
|
||||||
|
for <gmail@simplemail.fplante.fr>; Mon, 27 Jun 2022 08:48:15 -0700 (PDT)
|
||||||
|
X-Gm-Message-State: AJIora8exR9DGeRFoKAtjzwLtUpH5hqx6Zt3tm8n4gUQQivGQ3fELjUV
|
||||||
|
yT7RQIfeW9Kv2atuOcgtmGYVU4iQ8VBeLmK1xvOYL4XpXfrT7ZrJNQ==
|
||||||
|
Authentication-Results: mx.google.com;
|
||||||
|
dkim=pass header.i=@matera.eu header.s=fnt header.b=XahYMey7;
|
||||||
|
dkim=pass header.i=@sendgrid.info header.s=smtpapi header.b="QOCS/yjt";
|
||||||
|
spf=pass (google.com: domain of bounces+14445963-ab4e-csyndic.quartz=gmail.com@front-mail.matera.eu designates 168.245.4.42 as permitted sender) smtp.mailfrom="bounces+14445963-ab4e-csyndic.quartz=gmail.com@front-mail.matera.eu";
|
||||||
|
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=matera.eu
|
||||||
|
Received: from out.frontapp.com (unknown)
|
||||||
|
by geopod-ismtpd-3-0 (SG)
|
||||||
|
with ESMTP id d2gM2N7PT7W8d2-UEC4ESA
|
||||||
|
for <csyndic.quartz@gmail.com>;
|
||||||
|
Mon, 27 Jun 2022 15:48:11.014 +0000 (UTC)
|
||||||
|
Content-Type: multipart/alternative;
|
||||||
|
boundary="----sinikael-?=_1-16563448907660.10629093370416887"
|
||||||
|
In-Reply-To:
|
||||||
|
<imported@frontapp.com_81c5208b4cff8b0633f167fda4e6e8e8f63b7a9b>
|
||||||
|
References:
|
||||||
|
<imported@frontapp.com_t:AssembléeGénérale2022-06-25T16:32:03+02:006b3cdade-982b-47cd-8114-6a037dfb7d60>
|
||||||
|
<imported@frontapp.com_f924cce139940c9935621f067d46443597394f34>
|
||||||
|
<imported@frontapp.com_t:Appeldefonds2022-06-26T10:04:55+02:00d89f5e23-6d98-4f01-95fa-b7c7544b7aa9>
|
||||||
|
<imported@frontapp.com_81c5208b4cff8b0633f167fda4e6e8e8f63b7a9b>
|
||||||
|
<af07e94a66ece6564ae30a2aaac7a34c@frontapp.com>
|
||||||
|
From: {{ sender_address }}
|
||||||
|
To: {{ recipient_address }}
|
||||||
|
Subject: Something
|
||||||
|
Message-ID: <af07e94a66ece6564ae30a2aaac7a34c@frontapp.com>
|
||||||
|
X-Mailer: Front (1.0; +https://frontapp.com;
|
||||||
|
+msgid=af07e94a66ece6564ae30a2aaac7a34c@frontapp.com)
|
||||||
|
X-Feedback-ID: 14445963:SG
|
||||||
|
X-SG-EID:
|
||||||
|
=?us-ascii?Q?XtlxQDg5i3HqMzQY2Upg19JPZBVl1RybInUUL2yta9uBoIU4KU1FMJ5DjWrz6g?=
|
||||||
|
=?us-ascii?Q?fJUK5Qmneg2uc46gwp5BdHdp6Foaq5gg3xJriv3?=
|
||||||
|
=?us-ascii?Q?9OA=2FWRifeylU9O+ngdNbOKXoeJAkROmp2mCgw9x?=
|
||||||
|
=?us-ascii?Q?uud+EclOT9mYVtbZsydOLLm6Y2PPswQl8lnmiku?=
|
||||||
|
=?us-ascii?Q?DAhkG15HTz2FbWGWNDFb7VrSsN5ddjAscr6sIHw?=
|
||||||
|
=?us-ascii?Q?S48R5fnXmfhPbmlCgqFjr0FGphfuBdNAt6z6w8a?=
|
||||||
|
=?us-ascii?Q?o9u1EYDIX7zWHZ+Tr3eyw=3D=3D?=
|
||||||
|
X-SG-ID:
|
||||||
|
=?us-ascii?Q?N2C25iY2uzGMFz6rgvQsb8raWjw0ZPf1VmjsCkspi=2FI9PhcvqXQTpKqqyZkvBe?=
|
||||||
|
=?us-ascii?Q?+2RscnQ4WPkA+BN1vYgz1rezTVIqgp+rlWrKk8o?=
|
||||||
|
=?us-ascii?Q?HoB5dzpX6HKWtWCVRi10zwlDN1+pJnySoIUrlaT?=
|
||||||
|
=?us-ascii?Q?PA2aqQKmMQbjTl0CUAFryR8hhHcxdS0cQowZSd7?=
|
||||||
|
=?us-ascii?Q?XNjJWLvCGF7ODwg=2FKr+4yRE8UvULS2nrdO2wWyQ?=
|
||||||
|
=?us-ascii?Q?AiFHdPdZsRlgNomEo=3D?=
|
||||||
|
X-Spamd-Result: default: False [-2.00 / 13.00];
|
||||||
|
ARC_ALLOW(-1.00)[google.com:s=arc-20160816:i=1];
|
||||||
|
MIME_GOOD(-0.10)[multipart/alternative,text/plain];
|
||||||
|
REPLYTO_ADDR_EQ_FROM(0.00)[];
|
||||||
|
FORGED_RECIPIENTS_FORWARDING(0.00)[];
|
||||||
|
NEURAL_HAM(-0.00)[-0.981];
|
||||||
|
FREEMAIL_TO(0.00)[gmail.com];
|
||||||
|
RCVD_TLS_LAST(0.00)[];
|
||||||
|
FREEMAIL_ENVFROM(0.00)[gmail.com];
|
||||||
|
MIME_TRACE(0.00)[0:+,1:+,2:~];
|
||||||
|
RWL_MAILSPIKE_POSSIBLE(0.00)[209.85.208.49:from]
|
||||||
|
|
||||||
|
------sinikael-?=_1-16563448907660.10629093370416887
|
||||||
|
Content-Type: text/plain; charset=utf-8
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
|
||||||
|
From {{ sender_address }} To {{ recipient_address }}
|
||||||
|
------sinikael-?=_1-16563448907660.10629093370416887--
|
|
@ -0,0 +1,34 @@
|
||||||
|
from aiosmtpd.smtp import Envelope
|
||||||
|
|
||||||
|
import email_handler
|
||||||
|
from app.db import Session
|
||||||
|
from app.email import headers, status
|
||||||
|
from app.mail_sender import mail_sender
|
||||||
|
from app.models import Alias
|
||||||
|
from tests.utils import create_new_user, load_eml_file, random_email
|
||||||
|
|
||||||
|
|
||||||
|
@mail_sender.store_emails_test_decorator
|
||||||
|
def test_original_headers_from_preserved():
|
||||||
|
user = create_new_user()
|
||||||
|
alias = Alias.create_new_random(user)
|
||||||
|
Session.flush()
|
||||||
|
assert user.include_header_email_header
|
||||||
|
original_sender_address = random_email()
|
||||||
|
msg = load_eml_file(
|
||||||
|
"replacement_on_forward_phase.eml",
|
||||||
|
{"sender_address": original_sender_address, "recipient_address": alias.email},
|
||||||
|
)
|
||||||
|
envelope = Envelope()
|
||||||
|
envelope.mail_from = f"env.{original_sender_address}"
|
||||||
|
envelope.rcpt_tos = [alias.email]
|
||||||
|
result = email_handler.MailHandler()._handle(envelope, msg)
|
||||||
|
assert result == status.E200
|
||||||
|
send_requests = mail_sender.get_stored_emails()
|
||||||
|
assert len(send_requests) == 1
|
||||||
|
request = send_requests[0]
|
||||||
|
assert request.msg[headers.SL_ENVELOPE_FROM] == envelope.mail_from
|
||||||
|
assert (
|
||||||
|
request.msg[headers.AUTHENTICATION_RESULTS]
|
||||||
|
== msg[headers.AUTHENTICATION_RESULTS]
|
||||||
|
)
|
Loading…
Reference in New Issue