OVH Cloud OVH Cloud

Script pour d=c3=a9coder les ent=c3=aates MIME

57 réponses
Avatar
Olivier Miakinen
Salut !

J'ai fait un script pour décoder les entêtes MIME selon le RFC 2047.
Je l'ai appelé decode2047 et je le joins à la fin de cet article.

Tests :

> om@kentia:~$ decode2047 "=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un_=5f_en_quoted-printab?= =?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?="
> Ceci est une tentative d'encoder un _ en quoted-printable (was: Hé etc.)
> om@kentia:~$ decode2047 "=?UTF-8?Q?Ceci_est_une_tentative_d'encoder_un_=5f_en_quoted-printab?= HELLO =?UTF-8?B?bGUgKHdhczogSMOpIGV0Yy4p?="
> Ceci est une tentative d'encoder un _ en quoted-printab HELLO le (was: Hé etc.)

Merci d'essayer pour voir si ça fonctionne aussi sur Mac (il faut les
commandes qprint et base64).

========================================================================
#!/bin/bash
# Script pour décoder un entête MIME

#
# Cette fonction vérifie que le paramètre est bien un encoded-word,
# puis elle le décode et le traduit en UTF-8.
#
# Si tout est OK, le résultat est dans $RESULT et la fonction retourne 0.
# Sinon, la fonction retourne 1.
#
decode_word()
{
# Un encoded-word doit être tout seul
if [ "$#" != "1" ]; then return 1; fi

# On vérifie que le paramètre est bien sous la forme :
# =?<charset>?<encoding>?<encoded>?=
# avec :
# <charset> : lettres, chiffres, underscores ou tirets
# <encoding> : B ou Q en majuscule ou minuscule
# <encoded> : ASCII imprimable sans espace ni point d'interrogation
if [ $(LANG=C expr "$1" : '=?[A-Za-z0-9_-]\+?[BbQq]?[!->@-~]\+?=$') = 0 ]
then
return 1;
fi

charset=$(printf "$1" | cut -f 2 -d '?')
encoding=$(printf "$1" | cut -f 3 -d '?')
encoded=$(printf "$1" | cut -f 4 -d '?')

case $encoding in
B | b)
decoded=$(printf "$encoded" | base64 -d 2>/dev/null)
if [ $? != 0 ]; then return 1; fi
;;
Q | q)
decoded=$(printf "$encoded" | tr "_" " " | qprint -d 2>/dev/null)
if [ $? != 0 ]; then return 1; fi
;;
*)
# Shouldn't occur
return 1
;;
esac

RESULT=$(printf "$decoded" | iconv -f $charset -t UTF-8)
return 0
}

FINAL_RESULT=""
PREV_RETCODE=

for word in $*
do
if decode_word "$word"
then
CURR_RETCODE=0
else
CURR_RETCODE=1
RESULT="$word"
fi

case "$PREV_RETCODE" in
0 )
# Previous string was an encoded-word.
# Add a space only if currect string is not.
if [ "$CURR_RETCODE" = "1" ]
then
RESULT=" ${RESULT}"
fi
;;
1 )
# Previous string was not an encoded-word.
# Always add a space.
RESULT=" ${RESULT}"
;;
* )
# There is no previous string.
# Never add a space.
;;
esac
PREV_RETCODE="$CURR_RETCODE"

FINAL_RESULT="${FINAL_RESULT}${RESULT}"
done

echo "$FINAL_RESULT"
========================================================================

Cordialement,
--
Olivier Miakinen

7 réponses

2 3 4 5 6
Avatar
Olivier Miakinen
Le 16/10/2019 16:14, M.V. a écrit :
Ainsi parlait Olivier Miakinen le 15 octobre 2019 :
Eh bien voilà, nous sommes au moins trois.

;-)
D'autres questions me viennent : hormis les champs "Subject:",
"From:", "Reply to:" et "Organization:", j'espère ne pas me tromper
en disant qu'aucun autre champ ne peut être encodé ?

Il faudrait regarder en détail. Déjà il y a aussi les champs To: et Cc:
qui sont surtout utilisés pour le courriel. En regardant rapidement la
norme, j'ai vu que ce sont tous les endroits dans les entêtes où le
contenu est défini par la syntaxe « *text ». En particulier dans les
commentaires, qui peuvent se trouver sauf erreur dans à peu près
tous les entêtes.
Note : mon tout dernier script ne gère pas correctement le cas où un
encoded-word est dans un commentaire.
Et tout ces champs peuvent comporter plusieurs lignes ? Il n'y a pas
de restrictions ?

Je crois qu'à pratiquement n'importe quel endroit dans un entête où il
peut y avoir une espace ou une tabulation, on peut insérer un saut de
ligne juste avant cette espace ou tabulation. À vérifier.
--
Olivier Miakinen
Avatar
M.V.
C'est toujours un plaisir de lire Olivier Miakinen qui nous a
gratifié, le 17 octobre 2019, des propos suivants :
Il faudrait regarder en détail.

Merci pour tes réponses.
Bonne journée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Gilbert OLIVIER
Le 16 octobre 2019, Gilbert OLIVIER a écrit:
Ce que j'ai trouvé et qui était bien interprété par MacSoup et à
priori n'avait pas fait "crier" le serveur, et qui a bien sur créé
quelques problème dans MacCafé avant que je le trouve, c'est: saut de
ligne Tab. Si me je souviens bien, c'était dans le champs références.

Ca y est j'ai retrouvé, c'est dans les données X-Face de Jo Engo ce
qui entrainait un mauvais décriptage et une image un peu étrange.
--
Gilbert
Avatar
M.V.
Olivier Miakinen a suggéré en date du 17 octobre 2019 :
Ah oui, c'est bien ça, la regexp est toute buguée.

Heu… J'en sais rien : je n'ai pas testé ce que propose Joseph-B.
Bonne soirée.
--
Michel VAUQUOIS - http://michelvauquois.fr
Avatar
Olivier Miakinen
Le 17/10/2019 à 18:30, M.V. a écrit :
Ah oui, c'est bien ça, la regexp est toute buguée.

Heu… J'en sais rien : je n'ai pas testé ce que propose Joseph-B.

Je voulais dire que *ma* regexp est toute buguée.
--
Olivier Miakinen
Avatar
josephb
M.V. wrote:
Ça peut, pourquoi pas, mais c'est embêtant (je trouve) de ne plus avoir
(Benoît) avec les parenthèses autour.

tout à fait d'accord
Ça se règle en fait avec AS : <news: qo9unj$bj2$

je me doutais que tu le faisais via Applerscript, mais pour Olivier ce
ne sera pas satisfaisant ;-)
Toutefois, ça peut lui donner une idée avec sed de substitution comme tu
le fais ?
--
J. B.
Avatar
josephb
Olivier Miakinen <om+ wrote:
Comment est-ce possible ??? Ou alors c'est que le « ? » est pris comme
métacaractère ! Du coup la regexp est toute buguée.

Comme je n'ai jamais rien compris (ou cherché à comprendre) des regexp,
ce n'est pas moi qui vais touver où ça part en vrille !
--
J. B.
2 3 4 5 6