8768 sujets

Développement web côté serveur, CMS

Hello à tous,

J'aimerai faire en sorte qu'à chaque fois qu'un email est adressé à, ou envoyé depuis, une adresse @domain.com, je puisse stocker le contenu de cet email dans une base de donnée.

Le but de la manoeuvre est de pouvoir afficher l'historique des échanges de mails entre un utilisateur donné et support@domain.com. Ceci se placerai dans le cadre d'un espace dédié de support, accessible pour un utilisateur donné avec son email/pass et lui permettant de voir l'historique de ses conversations avec le support.
Les utilisateurs ne sont pas sur @domain.com, ce sont des gens comme vous et moi avec des adresses variées hotmail, wanadoo, free, gmail, etc qui utiliseraient le systeme de domain.com.

Je n'ai aucune idée de comment faire cela. J'imagine qu'il doit y avoir moyen de hooked des scripts sur le serveur mail à chaque mail recu ou envoyé mais je ne sais pas trop par où commencer, ni en quel langage cela est censé s'écrire.

Ou peut-etre que je prends le problème à l'envers et qu'il me serait plus simple de faire des queries depuis le site vers le serveur mail (IMAP ?) pour en récupérer les mails qui m'interessent. Est-ce seulement possible ? Et les mails envoyés sont-ils stockés sur le serveur ?

A terme j'aimerai aussi pouvoir garder les pièces jointes en les uploadant dans un dossier accessible en www, pour pouvoir les consulter en même temps que l'historique.

Je n'y connais pas grand chose en serveurs mails, donc quelques indications de début de piste où chercher seraient appreciées Smiley smile
Modifié par Tymlis (13 Mar 2010 - 19:48)
Je me réponds tout seul, mais je pense que je vais m'orienter vers des taches cron jumelées aux fonctions imap de php pour tenter de synchroniser tout cela.
Je n'ai pas encore essayé cela dit...
Petite remontée pour ceux (celui) que ca interesse.

Ma piste était effectivement bonne.
PHP permet de se connecter à un serveur IMAP, pour peu que vous ayez l'extension qui va bien. A ma connaissance peu d'hébergeurs le propose par défaut, et il vous faudra peut-être vous même compiler et installer votre version de PHP.
Au passage pensez à ajouter l'extension openssl si elle n'y est pas non plus, nécessaire pour se connecter à l'IMAP de Gmail (entre autres).

Ensuite, il suffit de se connecter sur la boite IMAP, de récupérer les messages, de les parser, puis de les resauvegarder dans votre base.
Pour les messages envoyés, par contre, si jamais ils sont envoyés depuis un poste fixe, avec un smtp par exemple, c'est mort, vous ne pourrez pas les récupérer.
Par contre, s'ils sont envoyés depuis un webmail (horde, squirel ou gmail), alors il suffit de se connecter à la bonne mailbox une fois connecté au serveur pour récupérer ces mails, de la même façon que les mails recus.

Bon, après y a tout un tas de problématiques annexes d'encodage, de fichiers attachés, etc mais l'essentiel est là.

Je ne sais pas si cela est dû à PHP ou a IMAP en général mais se connecter au serveur est une tache assez lourde et prends du temps. Ca ne vaut pas le coup de s'y connecter à chaque affichage de la page pour vérifier s'il y a de nouveaux mails, mieux vaut initier une tache cron pour ça. Je pensais à une fréquence de 5-10 minutes, ça doit etre bien.

Voila, je suis en train de coder tout ça, en espérant que celui puisse aider Smiley smile
Salut Tymlis,

J'ai utilisé les connections imap de php plusieurs fois et cela marche très bien, dans mon cas c'était pour un migration de serveur, j'ai du récupérer le contenu de 150 boite mails et les réécrire sur le nouveau serveur afin que les utilisateur ne souffrent aucun inconvénient de la migration.

J'ai été agréablement surpris de réussir l'opération sans perdre un seul mails, même la date et les pièces jointe on été copié a l'identique!

La difficulté c'est de trouver les coordonnées exacte du serveur mail, tu peux essayer le script suivant:

$username = '';
$password = '';

$mailbox = 'mail.tondomaine.com';
  
if($imap = imap_open ("{".$mailbox.":143}INBOX", $src_username,$src_password)){

    echo "{".$mailbox.":143}INBOX";
    
}elseif($imap = imap_open ("{".$mailbox.":110/pop3}INBOX", $src_username,$src_password)){

    echo "{".$mailbox.":110/pop3}INBOX";
    
}elseif($imap = imap_open ("{".$mailbox.":993/imap/ssl}INBOX", $src_username,$src_password)){

    echo "{".$mailbox.":993/imap/ssl}INBOX";
    
}elseif($imap = imap_open ("{".$mailbox.":143/imap/notls}Inbox", $src_username,$src_password)){
  
    echo "{".$mailbox.":143/imap/notls}Inbox";
    
}


Ensuite un fois que tu as trouvé le port et le type de connexion, tu peux récupérer les données de la boite mail de la manière suivante:

$username = '';
$password = '';

$mailbox = '{mail.tondomaine.com:143}INBOX';

$message = '';
  
if($imap = imap_open ($mailbox, $src_username,$src_password)){
  
    $message .= 'Connecting to '.$src_username.' <br />';
    
    $da_no_msgs = imap_num_msg($imap);
    $message .= "Total messages: " . $da_no_msgs . "<br />";

    for ($i=1; $i<=$da_no_msgs; $i++){
        $message .= "reading email number ".$i;
        //$header = imap_fetchheader($imap, $i);
        //$content = imap_body($imap, $i, FT_PEEK);
    }

    imap_close($imap);
    
  
}else{

    $message .= 'Connection failed'.imap_last_error(). "<br />";
    
}
echo $message;


A mon avis la tâche cron toute les 10 minute cela risque de ralentir inutilement ton serveur. Il vaut mieux vérifier l'existence de nouveau mail uniqument quand un utilisateur ou un admin se connecte a l'interface, en mettant un timing. Pourquoi pas en utilisant ajax pour que la connexion IMAP ne ralentisse pas le chargement de l'interface.
Modifié par matmat (07 Jun 2010 - 01:30)
Merci pour le bout de code, mais j'avais déjà codé cette partie en fait ^^
Pour synchroniser (ou copier) des mails d'un server IMAP à un autre, tu peux utiliser imapsync (sous Linux) sinon, j'ai copié une boite mail de plus de 40.000 mails comme ça. C'est long, mais ça marche Smiley smile

Le problème de faire la synchronisation imap/mysql au moment de la consultation de la page c'est que cela va ralentir son affichage (il faut bien quelques secondes pour se connecter).
Je pourrais effectivement mitiger cela avec un timer, tu as raison cela dit.

Mais dans ce cas, une tache cron ne serait-elle pas plus adaptée ? Au moins je suis sur que le script est executé dans son propre thread et donc ne ralentira pas l'affichage des autres pages.
Ça à l'air super imapsync. python, ruby ont beau faire du bruit, il y a pas à dire perl c'est quand même le langage le plus barré qui soit Smiley langue

J'ai eu la même problématique pour récupérer des infos comme les quotas de compte emails ou de compte clients depuis l' API de cpanel/VHM. L'API a un système de cache donc ça facilite un peu, mais si on fait une connexion au serveur VHM pour récupérer les données de 50 comptes cpanel, ça prend un peu de temps. Donc j'ai fait ça avec Ajax et jquery et ça marche très bien.

1. tu charges ton interface
2. tu charge un json de tes derniers mails, tu peux pourquoi pas mettre à jour une bdd locale a ce moment là avec une instruction de cache qui indique au script de lancer la conexion imap uniquement si le cache est périmé.
3. tu affiches les données au client ou à l'admin, si le cache est actif, les messages s'affiche immédiatement, sinon l'utilisateur a un message "chargement de message" quelques secondes

C'est vrai que la tâche cron permettrais plus de réactivité, il n'y aurais aucune attente pour l'utilisateur, mais il faudrait voir quelles ressources sont sollicité toutes les 10 minutes, c'est possible qu'effectivement que ce ne soit pas grand chose.

ba de toute façon ajax ou cron le script et un peu le même donc une fois que tu as codé le truc tu peux toujours essayé les deux.
Modifié par matmat (08 Jun 2010 - 18:15)
Bonjour, je dois faire un truc de ce genre mais cela doit être sauvegarder dans excel.
Je souhaiterais avoir un coup de main la dessus. Donc donnez moi des orientations svp. Je suis un débutant Smiley rolleyes