Décoder des emails (7bit, 8bit...)

Eléphanteau du PHP | 31 Messages

25 janv. 2010, 13:21

Bonjour,

Via la fonction imap_open , je récupère la liste des e-mails sur mon serveur.
=> Pas de soucis.

Ensuite, via imap_search je ne récupère que les derniers messages.
=> Pas de soucis.

Pour chaque message, via imap_headerinfo je récup mes en-tête.
=> Pas de soucis.

Puis, via imap_fetchbody je récupère le corps du message.
=> *accent allemands* PROBLEME !
Les message n'ont jamais le même codage, et en fouillant, je ne trouve nul par l'encodage du message. Comment le connaître ?
Pour certains message, j'arrive à trouve dans l'objet du sujet, un codage (1 fois sur 5) mais même si je l'ai, ill ne corresponds pas forcement au codage du corps du message, et je me retrouve avec les accents encodés : "Ch=E8re Madame,". J'ai essayé un décodage en utf8, passe pas. Avec imap_utf8, ça encode, donc non plus.
Comment savoir si le codage est un utf8, un iso-8859-1 ??

N'y-a-t-il pas une commande "tout_decoder_tous_les_encodages($youpi)" ??

Merci de votre aide, je ne trouve rien sous google ou dans ce forum.
Modifié en dernier par Const le 25 janv. 2010, 13:55, modifié 1 fois.
Const.

Eléphanteau du PHP | 31 Messages

25 janv. 2010, 13:44

Bon, alors j'ai retiré le caca de mes yeux et j'ai trouvé qu'en fait, imap_fetchstructure retourne bien l'encodage.

Au temps pour moi, maintenant, ce que je ne sais pas, c'est comment, en fonction de tel ou tel encodage, le décoder...
En sachant que les valeurs possibles sont :
0 7BIT
1 8BIT
2 BINARY
3 BASE64
4 QUOTED-PRINTABLE
5 OTHER

Le "8bit" est-il l'UTF-8 ? A ce moment là, comment décoder le 7bit ?

Merci à ceux qui ont une réponse !
Const.

Eléphanteau du PHP | 31 Messages

25 janv. 2010, 14:13

Bon, je me réponds à nouveaux à moi-même, que ça serve pour les autres.

=> Morale : il faut toujours chercher plus longtemps avant de poser une question.

La réponse est donc :
avec imap_fetchstructure on récupère la structure de l'email :

Code : Tout sélectionner

$structure = imap_fetchstructure($m_mail, $message_id); $charset = $structure->encoding;
Ensuite, on récupère le message :

Code : Tout sélectionner

$message = imap_fetchbody($m_mail, $message_id, '1');
Puis, en fonction du charset, on applique le bon décodage :

Code : Tout sélectionner

if ($charset == 0) { $message = imap_qprint($message); } elseif ($charset == 1) { $message = $message; } elseif ($charset == 2) { $message = imap_binary($message); } elseif ($charset == 3) { $message = imap_base64($message); } elseif ($charset == 4) { $message = imap_qprint($message); } elseif ($charset == 5) { $message = $message; }
je n'ai pas vérifier tous les encodages, vu que moi je n'ai que deux type d'email pour l'instant : 0 et 1 (7 et 8 bits donc).
Si je vois que ça ne fonctionne pas avec un autre type, je passerai le signaler.

Merci à tous et aussi à moi-même pour ma participation.
Const.

ViPHP
ViPHP | 5462 Messages

25 janv. 2010, 17:34

un switch sur les constantes aurai eté plus joli :wink:
http://www.php.net/manual/fr/imap.constants.php

Eléphanteau du PHP | 31 Messages

13 févr. 2010, 12:57

un switch sur les constantes aurai eté plus joli :wink:
http://www.php.net/manual/fr/imap.constants.php
Pas faux ^^
Const.

gero
Invité n'ayant pas de compte PHPfrance

18 avr. 2014, 12:39

Je t'aime!!! merci!!!! gt