Bad mail encoding (breaks DKIM signature)

Hi,

I have a problem with the encoding of my mails, resulting in bad mail part encoding, which makes DKIM signature invalid.

Server softwares:

  • Debian 10 Buster (previously 9 Stretch, problem was already present)
  • PostgreSQL 11 (previously 9.6)
  • Perl 5.28 (previously 5.24)
  • RT 4.4.4

DB encoding:

  • Collationnement: fr_FR.UTF-8
  • Type caract.: fr_FR.UTF-8

RT settings:

Set(@EmailInputEncodings, qw(utf-8 iso-8859-1 us-ascii));
Set($EmailOutputEncoding, "UTF-8");
Set($HTMLFormatter, undef);
Set($MailCommand, "sendmail");
Set($SendmailArguments, "-oi");

Here’s an example of badly encoded autoreply HTML mail:

Return-Path: <tech@framasoft.org>
Received: from bm.didry.org (localhost [127.0.0.1])
	 by fry with LMTPA;
	 Thu, 25 Jul 2019 16:36:37 +0200
X-Sieve: CMU Sieve 2.4
Received: from /192.168.1.42 (LHLO bm.didry.org) by unknown with LMTP;
 7/25/19 2:36 PM
Received: from wolf.framasoft.org (wolf.framasoft.org [IPv6:2a01:4f8:191:74::150])
	(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by bm.didry.org (Postfix) with ESMTPS id CE6D1C0062
	for <luc@didry.org>; Thu, 25 Jul 2019 16:36:36 +0200 (CEST)
Received: by wolf.framasoft.org (Postfix, from userid 33)
	id 4BAE32E0D06; Thu, 25 Jul 2019 16:36:36 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=framasoft.org;
	s=dkim; t=1564065396;
	h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date:
	 message-id:message-id:to:to:cc:mime-version:mime-version:
	 content-type:content-type:
	 content-transfer-encoding:content-transfer-encoding:
	 in-reply-to:in-reply-to:references:references;
	bh=+dbJTMbPjNwLbeJPuM8wqGIpgZBI9hA+vfH988/Aqdo=;
	b=aCAmRD++86SnUkFX+zim9PRm/x6w7G4hrFw10rrof8rrg6vanRikP038F//xzQIBVUtXnV
	BT6L33/qORgTWjyDHPXGzLBkrGP6ebgPm6bHFhS7TmBOcUuuhrPLeJy8hcMCeQ5HtnDlBd
	/jee1ut6MYamjfgaXbh7PjJ8scFqjHQ=
Date: Thu, 25 Jul 2019 16:36:36 +0200
X-RT-Loop-Prevention: FramaTicket
From: File perso pour Luc <rt+luc@framasoft.org>
Reply-To: rt+luc@framasoft.org
Sender: "www-data" <REDACTED>
Precedence: bulk
In-Reply-To: <201907251436.x6PEaWNP011103@odysseus.fiat-tux.fr>
X-RT-Ticket: FramaTicket #31179
Message-ID: <rt-4.4.4-21746-1564065395-923.31179-7-0@framasoft.org>
Subject: =?UTF8?B?W0RlbWFuZGUgcGVyc28gcG91ciBMdWMgIzMxMTc5XSBSw6lwb25zZSBhdXRvbWF0?= =?UTF8?B?aXF1ZSA6IHRlc3Q=?=
Content-Transfer-Encoding: 8bit
X-Mailer: Perl5 Mail::Internet v2.18
X-RT-Originator: REDACTED
X-Managed-BY: RT 4.4.4 (http://www.bestpractical.com/rt/)
To: luc@didry.org
Content-Type: multipart/alternative; boundary="----------=_1564065395-21746-0"
MIME-Version: 1.0
References: <RT-Ticket-31179@framasoft.org>
 <201907251436.x6PEaWNP011103@odysseus.fiat-tux.fr>
Auto-Submitted: auto-replied
X-Bm-Milter-Handled: 3651b1e0-29d9-4f34-bcad-cf1db18b5f60
X-Bm-Transport-Timestamp: 1564065396913
X-Rspamd-Queue-Id: CE6D1C0062
X-Spamd-Result: default: False [-0.50 / 30.00];
	 ARC_NA(0.00)[];
	 HAS_REPLYTO(0.00)[rt+luc@framasoft.org];
	 MID_RHS_MATCH_FROM(0.00)[];
	 FROM_HAS_DN(0.00)[];
	 R_DKIM_REJECT(0.00)[framasoft.org:s=dkim];
	 PRECEDENCE_BULK(0.00)[];
	 MIME_GOOD(-0.10)[multipart/alternative,text/plain];
	 R_SPF_ALLOW(-0.20)[+a:wolf.framasoft.org];
	 TO_DN_NONE(0.00)[];
	 RCPT_COUNT_ONE(0.00)[1];
	 REPLYTO_DOM_EQ_FROM_DOM(0.00)[];
	 TO_MATCH_ENVRCPT_ALL(0.00)[];
	 DKIM_TRACE(0.00)[framasoft.org:-];
	 DMARC_POLICY_ALLOW(0.00)[framasoft.org,none];
	 DMARC_POLICY_ALLOW_WITH_FAILURES(-0.50)[];
	 FORGED_SENDER(0.30)[rt@framasoft.org,REDACTED];
	 RCVD_COUNT_ZERO(0.00)[0];
	 MIME_TRACE(0.00)[0:+,1:+,2:~];
	 ASN(0.00)[asn:24940, ipnet:2a01:4f8::/29, country:DE];
	 TAGGED_FROM(0.00)[luc];
	 FROM_NEQ_ENVFROM(0.00)[rt@framasoft.org,REDACTED]
X-Rspamd-Server: fry

 This is a multi-part message in MIME format...

------------=_1564065395-21746-0
Subject: Réponse automatique : test
Content-Type: text/plain; charset="utf8"
X-RT-Original-Encoding: utf-8

Bonjour,

Ceci est un email automatique en réponse à votre demande concernant : test,
dont un résumé apparaît ci-dessous.

Oui, à Framasoft, on est comme vous : on n'aime pas les réponses automatiques.
Nous utilisons juste un système de tickets parce que c'est le meilleur moyen
de vous mettre en contact rapidement avec la personne la plus apte à vous
répondre.

Bref, pas d'inquiétude : ceci n'est qu'un accusé de réception, y a de vrais
gens (souvent des bénévoles de notre association) qui arrivent pour discuter
avec vous !

Votre "ticket" a reçu l'identifiant [Demande perso pour Luc #31179].
Veuillez inclure cet identifiant : [Demande perso pour Luc #31179] dans le
sujet de tout futur message relatif à ce sujet.

Il n'y a pas besoin de répondre à ce message pour l'instant.

Merci,
rt+luc@framasoft.org

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

test


------------=_1564065395-21746-0
Content-Type: text/html; charset="utf8"
X-RT-Original-Encoding: utf-8

<p>Bonjour,</p>

<p>Ceci est un email automatique en réponse à votre demande concernant : <b>test</b>,
dont un résumé apparaît ci-dessous.</p>

<p>Oui, à Framasoft, on est comme vous : on n'aime pas les réponses automatiques. Nous utilisons juste un système de tickets parce que c'est le meilleur moyen de vous mettre en contact rapidement avec la personne la plus apte à vous répondre.</p>

<p>Bref, pas d'inquiétude : ceci n'est qu'un accusé de réception, y a de vrais gens (souvent des bénévoles de notre association) qui arrivent pour discuter avec vous !</p>

<p>Votre "ticket" a reçu l'identifiant <b>[Demande perso pour Luc #31179]</b>.<br>
Veuillez inclure cet identifiant : <b>[Demande perso pour Luc #31179]</b>
dans le sujet de tout futur message relatif à ce sujet.</p>

<p>Il n'y a pas besoin de répondre à ce message pour l'instant.</p>

<p>Merci,<br/>
rt+luc@framasoft.org</p>

<hr/>
<pre style="white-space: pre-wrap; font-family: monospace;">test
</pre>
------------=_1564065395-21746-0--

As you can see, the multiparts are badly encoded. My mail client shows the text correctly though.

I tried to change the output encoding to iso-8859-1 (Set($EmailOutputEncoding, "iso-8859-1");). It fixed the HTML part, but not the text/plain part:

Return-Path: <tech@framasoft.org>
Received: from bm.didry.org (localhost [127.0.0.1])
	 by fry with LMTPA;
	 Thu, 25 Jul 2019 16:46:46 +0200
X-Sieve: CMU Sieve 2.4
Received: from /192.168.1.42 (LHLO bm.didry.org) by unknown with LMTP;
 7/25/19 2:46 PM
Received: from wolf.framasoft.org (wolf.framasoft.org [136.243.187.150])
	(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by bm.didry.org (Postfix) with ESMTPS id D6139C0062
	for <luc@didry.org>; Thu, 25 Jul 2019 16:46:45 +0200 (CEST)
Received: by wolf.framasoft.org (Postfix, from userid 33)
	id 494012E0D06; Thu, 25 Jul 2019 16:46:45 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=framasoft.org;
	s=dkim; t=1564066005;
	h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date:
	 message-id:message-id:to:to:cc:mime-version:mime-version:
	 content-type:content-type:
	 content-transfer-encoding:content-transfer-encoding:
	 in-reply-to:in-reply-to:references:references;
	bh=eLwuUMWKkXbQ4JuVJcCJcovq1vA4W2p+8KTL4i+7o8w=;
	b=jDynPCWPGSTwhSrod2L5x/J/lxfVBQIb5FbqO74w8OFU/XqQns+cMvkMkzQGNXtF9hHJFh
	nBNRMYlWi4VDz2qQ9H2rSS+F0rNkrag7cPGaBbDClk0k+5HKOwyd03skeMwiKI4K4Ci7bO
	fLn9lLsZolqQ3fcYjjaj6nqiZ1P/KTg=
Content-Type: multipart/alternative; boundary="----------=_1564066005-24293-3"
To: luc@didry.org
Precedence: bulk
In-Reply-To: <201907251446.x6PEkhos011968@odysseus.fiat-tux.fr>
X-Managed-BY: RT 4.4.4 (http://www.bestpractical.com/rt/)
X-RT-Originator: REDACTED
MIME-Version: 1.0
Auto-Submitted: auto-replied
X-Mailer: Perl5 Mail::Internet v2.18
Reply-To: rt+luc@framasoft.org
Subject: =?ISO-8859-1?B?W0RlbWFuZGUgcGVyc28gcG91ciBMdWMgIzMxMTg1XSBS6XBvbnNlIGF1?= =?ISO-8859-1?B?dG9tYXRpcXVlIDogdGVzdA==?=
From: File perso pour Luc <rt+luc@framasoft.org>
X-RT-Ticket: FramaTicket #31185
Sender: "www-data" <tech@framasoft.org>
X-RT-Loop-Prevention: FramaTicket
References: <RT-Ticket-31185@framasoft.org>
 <201907251446.x6PEkhos011968@odysseus.fiat-tux.fr>
Date: Thu, 25 Jul 2019 16:46:45 +0200
Message-ID: <rt-4.4.4-24293-1564066005-746.31185-7-0@framasoft.org>
Content-Transfer-Encoding: 8bit
X-Bm-Milter-Handled: 3651b1e0-29d9-4f34-bcad-cf1db18b5f60
X-Bm-Transport-Timestamp: 1564066005927
X-Rspamd-Queue-Id: D6139C0062
X-Spamd-Result: default: False [-0.50 / 30.00];
	 ARC_NA(0.00)[];
	 HAS_REPLYTO(0.00)[rt+luc@framasoft.org];
	 MID_RHS_MATCH_FROM(0.00)[];
	 FROM_HAS_DN(0.00)[];
	 R_SPF_ALLOW(-0.20)[+a:wolf.framasoft.org:c];
	 R_DKIM_REJECT(0.00)[framasoft.org:s=dkim];
	 MIME_GOOD(-0.10)[multipart/alternative,text/plain];
	 TO_DN_NONE(0.00)[];
	 PRECEDENCE_BULK(0.00)[];
	 RCPT_COUNT_ONE(0.00)[1];
	 REPLYTO_DOM_EQ_FROM_DOM(0.00)[];
	 TO_MATCH_ENVRCPT_ALL(0.00)[];
	 DKIM_TRACE(0.00)[framasoft.org:-];
	 DMARC_POLICY_ALLOW(0.00)[framasoft.org,none];
	 DMARC_POLICY_ALLOW_WITH_FAILURES(-0.50)[];
	 FORGED_SENDER(0.30)[rt@framasoft.org,REDACTED];
	 RCVD_COUNT_ZERO(0.00)[0];
	 MIME_TRACE(0.00)[0:+,1:+,2:~];
	 ASN(0.00)[asn:24940, ipnet:136.243.0.0/16, country:DE];
	 TAGGED_FROM(0.00)[luc];
	 FROM_NEQ_ENVFROM(0.00)[rt@framasoft.org,REDACTED]
X-Rspamd-Server: fry

 This is a multi-part message in MIME format...

------------=_1564066005-24293-3
Subject: Réponse automatique : test
Content-Type: text/plain; charset="utf-8"
X-RT-Original-Encoding: utf-8

Bonjour,

Ceci est un email automatique en réponse à votre demande concernant : test,
dont un résumé apparaît ci-dessous.

Oui, à Framasoft, on est comme vous : on n'aime pas les réponses automatiques.
Nous utilisons juste un système de tickets parce que c'est le meilleur moyen
de vous mettre en contact rapidement avec la personne la plus apte à vous
répondre.

Bref, pas d'inquiétude : ceci n'est qu'un accusé de réception, y a de vrais
gens (souvent des bénévoles de notre association) qui arrivent pour discuter
avec vous !

Votre "ticket" a reçu l'identifiant [Demande perso pour Luc #31185].
Veuillez inclure cet identifiant : [Demande perso pour Luc #31185] dans le
sujet de tout futur message relatif à ce sujet.

Il n'y a pas besoin de répondre à ce message pour l'instant.

Merci,
rt+luc@framasoft.org

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

test


------------=_1564066005-24293-3
Content-Type: text/html; charset="iso-8859-1"
X-RT-Original-Encoding: utf-8

<p>Bonjour,</p>

<p>Ceci est un email automatique en réponse à votre demande concernant : <b>test</b>,
dont un résumé apparaît ci-dessous.</p>

<p>Oui, à Framasoft, on est comme vous : on n'aime pas les réponses automatiques. Nous utilisons juste un système de tickets parce que c'est le meilleur moyen de vous mettre en contact rapidement avec la personne la plus apte à vous répondre.</p>

<p>Bref, pas d'inquiétude : ceci n'est qu'un accusé de réception, y a de vrais gens (souvent des bénévoles de notre association) qui arrivent pour discuter avec vous !</p>

<p>Votre "ticket" a reçu l'identifiant <b>[Demande perso pour Luc #31185]</b>.<br>
Veuillez inclure cet identifiant : <b>[Demande perso pour Luc #31185]</b>
dans le sujet de tout futur message relatif à ce sujet.</p>

<p>Il n'y a pas besoin de répondre à ce message pour l'instant.</p>

<p>Merci,<br/>
rt+luc@framasoft.org</p>

<hr/>
<pre style="white-space: pre-wrap; font-family: monospace;">test
</pre>
------------=_1564066005-24293-3--

The autoreply is correctly encoded in DB (when I select it, it prints without encoding errors).

Does anybody have an idea on how to fix that, please? I tried for hours, but found nothing. It’s driving me nuts.

Regards,