Bonjour à tous, je sais pas si je suis dans le bon forum, si jamais n'hésitez pas à me le faire savoir.
Je viens vers vous car je suis occupés de créer une classe imap afin de me construire mon webmail de gmail, en passant par de l'ajax
Ma méthode :
j'appel une page PHP en ajax, qui est parfaitement affiché dont voici la source de cette page :
avec ça j’obtiens bien les la liste des message (par défaut de la boîte de réception), j'encode le retour en utf8 puisque je passe par ajax pour l'affiché sinon mes caractère sépciaux se transforme en caractère bizar, et je décode le paramètre post pour récupérer le nom du dossier ciblé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 // Inclusion de la classe include("RnImapGeneric.class.php"); $f = (isset($_POST['f'])) ? utf8_decode($_POST['f']) : 'INBOX'; $box = new RnImapGeneric('imap.gmail.com:993/imap/ssl','monMail@gmail.com','********'); $box->connect($f); $nbTotal = $box->getCountMessages(); $msgs = $box->listMessages(); $box->disconnect(); $h = '<table border="0" cellpadding="0" cellspacing="0" style="line-height:25px;">' . ' <tr>' . ' <th style="width:20px;border-left: 1px solid #999;padding: 2px;background: #ccc;border-top: 1px solid #eee;border-bottom: 1px solid #999;text-decoration:none;color:#000;"><input type="checkbox" name="selectAll" id="selectAll" value="0" /></th>' . ' <th style="text-align:left;width:200px;padding: 2px;background: #ccc;border-top: 1px solid #eee;border-bottom: 1px solid #999;text-decoration:none;color:#000;">Expéditeur</th>' . ' <th style="text-align:left;padding: 2px;background: #ccc;border-top: 1px solid #eee;border-bottom: 1px solid #999;text-decoration:none;color:#000;">Sujet</th>' . ' <th style="border-right: 1px solid #999;width:115px;padding: 2px;background: #ccc;border-top: 1px solid #eee;border-bottom: 1px solid #999;text-decoration:none;color:#000;">Date</th>' . ' </tr>'; foreach($msgs as $k => $tab){ $from = (strlen($tab['from']) > 25) ? substr($tab['from'],0,25)."..." : $tab['from']; $sujet = (strlen($tab['subject']) > 120) ? substr($tab['subject'],0,120)."..." : $tab['subject']; $bold = ($tab['etat'] == 0) ? "bold" : "normal"; $h .= ' <tr style="font-weight:'.$bold.';">' . ' <td style="text-align:center;border-left: 1px solid #999;"><input type="checkbox" name="select_'.$k.'" id="select_'.$k.'" value="0" /></td>' . ' <td style="padding-left:2px;">'.$from.'</td>' . ' <td style="padding-right:25px;padding-left:2px;">'.$sujet.'</td>' . ' <td style="text-align:center;border-right: 1px solid #999;">'.$tab['date'].'</td>' . ' </tr>'; } $h .= '</table>'; echo utf8_encode($h);
Mon problème est le suivant :
Voici l'exemple de lien posant problème
Dans mon fichier appelé je decode bien le paramètre post et c'est la que ca pose souciCode:
1
2 <a class="getBox" title="[Gmail]/Messages envoyés" href="#">Messages envoyés</a>
voici ma fonction ajax (avec jQuery)
le paramètre f contient : [Gmail]/Messages envoyésCode:
1
2
3
4
5
6
7
8
9
10
11 $(".getBox").click(function(){ var divLoad = $('<div class="loader" id="loader"><img src="images/loading.gif" alt="Chargement" /><span>Chargement...</span></div>'); $(document.body).append(divLoad); $.ajax({ type : 'POST', url : 'msgBoxList.ajx.php', data : 'f='+$(this).attr('title'), success : function(h){ $("#msgBox").html(h); $("#loader").remove(); } }); });
d'ou le décode de l'utf8 afin d'obtenir [Gmail]/Messages envoyés
Voici ma classe en développement (biensûr y'a de l'optimisation à faire des chose peut-être inutile etc...), c'est la première fois que je traite le sujet imap
On peut constater que le seul moment ou j'utilise le décodage utf7 dans la classe c'est sur le nom des dossiers afin de récupérer mes accents (é au lieu de &AQ-s)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 <?php class RnImapGeneric{ private $box = false; private $prm = array('HOST' => false, 'USER' => false, 'PWD' => false); public $dir = array('Boîte de réception' => false, 'Messages envoyés' => false, 'Corbeille' => false, 'Brouillons' => false, 'Spam' => false, 'Important' => false, 'Suivis' => false, 'Tous les messages' => false); private $notFolder = array('INBOX','[Gmail]','Trash'); public function __construct($h=false,$u=false,$p=false){ if($h != false){ $this->prm['HOST'] = $h; } if($u != false){ $this->prm['USER'] = $u; } if($p != false){ $this->prm['PWD'] = $p; } } public function connect($f=false){ $fold = ($f != false) ? $f : ''; $this->box = imap_open("{".$this->prm['HOST']."}".$fold, $this->prm['USER'], $this->prm['PWD']); } public function disconnect(){ imap_close($this->box); } public function getCountMessages(){ return intval(imap_num_msg($this->box)); } public function getBoxDirectory(){ return imap_list($this->box, "{imap.gmail.com:993/imap/ssl}", "*"); } public function directoryToArr(){ $d = $this->getBoxDirectory(); foreach($d as $k => $nm){ $nm = str_replace('{imap.gmail.com:993/imap/ssl}','',imap_utf7_decode($nm)); if(preg_match('#/#',$nm)){ $dir = explode('/',$nm); if(!in_array($dir[0],$this->notFolder)) $this->dir[$dir[0]][$dir[1]] = false; } else{ if(!in_array($nm,$this->notFolder)) $this->dir[$nm] = false; } } return $this->dir; } public function replaceRealName($name){ $gmail = array('Messages envoyés', 'Corbeille', 'Brouillons', 'Spam', 'Important', 'Suivis', 'Tous les messages'); if($name == "Boîte de réception"){ return 'INBOX'; } if(in_array($name,$gmail)){ return ('[Gmail]/'.$name); } else{ return $name; } } public function directoryToUl(){ $arr = $this->directoryToArr(); $h = '<ul id="imap_directory">'; foreach($arr as $k => $v){ $msg = $this->countFolderMsg('INBOX'); if(is_array($msg)){ $txt = $msg[0]."/".$msg[1]; } else{ $txr = $msg; } $rName = $this->replaceRealName($k); //$rName = str_replace("&","comercialparse",$rName); $nb = ($k == "Boîte de réception") ? ' <b>('.$msg[1].')</b>' : ''; $t = (!is_array($v)) ? ' title="'.$rName.'"' : ''; $c = (!is_array($v)) ? ' class="getBox"' : ''; $h .= '<li><a href="#"'.$t.$c.'>'.$k.$nb.'</a>'; if(is_array($v)){ $h .= '<ul>'; foreach($v as $k2 => $v2){ $rName2 = $this->replaceRealName($k2); $h .= '<li><a href="#" title="'.$rName2.'" class="getBox">'.$k2.'</a></li>'; } $h .= '</ul>'; } $h .= '</li>'; } $h .= '</ul>'; return $h; } public function countFolderMsg($f){ $status = imap_status($this->box, '{'.$this->prm['HOST'].'}'.$f, SA_ALL); if($status){ return array($status->messages,$status->unseen); } else{ return "imap_status failed: " . imap_last_error() . "\n"; } } public function parseSubject($str){ if(preg_match("#=\?.{0,}\?Q\?#",$str)){ $str=quoted_printable_decode($str); $str=preg_replace("#=\?.{0,}\?[Qq]\?#","",$str); $str=preg_replace("#\?=#","",$str); } if(preg_match("#=\?.{0,}\?[Bb]\?#",$str)){ $arrHead=split("#=\?.{0,}\?[Bb]\?#",$str); while(list($key,$value)=each($arrHead)){ if(preg_match("#\?=#",$value)){ $arrTemp=split("\?=",$value); $arrTemp[0]=base64_decode($arrTemp[0]); $arrHead[$key]=join("",$arrTemp); } } $str=join("",$arrHead); } // Supprime les underscore qui apparaise pour une raison que j'ignore sur certain message $str = str_replace("_"," ",$str); // Supprime les point d'interogation qui apparaisse aussi pour une raison que j'ignoe sur certain message $str = str_replace("?","",$str); return $str; } public function listMessages() { $tb_messages = array(); for($i=1; $i<=imap_num_msg($this->box); $i++) { $msg = array(); $header = imap_headerinfo($this->box, $i); $msg['subject'] = (isset($header->subject)) ? $this->parseSubject($header->subject) : 'Pas de sujet'; $msg['id'] = (isset($header->message_id)) ? $header->message_id : false; if (isset($header->from[0]->personal)) { $personal = $this->parseSubject($header->from[0]->personal); } else { $personal = $this->parseSubject($header->from[0]->mailbox); } $msg['fromMail'] = $header->from[0]->mailbox.'@'.$header->from[0]->host; $msg['from'] = $personal; $msg['etat'] = ($header->Unseen == 'U') ? 0 : 1; $msg['date'] = strftime("%d/%m/%Y %H:%M",$header->udate); $tb_messages[] = $msg; } return(array_reverse($tb_messages,true)); } public function ListMsgBox(){ return imap_headers($this->box); } private function _getMessages($mailsId){ $i = 0; foreach($mailsId as $mailId){ $results[$i] = imap_header($this->box, $mailId); $i++; } return $results; } public function getAllMessages() { $mailsId = imap_search($this->box, 'ALL'); return $this->_getMessages($mailsId); } } ?>
Donc je clic sur mon lien (Meassages envoyés) et là BAM erreur
etCode:Notice: Unknown: IMAP protocol error: Invalid Arguments: Failed to parse UTF7 string (errflg=2) in Unknown on line 0
Au vue de la précision de l'erreur difficile de trouver d'ou viens l'erreur, si ce n'est que ca à un rapport avec l'utf7 que je n'utilise qu'une seul et unique fois pour le décodageCode:Notice: Unknown: Invalid Arguments: Failed to parse UTF7 string (errflg=2) in Unknown on line 0
Donc voilà vous avez toute ma source posant le problème, et j'ai beau tourné le problème dans tous les sens je n'arrive à rien
Si quelqu'un à une idée d'ou pourrait venir le problème et m'aider à le résoudre je l'en remercie d'avance.
PS : Sur les dossiers ne comportant pas d'accent ou autre ca fonctionne parfaitement.
Bien à vous
Splifferwolf