| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811 |
- <!-- EN-Revision: 13593 -->
- <sect1 id="zend.mail.read">
- <title>Lire des émail</title>
- <para><classname>Zend_Mail</classname> peut lire des émail provenant de différents stockages locaux ou distants. Tous
- bénéficient de la même API pour compter et extraire les messages, certains implémentent des interfaces
- additionnelles pour des fonctionnalités moins communes. Pour une vue d'ensemble des fonctionnalités des stockages
- implémentés voir la table suivante.</para>
- <table id="zend.mail.read.table-1">
- <title>Vue d'ensemble des fonctionnalités de lecture d'émail</title>
- <tgroup cols="5">
- <thead>
- <row>
- <entry>Fonctionnalité</entry>
- <entry>Mbox</entry>
- <entry>Maildir</entry>
- <entry>Pop3</entry>
- <entry>IMAP</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Type de stockage</entry>
- <entry>local</entry>
- <entry>local</entry>
- <entry>distant</entry>
- <entry>distant</entry>
- </row>
- <row>
- <entry>Extraction des messages</entry>
- <entry>Oui</entry>
- <entry>Oui</entry>
- <entry>Oui</entry>
- <entry>Oui</entry>
- </row>
- <row>
- <entry>Extraction des parties mimes</entry>
- <entry>émulé</entry>
- <entry>émulé</entry>
- <entry>émulé</entry>
- <entry>émulé</entry>
- </row>
- <row>
- <entry>Dossiers</entry>
- <entry>Oui</entry>
- <entry>Oui</entry>
- <entry>Non</entry>
- <entry>Oui</entry>
- </row>
- <row>
- <entry>Créer des messages/dossiers</entry>
- <entry>Non</entry>
- <entry>A faire</entry>
- <entry>Non</entry>
- <entry>A faire</entry>
- </row>
- <row>
- <entry>Flags</entry>
- <entry>Non</entry>
- <entry>Oui</entry>
- <entry>Non</entry>
- <entry>Oui</entry>
- </row>
- <row>
- <entry>Quota</entry>
- <entry>Non</entry>
- <entry>Oui</entry>
- <entry>Non</entry>
- <entry>Non</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <sect2 id="zend.mail.read-example">
- <title>Exemple simple avec Pop3</title>
- <programlisting role="php"><![CDATA[
- $mail = new Zend_Mail_Storage_Pop3(array('host' => 'localhost',
- 'user' => 'test',
- 'password' => 'test'));
- echo $mail->countMessages() . " messages trouvés\n";
- foreach ($mail as $message) {
- echo "Mail from '{$message->from}': {$message->subject}\n";
- }
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.mail.read-open-local">
- <title>Ouvrir un stockage local</title>
- <para>Mbox et Maildir sont les deux formats supportés pour le stockage local des émail, tous les deux dans leurs
- formats le plus simple.</para>
- <para>Si vous voulez lire un fichier Mbox, vous devez juste donner le nom du fichier au constructeur de
- <classname>Zend_Mail_Storage_Mbox</classname>:</para>
- <programlisting role="php"><![CDATA[
- $mail =
- new Zend_Mail_Storage_Mbox(array('filename' => '/home/test/mail/inbox'));
- ]]></programlisting>
- <para>Maildir est très similaire mais nécessite un nom de dossier :</para>
- <programlisting role="php"><![CDATA[
- $mail =
- new Zend_Mail_Storage_Maildir(array('dirname' => '/home/test/mail/'));
- ]]></programlisting>
- <para>Ces deux constructeurs lèvent une exception <classname>Zend_Mail_Exception</classname> si le stockage ne peut pas
- être lu.</para>
- </sect2>
- <sect2 id="zend.mail.read-open-remote">
- <title>Ouvrir un stockage distant</title>
- <para>Pour les stockages distants les deux protocoles les plus populaires sont supportés : Pop3 et Imap. Les
- deux nécessitent au moins un hôte et un utilisateur pour se connecter et s'identifier. Le mot de passe par
- défaut est une chaîne vide et le port par défaut celui donné dans la RFC du protocole.</para>
- <programlisting role="php"><![CDATA[
- // connexion à Pop3
- $mail = new Zend_Mail_Storage_Pop3(array('host' => 'exemple.com'
- 'user' => 'test',
- 'password' => 'test'));
- // connexion à Imap
- $mail = new Zend_Mail_Storage_Imap(array('host' => 'exemple.com'
- 'user' => 'test',
- 'password' => 'test'));
- // exemple à un port non standard
- $mail = new Zend_Mail_Storage_Pop3(array('host' => 'exemple.com',
- 'port' => 1120
- 'user' => 'test',
- 'password' => 'test'));
- ]]></programlisting>
- <para>Pour ces deux stockages SSL et TLS sont supportés. Si vous utilisez SSL le port par défaut change comme
- indiqué dans la RFC.</para>
- <programlisting role="php"><![CDATA[
- // exemples pour Zend_Mail_Storage_Pop3,
- // identique à Zend_Mail_Storage_Imap
- // utiliser SSL avec un port différent
- // (par défaut 995 pour Pop3 et 993 pour Imap)
- $mail = new Zend_Mail_Storage_Pop3(array('host' => 'exemple.com'
- 'user' => 'test',
- 'password' => 'test',
- 'ssl' => 'SSL'));
- // utiliser TLS
- $mail = new Zend_Mail_Storage_Pop3(array('host' => 'exemple.com'
- 'user' => 'test',
- 'password' => 'test',
- 'ssl' => 'TLS'));
- ]]></programlisting>
- <para>Les deux constructeurs peuvent lever une exception <classname>Zend_Mail_Exception</classname> ou
- <classname>Zend_Mail_Protocol_Exception</classname>(étendant <classname>Zend_Mail_Exception</classname>), en fonction du type de
- l'erreur.</para>
- </sect2>
- <sect2 id="zend.mail.read-fetching">
- <title>Extraire des messages et autres méthodes simples</title>
- <para>Dès que vous avez ouvert l'accès, les messages peuvent être extraits. Vous devez fournir un numéro de
- message, qui est un compteur qui démarre à 1 pour le premier message. Pour extraire le message vous utilisez la
- méthode <code>getMessage()</code> :</para>
- <programlisting role="php"><![CDATA[
- $message = $mail->getMessage($numeroDeMessage);
- ]]></programlisting>
- <para>L'accès sous forme de tableau est aussi supporté, mais cet méthode d'accès ne supporte pas les paramètres additionnels qui
- aurait pu être ajouté à <code>getMessage()</code>. Tant que vous n'en n'avez pas besoin et que vous pouvez vivre
- avec les valeurs par défaut, vous pouvez utiliser :</para>
- <programlisting role="php"><![CDATA[
- $message = $mail[$numeroDeMessage];
- ]]></programlisting>
- <para>Pour itérer tous les messages, l'interface <code>Iterator</code> est implémentée :</para>
- <programlisting role="php"><![CDATA[
- foreach ($mail as $numeroDeMessage => $message) {
- // faire qqch ...
- }
- ]]></programlisting>
- <para>Pour compter les messages dans le stockage, vous pouvez soit utiliser la méthode
- <code>countMessages()</code> ou utiliser l'accès de type tableau :</para>
- <programlisting role="php"><![CDATA[
- // par méthode
- $maxMessage = $mail->countMessages();
- // type tableau
- $maxMessage = count($mail);
- ]]></programlisting>
- <para>Pour supprimer un mail vous pouvez utiliser la méthode <code>removeMessage()</code> ou l'accès de type
- tableau :</para>
- <programlisting role="php"><![CDATA[
- // méthode
- $mail->removeMessage($numeroDeMessage);
- // type tableau
- unset($mail[$messageNum]);
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.mail.read-message">
- <title>Travailler avec les messages</title>
- <para>Après avoir extrait les messages avec <code>getMessage()</code> vous voulez extraire les en-têtes, le
- contenu ou une partie d'un message multipart. Tous les en-têtes peuvent être accédés via les propriétés ou la
- méthode <code>getHeader()</code> si vous voulez plus de contrôle ou avoir accès à des en-têtes peu communs. Les
- noms des en-têtes gérés en interne avec une casse minuscule, ainsi la casse du nom de l'en-tête importe peu. En
- outre les en-têtes avec un tiret-bas peuvent être écrit avec la <ulink
- url="http://en.wikipedia.org/wiki/CamelCase">notation Camel</ulink>. Si aucun en-tête n'est trouvé pour les deux
- notations, une exception est levée. Pour éviter ceci, la méthode <code>headerExists()</code> peut être utilisée
- pour vérifier l'existence d'un en-tête.</para>
- <programlisting role="php"><![CDATA[
- // récupérer l'objet message
- $message = $mail->getMessage(1);
- // afficher le sujet du message
- echo $message->subject . "\n";
- // récupérer l'en-tête content-type
- $type = $message->contentType;
- // vérifier si CC est spécifié :
- if( isset($message->cc) ) { // ou $message->headerExists('cc');
- $cc = $message->cc;
- }
- ]]></programlisting>
- <para>Si vous avez plusieurs en-têtes avec le même nom, par exemple les en-têtes "Received", vous pourriez les
- vouloir sous la forme d'un tableau plutôt qu'en tant que chaîne. Ceci est possible avec la méthode
- <code>getHeader()</code>.</para>
- <programlisting role="php"><![CDATA[
- // récupérer l'en-tête comme une propriété - le résultat est toujours
- // une chaîne, avec de nouvelles lignes entre chaque occurence
- // dans le message
- $received = $message->received;
- // la même chose avec la méthode getHeader()
- $received = $message->getHeader('received', 'string');
- // ou mieux un tableau avec une entrée pour chaque occurence
- $received = $message->getHeader('received', 'array');
- foreach ($received as $line) {
- // faire qqch
- }
- // si vous ne définissez pas de format vous récupérerez la représentation
- // interne (chaîne pour en-têtes uniques, tableau pour en-têtes multiples
- $received = $message->getHeader('received');
- if (is_string($received)) {
- // seulement un en-tête received trouvé dans le message
- }
- ]]></programlisting>
- <para>La méthode <code>getHeaders()</code> retourne tous les headers sous forme de tableau avec des clés en
- minuscules et des valeurs en tant que tableau pour des en-têtes multiples ou une chaîne pour des en-têtes
- uniques.</para>
- <programlisting role="php"><![CDATA[
- // récupère tous les en-têtes
- foreach ($message->getHeaders() as $name => $value) {
- if (is_string($value)) {
- echo "$name: $value\n";
- continue;
- }
- foreach ($value as $entry) {
- echo "$name: $entry\n";
- }
- }
- ]]></programlisting>
- <para>Si vous n'avez pas de message de type multipart, extraire le contenu est facilité avec
- <code>getContent()</code>. A la différence des en-têtes, le contenu est seulement extrait en cas de besoin (alias
- late-fetch).</para>
- <programlisting role="php"><![CDATA[
- // affiche le contenu du message
- echo '<pre>';
- echo $message->getContent();
- echo '</pre>';
- ]]></programlisting>
- <para>Vérifier si un message est de type multipart est réalisé avec la méthode <code>isMultipart()</code>. Si
- vous avez un message de type multipart vous pouvez récupérer une instance de <classname>Zend_Mail_Part</classname> avec la
- méthode <code>getPart()</code>. <classname>Zend_Mail_Part</classname> est la classe de base de
- <classname>Zend_Mail_Message</classname>, donc vous avez les mêmes méthodes : <code>getHeader()</code>,
- <code>getHeaders()</code>, <code>getContent()</code>, <code>getPart()</code>, <code>isMultipart</code> et les
- propriétés pour les en-têtes.</para>
- <programlisting role="php"><![CDATA[
- // récupérer la première partie non-multipart
- $part = $message;
- while ($part->isMultipart()) {
- $part = $message->getPart(1);
- }
- echo 'Le type de cette partie est '
- . strtok($part->contentType, ';')
- . "\n";
- echo "Contenu :\n";
- echo $part->getContent();
- ]]></programlisting>
- <para><classname>Zend_Mail_Part</classname> implémente aussi <code>RecursiveIterator</code>, qui rend facile le scan de
- toutes les parties. Et pour un affichage facile, il implémente de plus la méthode magique
- <code>__toString()</code> qui retourne le contenu.</para>
- <programlisting role="php"><![CDATA[
- // affiche la première partie de type text/plain=
- $foundPart = null;
- foreach (new RecursiveIteratorIterator($mail->getMessage(1)) as $part) {
- try {
- if (strtok($part->contentType, ';') == 'text/plain') {
- $foundPart = $part;
- break;
- }
- } catch (Zend_Mail_Exception $e) {
- // ignore
- }
- }
- if (!$foundPart) {
- echo 'Aucune partie "plain text" trouvés';
- } else {
- echo "Partie \"plain text\" : \n" . $foundPart;
- }
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.mail.read-flags">
- <title>Vérifier les drapeaux ("flags")</title>
- <para>Maildir et IMAP supporte l'enregistrement de drapeaux. La classe <classname>Zend_Mail_Storage</classname> possède
- des constantes pour tous les drapeaux maildir et IMAP connus, nommés
- <classname>Zend_Mail_Storage::FLAG_<nomdudrapeau></classname>. Pour vérifier les drapeaux
- <classname>Zend_Mail_Message</classname> possède une méthode <code>hasFlag()</code>. Avec <code>getFlags()</code> vous
- récupérez tous les drapeaux existants.</para>
- <programlisting role="php"><![CDATA[
- // trouvé les messages non lus
- echo "Emails non lus :\n";
- foreach ($mail as $message) {
- if ($message->hasFlag(Zend_Mail_Storage::FLAG_SEEN)) {
- continue;
- }
- // marque les emails récents/nouveaux
- if ($message->hasFlag(Zend_Mail_Storage::FLAG_RECENT)) {
- echo '! ';
- } else {
- echo ' ';
- }
- echo $message->subject . "\n";
- }
- // vérifie les drapeaux connus
- $flags = $message->getFlags();
- echo "Le message est marqué comme : ";
- foreach ($flags as $flag) {
- switch ($flag) {
- case Zend_Mail_Storage::FLAG_ANSWERED:
- echo 'Réponse ';
- break;
- case Zend_Mail_Storage::FLAG_FLAGGED:
- echo 'Marqués ';
- break;
- // ...
- // vérifie d'autres drapeaux
- // ...
- default:
- echo $flag . '(drapeau inconnu) ';
- }
- }
- ]]></programlisting>
- <para>Comme IMAP autorise les drapeaux définis par client ou l'utilisateur, vous pouvez obtenir ces drapeaux
- même s'ils n'ont pas de constante dans <classname>Zend_Mail_Storage</classname>. Au lieu de cela ils sont retournés comme
- une chaîne et peuvent être vérifiés de la même manière avec <code>hasFlag()</code>.</para>
- <programlisting role="php"><![CDATA[
- // Vérifie le message avec les drapeaux $EstUnSpam, $SpamTeste
- if (!$message->hasFlag('$SpamTeste')) {
- echo 'ce message n\'est pas considéré comme un spam';
- } else if ($message->hasFlag('$EstUnSpam')) {
- echo 'ce message est un spam';
- } else {
- echo 'ce message est sûr';
- }
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.mail.read-folders">
- <title>Utiliser les dossiers</title>
- <para>Tous les stockages, excepté Pop3, supportent les dossiers, également appelés boîtes aux lettres.
- L'interface implémentée par tous les stockages supportant les dossiers s'appelle
- <classname>Zend_Mail_Storage_Folder_Interface</classname>. En outre toutes ces classes ont un paramètre facultatif
- additionnel appelé <code>folder</code>, qui est le dossier choisi après ouverture, dans le constructeur.</para>
- <para>Pour les stockages locaux vous devez employer les classes séparées appelées
- <classname>Zend_Mail_Storage_Folder_Mbox</classname> ou <classname>Zend_Mail_Storage_Folder_Maildir</classname>. Tous les deux ont
- besoin d'un paramètre nommé <code>dirname</code> avec le nom du dossier de base. Le format pour le maildir est
- comme définie dans maildir++ (avec un point comme délimiteur par défaut), Mbox est une hiérarchie de dossiers
- avec des fichiers Mbox. Si vous n'avez pas un dossier de Mbox appelé INBOX dans votre dossier de base Mbox vous
- devez placer un autre dossier dans le constructeur.</para>
- <para><classname>Zend_Mail_Storage_Imap</classname> supporte déjà des dossiers par défaut. Exemples pour ouvrir ces
- stockages :</para>
- <programlisting role="php"><![CDATA[
- // mbox avec dossiers
- $mail = new Zend_Mail_Storage_Folder_Mbox(
- array('dirname' => '/home/test/mail/')
- );
- // mbox avec un dossier par défaut nommé INBOX, fontionne aussi
- // avec Zend_Mail_Storage_Folder_Maildir et Zend_Mail_Storage_Imap
- $mail = new Zend_Mail_Storage_Folder_Mbox(
- array('dirname' => '/home/test/mail/', 'folder' => 'Archive')
- );
- // maildir avec dossiers
- $mail = new Zend_Mail_Storage_Folder_Maildir(
- array('dirname' => '/home/test/mail/')
- );
- // maildir avec deux-points comme délimiteur,
- // comme suggéré dans Maildir++
- $mail = new Zend_Mail_Storage_Folder_Maildir(
- array('dirname' => '/home/test/mail/', 'delim' => ':')
- );
- // imap est le même avec ou sans dossier
- $mail = new Zend_Mail_Storage_Imap(array('host' => 'example.com',
- 'user' => 'test',
- 'password' => 'test'));
- ]]></programlisting>
- <para>Avec la méthode <code>getFolders($root = null)</code> vous pouvez obtenir la hiérarchie des dossiers en
- commençant par le dossier racine ou le dossier fourni. Elle est retournée comme instance de
- <classname>Zend_Mail_Storage_Folder</classname>, qui implémente <code>RecursiveIterator</code> et tous ses enfants sont
- également des instances de <classname>Zend_Mail_Storage_Folder</classname>. Chacune de ces instances à des noms locaux et
- globaux retournés par les méthodes <code>getLocalName()</code> et <code>getGlobalName()</code>. Le nom global
- est le nom absolu du dossier racine (délimiteurs y compris), le nom local est le nom dans le dossier
- parent.</para>
- <table id="zend.mail.read-folders.table-1">
- <title>Noms de dossiers</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Nom global</entry>
- <entry>Nom local</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>/INBOX</entry>
- <entry>INBOX</entry>
- </row>
- <row>
- <entry>/Archive/2005</entry>
- <entry>2005</entry>
- </row>
- <row>
- <entry>List.ZF.General</entry>
- <entry>General</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>Si vous employez l'itérateur, la clé de l'élément courant est le nom local. Le nom global est également
- retourné par la méthode magique <code>__toString()</code>. Quelques dossiers peuvent ne pas être
- sélectionnables, ce qui veut dire qu'ils ne peuvent pas stocker des messages et les choisir entraînerait une
- erreur. Ceci peut être vérifié avec la méthode <code>isSelectable()</code>. Ainsi il est très facile de produire
- l'arbre entier dans une vue :</para>
- <programlisting role="php"><![CDATA[
- $folders = new RecursiveIteratorIterator(
- $this->mail->getFolders(),
- RecursiveIteratorIterator::SELF_FIRST
- );
- echo '<select name="folder">';
- foreach ($folders as $localName => $folder) {
- $localName = str_pad('', $folders->getDepth(), '-', STR_PAD_LEFT)
- . $localName;
- echo '<option';
- if (!$folder->isSelectable()) {
- echo ' disabled="disabled"';
- }
- echo ' value="' . htmlspecialchars($folder) . '">'
- . htmlspecialchars($localName) . '</option>';
- }
- echo '</select>';
- ]]></programlisting>
- <para>Les dossiers choisis courants sont retournés par la méthode <code>getSelectedFolder()</code>. Changer de
- dossier est fait avec la méthode <code>selectFolder()</code>, qui a besoin du nom global comme paramètre. Si
- vous voulez éviter d'écrire des délimiteurs vous pouvez également employer les propriétés d'une instance de
- <classname>Zend_Mail_Storage_Folder</classname> :</para>
- <programlisting role="php"><![CDATA[
- // selon votre stockage et ses réglages $rootFolder->Archive->2005
- // est la même chose que :
- // /Archive/2005
- // Archive:2005
- // INBOX.Archive.2005
- // ...
- $folder = $mail->getFolders()->Archive->2005;
- echo 'Le précédent dossier était '
- . $mail->getSelectedFolder()
- . "Le nouveau dossier est $folder\n";
- $mail->selectFolder($folder);
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.mail.read-advanced">
- <title>Utilisation avancée</title>
- <sect3 id="zend.mail.read-advanced.noop">
- <title>Utiliser NOOP</title>
- <para>Si vous employez un stockage distant et avez une longue tâche vous pourriez devoir maintenir la
- connexion persistante par l'intermédiaire du noop :</para>
- <programlisting role="php"><![CDATA[
- foreach ($mail as $message) {
- // faire qqch...
- $mail->noop(); // maintient la connexion
- // faire autre chose...
- $mail->noop(); // maintient la connexion
- }
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.mail.read-advanced.extending">
- <title>Mettre en cache des instances</title>
- <para><classname>Zend_Mail_Storage_Mbox</classname>, <classname>Zend_Mail_Storage_Folder_Mbox</classname>,
- <classname>Zend_Mail_Storage_Maildir</classname> et <classname>Zend_Mail_Storage_Folder_Maildir</classname> implémentant les
- méthodes magiques <code>__sleep()</code> et <code>__wakeup()</code>, ce qui veut dire qu'ils sont
- sérialisable. Ceci évite d'analyser les dossiers ou l'arbre des dossiers plus d'une fois. L'inconvénient est
- que votre stockage de Mbox ou de Maildir ne doit pas changer. Quelques contrôles faciles sont faits, comme
- ré-analyser le dossier courant de Mbox si le temps de modification change ou ré-analysé la structure du
- dossier si un dossier a disparu (ce qui a toujours comme conséquence une erreur, mais vous pouvez rechercher
- un autre dossier après). Il est meilleur si vous avez quelque chose comme un fichier de signal pour des
- changements et la vérifiez avant d'employer l'instance caché.</para>
- <programlisting role="php"><![CDATA[
- // il n'y a pas de gestionnaire spécifique de cache utilisé ici,
- // changer le code pour utiliser votre gestionnaire de cache
- $signal_file = '/home/test/.mail.last_change';
- $mbox_basedir = '/home/test/mail/';
- $cache_id = 'exemple de mail en cache ' . $mbox_basedir . $signal_file;
- $cache = new Your_Cache_Class();
- if (!$cache->isCached($cache_id) ||
- filemtime($signal_file) > $cache->getMTime($cache_id)) {
- $mail = new Zend_Mail_Storage_Folder_Pop3(
- array('dirname' => $mbox_basedir)
- );
- } else {
- $mail = $cache->get($cache_id);
- }
- // faire qqch ...
- $cache->set($cache_id, $mail);
- ]]></programlisting>
- </sect3>
- <sect3>
- <title>Étendre les classes de protocoles</title>
- <para>Les stockages distants utilisent deux classes : <classname>Zend_Mail_Storage_<NOM></classname> et
- <classname>Zend_Mail_Protocol_<NOM></classname>. La classe de protocole traduit les commandes et les réponses de
- protocole et issu de ou pour PHP, comme des méthodes pour les commandes ou les variables avec différentes
- structures pour les données. L'autre/classe principale met en application l'interface commune.</para>
- <para>Si vous avez besoin de fonctionnalités additionnelles de protocole vous pouvez étendre la classe de
- protocole et l'employer dans le constructeur de la classe principale. Supposer par exemple que nous devons
- joindre différents ports avant que nous puissions nous relier à POP3.</para>
- <programlisting role="php"><![CDATA[
- Zend_Loader::loadClass('Zend_Mail_Storage_Pop3');
- class Example_Mail_Exception extends Zend_Mail_Exception
- {}
- class Example_Mail_Protocol_Exception extends Zend_Mail_Protocol_Exception
- {}
- class Example_Mail_Protocol_Pop3_Knock extends Zend_Mail_Protocol_Pop3
- {
- private $host, $port;
- public function __construct($host, $port = null)
- {
- // pas d'auto-connexion dans cette classe
- $this->host = $host;
- $this->port = $port;
- }
- public function knock($port)
- {
- $sock = @fsockopen($this->host, $port);
- if ($sock) {
- fclose($sock);
- }
- }
- public function connect($host = null, $port = null, $ssl = false)
- {
- if ($host === null) {
- $host = $this->host;
- }
- if ($port === null) {
- $port = $this->port;
- }
- parent::connect($host, $port);
- }
- }
- class Example_Mail_Pop3_Knock extends Zend_Mail_Storage_Pop3
- {
- public function __construct(array $params)
- {
- // ... vérifier les $params ici ! ...
- $protocol =
- new Example_Mail_Protocol_Pop3_Knock($params['host']);
- // faire votre fonction "spéciale"
- foreach ((array)$params['knock_ports'] as $port) {
- $protocol->knock($port);
- }
- // récupérer l'état coorect
- $protocol->connect($params['host'], $params['port']);
- $protocol->login($params['user'], $params['password']);
- // initialise le parent
- parent::__construct($protocol);
- }
- }
- $mail = new Example_Mail_Pop3_Knock(
- array('host' => 'localhost',
- 'user' => 'test',
- 'password' => 'test',
- 'knock_ports' => array(1101,
- 1105,
- 1111))
- );
- ]]></programlisting>
- <para>Comme vous voyez nous supposons toujours que nous sommes reliés, identifiés et, si supporté, un
- dossier est choisi dans le constructeur de la classe principale. Ainsi si vous assignez votre propre classe
- de protocole vous devez toujours vous assurer que c'est fait ou la prochaine méthode échouera si le serveur
- ne la permet pas dans l'état actuel.</para>
- </sect3>
- <sect3 id="zend.mail.read-advanced.quota">
- <title>Utilisation des Quotas (avant 1.5)</title>
- <para><classname>Zend_Mail_Storage_Writable_Maildir</classname> supporte les quotas Maildir++. Ceci est désactivé par
- défaut, mais il est possible de l'utiliser manuellement, si la vérification automatique n'est pas souhaitée
- (ce qui veut dire que <code>appendMessage()</code>, <code>removeMessage()</code> et
- <code>copyMessage()</code> ne vérifie pas et n'ajoute pas d'entrée dans le fichier de contrôle de la taille
- du dossier de mails). Si vous l'activez une exception sera levée si vous tentez d'écrire dans le dossier de
- mails et qu'il a déjà atteint son quota.</para>
- <para>Il existe trois méthodes pour les quotas : <code>getQuota()</code>, <code>setQuota()</code> et
- <code>checkQuota()</code>:</para>
- <programlisting role="php"><![CDATA[
- $mail = new Zend_Mail_Storage_Writable_Maildir(
- array('dirname' => '/home/test/mail/')
- );
- $mail->setQuota(true); // true pour activer, false pour désactiver
- echo 'La vérification du quota est maintenant ',
- $mail->getQuota() ? 'active' : 'inactive',
- "\n";
- // la vérification du quota peut être utilisée
- // si celle-ci est désactivée
- echo 'Vous êtes ',
- $mail->checkQuota() ? 'hors quota' : 'dans le quota',
- "\n";
- ]]></programlisting>
- <para><code>checkQuota()</code> peut aussi retournée une réponse plus détaillée :</para>
- <programlisting role="php"><![CDATA[
- $quota = $mail->checkQuota(true);
- echo 'Vous êtes ',
- $quota['over_quota'] ? 'hors quota' : 'dans le quota',
- "\n";
- echo 'Vous avez ',
- $quota['count'],
- ' de ',
- $quota['quota']['count'],
- ' messages et vous utilisez ';
- echo $quota['size'], ' de ', $quota['quota']['size'], ' octets';
- ]]></programlisting>
- <para>Si vous voulez spécifier votre propre quota plutôt que d'utiliser celui spécifié dans le fichier de
- contrôle de la taille du dossier de mails, vous pouvez le faire avec <code>setQuota()</code> :</para>
- <programlisting role="php"><![CDATA[
- // le nombre de messages et la taille en octet sont supportés,
- // l'ordre est important
- $quota = $mail->setQuota(array('size' => 10000, 'count' => 100));
- ]]></programlisting>
- <para>Pour ajouter vos propres vérifications de quota, utilisez des caractères uniques en tant que clé et
- ils seront préservés (mais évidemment non vérifié). Il est aussi possible d'étendre
- <classname>Zend_Mail_Storage_Writable_Maildir</classname> pour définir votre propre quota seulement si le fichier de
- contrôle de la taille du dossier de mails est absent (qui peut se produire dans Maildir++) :</para>
- <programlisting role="php"><![CDATA[
- class Exemple_Mail_Storage_Maildir extends Zend_Mail_Storage_Writable_Maildir {
- // getQuota est appelé avec $fromStorage = true
- // par la vérification de quota
- public function getQuota($fromStorage = false) {
- try {
- return parent::getQuota($fromStorage);
- } catch (Zend_Mail_Storage_Exception $e) {
- if (!$fromStorage) {
- // Erreur inconnue
- throw $e;
- }
- // le fichier de contrôle de la taille du dossier de mails
- // doit être absent
- list($count, $size) = get_un_autre_quota();
- return array('count' => $count, 'size' => $size);
- }
- }
- }
- ]]></programlisting>
- </sect3>
- </sect2>
- </sect1>
|