Analyse des emails entrants

Analyse des emails entrants - PHP - Programmation

Marsh Posté le 25-02-2010 à 10:22:23    

Bonjour,
 
Je viens vous consulter aujourd'hui pour un problème :
 
Il y a une adresse e-mail (toto@toto.fr) qui provient d'OVH et qui entre directement dans deux boites e-mails différentes. Jusque là, facile.
Mon soucis c'est que j'aimerais pouvoir capter le contenu des e-mails entrant afin d'effectuer un tri et ensuite les faire parvenir aux deux destinataires.
J'avais pensé mettre en place une redirection automatique de toto vers tata et ensuite renvoyé vers toto mais toto ne recevrait jamais les e-mails...
Je précise également que les deux personnes qui reçoivent toto actuellement doivent pouvoir répondre aux e-mails avec l'adresse toto@toto.fr OBLIGATOIREMENT.
 
Auriez vous des pistes de solutions, idéalement avec du PHP ?
 
Merci d'avance.

Reply

Marsh Posté le 25-02-2010 à 10:22:23   

Reply

Marsh Posté le 04-03-2010 à 21:57:46    

a mon avis pas faisable avec php... ce qu'il te faut c'est vérifier à la réception du courriel, s'il correspond a ce que tu recherche.
 
Je serais dans ton cas plus tenté de faire un petit script en bash qui pourrait peut etre se glisser en callback à la réception d'un mail, ou bien faire un cron, mais après ca ne me semble pas très propre...

Reply

Marsh Posté le 05-03-2010 à 09:48:06    

Normalement, si c'est possible, il suffit d'activer la lib imap pour PHP. Après, PHP se connecte au contenu de la boîte mail et analyse le contenu des mails qui l'intéresse (filtrage par des critères de recherche possible).
 
Pour la réponse, pense à mettre une "clause "reply" dans le header du mail envoyé. Tu peux regarder le fichier /Astres/Common/EmailLibrary.php de mon soft Astres (cf ma signature).
 
Et tiens, voici un bout de code fait un peu à l'arrache qui permet d'accéder à une boîte mail en pop3

Code :
  1. <?php
  2. function getmsg($mbox,$mid) {
  3.     // input $mbox = IMAP stream, $mid = message id
  4.     // output all the following:
  5.     global $htmlmsg,$plainmsg,$charset,$attachments;
  6.     // the message may in $htmlmsg, $plainmsg, or both
  7.     $htmlmsg = $plainmsg = $charset = '';
  8.     $attachments = array();
  9.     // HEADER
  10.     $h = imap_header($mbox,$mid);
  11.     // add code here to get date, from, to, cc, subject...
  12.     // BODY
  13.     $s = imap_fetchstructure($mbox,$mid);
  14.     if (!$s->parts)  // not multipart
  15.         getpart($mbox,$mid,$s,0);  // no part-number, so pass 0
  16.     else// multipart: iterate through each part
  17.         foreach ($s->parts as $partno0=>$p)
  18.             getpart($mbox,$mid,$p,$partno0+1);
  19.     }
  20. }
  21. function getpart($mbox,$mid,$p,$partno) {
  22.     // $partno = '1', '2', '2.1', '2.1.3', etc if multipart, 0 if not multipart
  23.     global $htmlmsg,$plainmsg,$charset,$attachments;
  24.     // DECODE DATA
  25.     $data = ($partno)?
  26.         imap_fetchbody($mbox,$mid,$partno):  // multipart
  27.         imap_body($mbox,$mid);  // not multipart
  28.     // Any part may be encoded, even plain text messages, so check everything.
  29.     if ($p->encoding==4)
  30.         $data = quoted_printable_decode($data);
  31.     elseif ($p->encoding==3)
  32.         $data = base64_decode($data);
  33.     // no need to decode 7-bit, 8-bit, or binary
  34.     // PARAMETERS
  35.     // get all parameters, like charset, filenames of attachments, etc.
  36.     $params = array();
  37.     if ($p->parameters)
  38.         foreach ($p->parameters as $x)
  39.             $params[ strtolower( $x->attribute ) ] = $x->value;
  40.     if ($p->dparameters)
  41.         foreach ($p->dparameters as $x)
  42.             $params[ strtolower( $x->attribute ) ] = $x->value;
  43.     // ATTACHMENT
  44.     // Any part with a filename is an attachment,
  45.     // so an attached text file (type 0) is not mistaken as the message.
  46.     if ($params['filename'] || $params['name']) {
  47.         // filename may be given as 'Filename' or 'Name' or both
  48.         $filename = ($params['filename'])? $params['filename'] : $params['name'];
  49.         // filename may be encoded, so see imap_mime_header_decode()
  50.         $attachments[$filename] = $data;  // this is a problem if two files have same name
  51.     }
  52.     // TEXT
  53.     elseif ($p->type==0 && $data) {
  54.         // Messages may be split in different parts because of inline attachments,
  55.         // so append parts together with blank row.
  56.         if (strtolower($p->subtype)=='plain')
  57.             $plainmsg .= trim($data) ."\n\n";
  58.         else
  59.             $htmlmsg .= $data ."<br><br>";
  60.         $charset = $params['charset'];  // assume all parts are same charset
  61.     }
  62.     // EMBEDDED MESSAGE
  63.     // Many bounce notifications embed the original message as type 2,
  64.     // but AOL uses type 1 (multipart), which is not handled here.
  65.     // There are no PHP functions to parse embedded messages,
  66.     // so this just appends the raw source to the main message.
  67.     elseif ($p->type==2 && $data) {
  68.         $plainmsg .= trim($data) ."\n\n";
  69.     }
  70.     // SUBPART RECURSION
  71.     if ($p->parts) {
  72.         foreach ($p->parts as $partno0=>$p2)
  73.             getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1));  // 1.2, 1.2.1, etc.
  74.     }
  75. }
  76. echo "Test IMAP<br />\n";
  77. $mbox = imap_open("{NomServeur:110/pop3}INBOX", "Login", "MotDePasse" );
  78. echo "<h1>en-têtes dans INBOX</h1>\n";
  79. $MC = imap_check($mbox);
  80. // Récupère le sommaire pour tous les messages contenus dans INBOX
  81. $result = imap_fetch_overview($mbox, "1:{$MC->Nmsgs}", 0);
  82. $ArrayMsgFound = imap_search($mbox, "UNSEEN SUBJECT \"[[FOR_ASTRES]]\"" );
  83. if (!empty($ArrayMsgFound))
  84. {
  85.      foreach ($result as $overview) {
  86.          if (in_array($overview->msgno, $ArrayMsgFound))
  87.          {
  88.              echo "---------------------------------------------------------<br />\n";
  89.              $objHeader = imap_headerinfo($mbox, $overview->msgno);
  90.              echo "<b>[From: {$objHeader->fromaddress}] {$objHeader->subject}</b><br />\n";
  91.              getmsg($mbox, $overview->msgno);
  92.            
  93.              if (!empty($htmlmsg))
  94.              {
  95.              }
  96.              elseif (!empty($plainmsg))
  97.              {
  98.                  $plainmsg = strtolower($plainmsg);
  99.                  $iPosStart = strpos($plainmsg, "<planning>" );
  100.                  if ($iPosStart !== FALSE)
  101.                  {
  102.                      $iPosEnd = strpos($plainmsg, "</planning>" );
  103.                      if ($iPosEnd !== FALSE)
  104.                      {
  105.                          $sPlanningXMLData = substr($plainmsg, $iPosStart, $iPosEnd - $iPosStart + strlen("</planning>" ));
  106.                          $sPlanningXMLData = str_replace(array("\r\n" ), array("" ), $sPlanningXMLData);
  107.                          $sPlanningXMLData = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>".$sPlanningXMLData;
  108.                          $dom = new DomDocument;
  109.                          if ($dom->loadXML($sPlanningXMLData))
  110.                          {
  111.                              // On décode le tag <planning>
  112.                              $aXMLPlanning = $dom->getElementsByTagName('planning');
  113.                              $ArrayPlanningToAdd = array();
  114.                              foreach($aXMLPlanning as $CurrentNode)
  115.                              {
  116.                                  foreach($CurrentNode->childNodes as $n => $Node)
  117.                                  {
  118.                                      switch($Node->nodeName)
  119.                                      {
  120.                                          case 'lastname':
  121.                                              $sFirstname = $Node->nodeValue;
  122.                                              break;
  123.                                          case 'firstname':
  124.                                              $sFirstname = $Node->nodeValue;
  125.                                              break;
  126.                                          case 'type':
  127.                                              $ArrayPlanningToAdd["Type"] = $Node->nodeValue;
  128.                                              break;
  129.                                          case 'startdate':
  130.                                              $ArrayPlanningToAdd["StartDate"] = $Node->nodeValue;
  131.                                              break;
  132.                                          case 'description':
  133.                                              $ArrayPlanningToAdd["EndDate"] = $Node->nodeValue;
  134.                                              break;
  135.                                          case 'enddate':
  136.                                              $ArrayPlanningToAdd["Description"] = $Node->nodeValue;
  137.                                              break;
  138.                                      }
  139.                                  }
  140.                                  $ArrayPlanningToAdd["Date"] = date("Y-m-d H:i:s" );
  141.                                  // Récupération des personnes en copie
  142.                                  $ArrayPlanningToAdd["InCopy"] = '';
  143.                                  if (!empty($objHeader->ccaddress))
  144.                                  {
  145.                                      $ArrayPlanningToAdd["InCopy"] = $objHeader->ccaddress;
  146.                                  }
  147.                              }
  148.                              print_r($ArrayPlanningToAdd);
  149.                              unset($dom);
  150.                          }
  151.                      }
  152.                  }
  153.              }
  154.          }
  155.      }
  156. }
  157. imap_close($mbox);
  158. ?>


 
Ce bout de code recherche des mails ayant un sujet particulier ("[[FOR_ASTRES]]" ) et récupère un contenu en xml (entre les balises <planning>...</planning> ). Il récupère aussi les personnes mises en copie du mail.
 
@+


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed