6.Le langage PHP

6.20.Créer un webmail avec IMAP

6.20.1.Introduction

La bibliothèque IMAP de PHP permet d'accéder à un compte mail POP ou IMAP ainsi que les comptes news NNTP.
Dans ce tutorial, nous apprendrons à faire un mini-webmail pour accéder à un compte POP via une interface web. Comme d'habitude cela se fera en plusieurs étapes afin de détailler chacune d'entre elles.

6.20.2.Installation

Tout d'abord vous devez vous assurer d'avoir installé le module imap[comment?].

6.20.3.La connexion

Pour pouvoir accéder à un compte quel qu'il soit, il faut d'abord se connecter. Cela necessite de connaître quelques informations sur le serveur.
<?php
  $boiteMail = 'mail.toutestfacile.com';
  $port = 110;
  $login = 'monlogin';
  $motDePasse = 'motdepasse';

  $mbox = imap_open('{'.$boiteMail.':'.$port.'/pop3}', $login, $motDePasse);
  if (FALSE === $mbox) {
      die('La connexion a échoué. Vérifiez vos paramètres!');
  }
  imap_close($mbox);
?>
Si aucun message d'erreur n'apparaît alors la connexion est bien effectuée.
rem
  • Vous devez remplacer la valeur de $boiteMail (ici mail.toutestfacile.com) par le serveur de mail que vous voulez lire.
  • 110 est le numéro de port. A moins d'avoir un serveur de mail farfelu, vous n'aurez pas à changer cette valeur pour un compte POP. Pour un compte IMAP le port usuel est 143 et 119 pour un compte NNTP.
  • Si vous ne voulez pas vous connecter à un compte POP, Vous devez remplacer /pop3 par /nntp ou l'effacer pour un compte IMAP
  • $login est bien entendu à remplacer par votre login d'accés au compte
  • $motDePasse est bien entendu à remplacer par votre mot de passe
Si vous avez réussi à vous connecter, vous avez passé l'étape la plus difficile !

6.20.4.Aperçu du contenu d'une boîte mail

Ce que l'on va faire maintenant c'est simplement récupérer les informations les plus élémentaires sur la boite mail. A savoir: le nombre de mails reçus et le nombre de mails récents.
<?php
  $boiteMail = 'mail.toutestfacile.com';
  $port = 110;
  $login = 'monlogin';
  $motDePasse = 'motdepasse';

  $mbox = imap_open('{'.$boiteMail.':'.$port.'/pop3}', $login, $motDePasse);
  if (FALSE === $mbox) {
      $info = FALSE;
      $err = 'La connexion a échoué. Vérifiez vos paramètres!';
  } else {
      $info = imap_check($mbox);
      imap_close($mbox);
  }

  if (FALSE === $info) {
      echo $err;
  } else {
      echo 'La boite aux lettres contient '.$info->Nmsgs.' message(s) dont '.
                                            $info->Recent.' recent(s)';
  }
?>

6.20.5.Lister le contenu d'une boîte aux lettres électronique

Maintenant que nous connaissons le nombre de mails dans la boite nous allons les lister.
<?php
  $boiteMail = 'mail.toutestfacile.com';
  $port = 110;
  $login = 'monlogin';
  $motDePasse = 'motdepasse';

  $mbox = imap_open('{'.$boiteMail.':'.$port.'/pop3}', $login, $motDePasse);
  $mails = FALSE;
  if (FALSE === $mbox) {
      $err = 'La connexion a échoué. Vérifiez vos paramètres!';
  } else {
      $info = imap_check($mbox);
      if (FALSE !== $info) {
          $nbMessages = min(50, $info->Nmsgs);
          $mails = imap_fetch_overview($mbox, '1:'.$nbMessages, 0);
      } else {
          $err = 'Impossible de lire le contenu de la boite mail';
      }
      imap_close($mbox);
  }

  if (FALSE === $mails) {
      echo $err;
  } else {
      echo 'La boite aux lettres contient '.$info->Nmsgs.' message(s) dont '.
                                            $info->Recent.' recent(s)'.
           "<br />\n".
           "<br />\n";
      foreach ($mails as $mail) {
          echo $mail->from.' '.$mail->subject.' '.$mail->date."<br />\n";
      }
  }
?>
rem
  • Une fois la connexion à la boite aux lettres établie, il est possible de récupérer les informations sur les mails qu'elle contient grâce à la fonction imap_fetch_overview. A cette fonction, il faut indiquer l'index du premier mail que l'on souhaite "consulter" (dans notre exemple nous commençons avec le premier, d'index 1) suivi de ':' (lorsque l'on souhaite définir un interval) puis l'index du dernier mail (nous avons choisi de retourner au maximum 50 mails).
  • La fonction retourne alors un tableau indexé[c'est quoi?] d'objets[c'est quoi?] contenant, entre autres, les attributs from: expéditeur, to: destinataire, subject: objet, etc.).
Nous voilà capable d'afficher un résumé du contenu du dossier INBOX d'une boîte aux lettres électronique! Ce qui serait bien maintenant c'est de pouvoir cliquer sur un des entêtes et d'ouvrir le message correspondant. C'est ce que nous allons voir maintenant.

6.20.6.Visualiser le contenu d'un mail

Il va falloir modifier le script précédent afin d'ajouter un lien vers un script chargé d'ouvrir le courrier.
<?php
  $boiteMail = 'mail.toutestfacile.com';
  $port = 110;
  $login = 'monlogin';
  $motDePasse = 'motdepasse';

  $mbox = imap_open('{'.$boiteMail.':'.$port.'/pop3}', $login, $motDePasse);
  $mails = FALSE;
  if (FALSE === $mbox) {
      $err = 'La connexion a échoué. Vérifiez vos paramètres!';
  } else {
      $info = imap_check($mbox);
      if (FALSE !== $info) {
          $nbMessages = min(50, $info->Nmsgs);
          $mails = imap_fetch_overview($mbox, '1:'.$nbMessages, 0);
      } else {
          $err = 'Impossible de lire le contenu de la boite mail';
      }
      imap_close($mbox);
  }

  if (FALSE === $mails) {
      echo $err;
  } else {
      echo 'La boite aux lettres contient '.$info->Nmsgs.' message(s) dont '.
                                            $info->Recent.' recent(s)'.
           "<br />\n".
           "<br />\n";
      foreach ($mails as $mail) {
          echo $mail->from.
               ' <a href="imap_detail.php?uid='.$mail->uid.'">'.
               $mail->subject.'</a> '.
               $mail->date."<br />\n";
      }
  }
?>
rem
  • On a juste ajouté la balise <<a href ...> pour passer en paramètre l'UID du mail à lire.
Ci-dessous, c'est le contenu du fichier chargé d'ouvrir le courrier.
<?php
  $boiteMail = 'mail.toutestfacile.com';
  $port = 110;
  $login = 'monlogin';
  $motDePasse = 'motdepasse';

  $mbox = imap_open('{'.$boiteMail.':'.$port.'/pop3}', $login, $motDePasse);
  if (FALSE === $mbox) {
      die('La connexion a échoué. Vérifiez vos paramètres!');
  } else {
      $uid = $_GET['uid'];
      $headerText = imap_fetchHeader($mbox, $uid, FT_UID);
      $header = imap_rfc822_parse_headers($headerText);

      // REM: Attention s'il y a plusieurs sections
      $corps = imap_fetchbody($mbox, $uid, 1, FT_UID);
  }
  imap_close($mbox);
?>
<html>
<head><title>Exemple IMAP</title></head>
<body>
<?php
  $from=$header->from;
  echo "Message de:".$from[0]->personal." [".$from[0]->mailbox."@".$from[0]->host."]<br>";
  echo $corps;
?>
</body>
</html>

6.20.7.Conclusion

Ceci vous donne une idée de comment fonctionne les outils de webmail. Vous pouvez utiliser cette bibliothèque pour faire des choses hors du commun. Par exemple au lieu d'ajouter des nouvelles (news) dans une base de données, vous pourriez utiliser un compte POP et lorsque vous voulez ajouter une nouvelle vous n'auriez qu'à envoyer un mail.
Ici vous pouvez apprendre :
Version imprimable: imprimer