En complément des réponses d'Olivier, [...]
... et je vais compléter de nouveau ta réponse, parfois en contradiction
avec ce que tu écris (et avec ce qu'écrit Erwan juste après).
Je vais peut-être enfoncer des portes ouvertes, mais tant qu'à faire,
autant essayer d'expliquer au mieux.
Elles sont indispensables à l'identification et à la propagation.
Path: ,Date: ,From: ,MIME-Version: ,Newsgroups: ,Subject: ,
Content-Type: ,Content-Transfer-Encoding: ,etc., en font partie.
(note l'espace obligatoire après le « : », valable aussi pour les
en-têtes facultatives)
Je précise que MIME-Version, Content-Type et Content-Transfer-Encoding
sont une triade inséparable. Si le corps de l'article est tout entier
du texte brut en US-ASCII 7 bits, alors on peut les omettre tous les
trois. Sinon, tous les trois sont obligatoires.
Je me souviens par exemple d'un article qui avait un Content-Type et
un Content-Transfer-Encoding tout à fait corrects, ce qui satisfaisait
pleinement mon SeaMonkey. Mais quelqu'un était venu demander sur fu8
pourquoi ça ne fonctionnait pas dans son nouvelleur exotique, et on
a trouvé que c'était parce qu'il manquait MIME-Version.
Note : une seule version est définie pour ce champ, à savoir 1.0.
Bien que non définies dans les RFC, elles donnent un certain nombre
d'indications supplémentaires, à titre d'information pour les lecteurs
X-No-Archive: , X-Face: , X-Trace: , X-Complaints-To: , etc.
Certains entêtes ont été définis depuis, par exemple Archive (censé
remplacer X-No-Archive), Injection-Date et Injection-Info (pour faire
en gros la même chose que X-Trace), etc.
Tout ceci est défini dans le RFC 5536 [1], qu'on attendait depuis des
années (novembre 2009, soit vingt-deux ans après le RFC 1036 daté de
décembre 1987).
Alors c'est très simple, il n'y en a pas. Généralement, le Path: vient
en premier, mais après, on ne sait pas. Tout ce que demande la RFC,
c'est que l'ensemble des champs indispensables soient présents, ce qui a
une importance particulière pour le champ Subject: .
Il est aussi demandé pour la plupart des entêtes qu'ils ne soient pas
présents plus d'une fois. Cf. RFC 5536 [1].
C'est systématiquement de l'ASCII 7 bits, sauf, parfois, pour le
Subject: .
Formellement, c'est systématiquement de l'ASCII 7 bits, sans exception.
Pour y mettre des caractères non ASCII, c'est possible, mais en les
encodant selon le RFC 2047 [2].
Le flou qui règne à ce propos vient du fait que le RFC 2047 a été rédigé
en 1996 comme un complément du RFC 822 (ancètre du RFC 5322 [3]) qui ne
concerne que le mail, et qu'il a fallu attendre encore treize ans avant
que le RFC 5536 ne confirme que oui, bien sûr, cela s'appliquait aussi
aux news.
Du coup, sur usenet-fr où le besoin de caractères accentués était criant
dans les champs From et Subject, et où ISO-8859-1 était le seul standard
en dehors de US-ASCII (je parle de bien avant UTF-8), il a été dit que
la seule façon correcte de faire était de mettre de l'ISO-8859-1 non
déclaré et non codé dans les champs d'entête.
Quoi qu'il en soit, le RFC 5322 ne laisse plus aucun doute aujourd'hui :
<cit.>
o The character set for header fields is US-ASCII. Where the use of
non-ASCII characters is required, they MUST be encoded using the
MIME mechanisms defined in [RFC2047] and [RFC2231].
</cit.>
C'est le seul champ d'en-tête dans lequel on peut trouver des caractères
non ASCII 7bits (caractères accentués par exemple). Lors du transport,
ils peuvent soit être encodés (en QP par exemple), soit pas.
Donc non. D'une part on peut les trouver dans d'autres champs comme
le champ From par exemple (tu pourrais t'appeler Éric et non pas Eric)
mais surtout ils *doivent* (MUST) être encodés.
Content-Type: text/plain; charset=ISO-8859-15;
Content-Transfer-Encoding: 8bit
Rappel : si ces deux lignes sont présentes, alors il faut forcément la
troisième aussi.
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit
Mime-Version: 1.0
Il y a des chances que le Subject « ça va pas la tête ? » circule tel
quel.
Cela arrive encore, mais c'est une erreur.
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On risque de se trouver avec un Subject: encodé en QP.
Note aussi que l'on peut très bien trouver un body en QP et des entêtes
en Base64, ou l'inverse, et en fait n'importe quelle combinaison. Il
est même possible d'avoir dans un même champ d'entête une partie en
UTF-8/Base64 et une autre en ISO-8859-1/QP (par exemple).
Au passage, j'en profite pour rappeler (ou apprendre) à Julien qu'il
convient d'éviter le quoted-printable pour le body, contrairement à ce
que fait Google groupes.
- d'une part, le Content-Type: et le Content-Transfer-Encoding: sont
censés s'appliquer à l'encodage du CORPS du message, pas au
Subject : ;
- d'autre part, on ne peut pas être certain que le Subject: soit défini
APRÈS le Content-Type: et le Content-Transfer-Encoding: .
Tout à fait exact. D'autant plus que, comme tu le rappelais, les entêtes
peuvent être dans n'importe quel ordre sans que cela ne change leur
signification. Et les entêtes MIME que sont MIME-Version, Content-Type
et Content-Transfer-Encoding ne portent que sur l'encodage du body, pas
sur les autres entêtes.
Corollaire : il faut laisser le champ Subject: tranquille, sans chercher
à l'encoder ou le décoder, juste se contenter de vérifier que ta
fonction PHP ne le transformera pas en gloubiboulga.
Pas d'accord. En lecture il faut le décoder s'il est encodé en MIME, et
en écriture il faut l'encoder s'il contient autre chose que de l'ASCII.
C'est le lociciel client qui se chargera le cas échéant de le décoder si
nécessaire (cas d'un encodage en QP par exemple). Sur ce point, tu me
répondras que le logiciel client, c'est l'interface de ton navigateur,
et tu n'auras pas tort.
Ah, tu ne parlais pas du logiciel client. Oui, du coup je suis d'accord
avec ton paragraphe précédent : il faut laisser tranquilles tous les
entêtes que l'on n'a pas besoin d'interpréter.
Mais ce qui est valable en réception l'est aussi en envoi. Si ta
passerelle doit injecter des articles sur le réseau NNTP, elle doit
impérativement respecter les conventions de transport et d'encodage, si
Content-Type: text/plain; charset=ISO-8859-15;
Content-Transfer-Encoding: 8bit
sans oublier MIME-Version: 1.0 (comment ? je l'ai déjà dit ?)
et en le respectant dans le corps du message, sans quoi tes articles
risquent de s'avérer illisibles avec mon logiciel, par exemple.
Oui.
Tout ceci est incomplet, mais c'est juste pour pointer la complexité de
ce à quoi tu t'attaques, et l'absolue nécessité d'avoir une parfaite
compréhension de tous ces points si tu veux éviter d'aller dans le mur.
J'ai d'ailleurs probablement raconté des bétises ou commis des
inexactitudes, corrections et compléments bienvenus de la part de ceux
qui savent mieux que moi.
Je ne m'en suis pas privé. ;-)
Cordialement,
--
Olivier Miakinen
[1] RFC 5536, Netnews Article Format
<http://tools.ietf.org/html/rfc5536>
[2] RFC 2047, MIME #3 : Message Header Extensions for Non-ASCII Text
<http://tools.ietf.org/html/rfc2047>
[3] RFC 5322, Internet Message Format
<http://tools.ietf.org/html/rfc5322>