IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Déclencher un script à l'arrivée d'un mail


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Points : 69
    Points
    69
    Par défaut Déclencher un script à l'arrivée d'un mail
    Bonjour,

    Je m'occupe du site de mon club de plongée.
    Apparemment, il serait possible de déclencher un script php lorsqu'un mail est envoyé à une adresse donnée.
    Je m'explique.
    Si un mail est envoyé à l'adresse adherents@toto.fr, il faudrait lire une base des adhérents et leur renvoyer le mail.
    Ceci éviterait à notre secrétaire de se taper le mail à renvoyer pour tout le monde.

    Mais, comment faire ?

    Merci pour vos idées, votre aide.

    Bonne journée,

    Eddy

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    PHP te permet d'utiliser le protocole IMAP pour accéder à une boite mail.

    Si tu as les droits sur cette boite , tu peux donc tout à fait faire un script qui va chercher les nouveau courrier dans la boite de réception.

    Il faudra par contre créer un cron (tache planifiée) pour que ton script se lance régulièrement pour vérifier la boite. Il n'existe en général pas de webhook sur les boites mail permettant d'appeler directement un script à la réception d'un mail.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Merci pour tes infos.

    j'avance.
    Seulement, est-il possible de forwarder un mail comme ci je le faisait de mon logiciel de messagerie sir mon PC ?

    Je lit le corps du mail, du coup, les images ne s'affiche pas.

  4. #4
    Membre du Club
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Points : 69
    Points
    69
    Par défaut
    de plus, sił y a des pieces jointes, il faudrait qu'elles le soient également

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Je l'ai jamais fait mais j'imagine que ca revient à récupérer le contenu du mail via imap_body et de le retransférer à une autre adresse via imap_mail.

    il y'aura surement des entêtes à reconstruire aussi mais dans l'idée c'est comme ca que je procèderais
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Points : 69
    Points
    69
    Par défaut
    c'est sur cette piste que je suis parti, mais le texte est brut. J'aimerai le récupérer au format html

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    La notion d'html ou non se décide à mon avis dans les entête du mail en définissant un mime type approprié.

    Si le mail que tu reçois à les balises html affichées comme du texte c'est que le client mail ne sait pas qu'il doit parser le contenu.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Points : 69
    Points
    69
    Par défaut
    Bon, j'avance petit à petit.

    Je me suis fait une classe (copié à partir de ce que j'ai trouvé sur le net)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
     
    <?php
    class MailAttachmentManager
    {
    	/**
    	* @var string {host:port\params}BOX voir http://fr.php.net/imap_open
    	*/
    	private $host;
     
    	/**
    	* @var string login
    	*/
    	private $login;
     
    	/**
    	* @var string password
    	*/
    	private $password;
     
    	/**
    	* @var string répertoire de sauvegarde
    	*/
    	private $saveDirPath;
     
    	/**
    	* @var object boite mail
    	*/
    	private $mbox;
     
    	/**
    	* Constructeur
    	* @param string $host {host:port\params}BOX voir http://fr.php.net/imap_open
    	* @param string $login
    	* @param string $password
    	* @param string $saveDirPath chemin de sauvegarde des pièces jointes
    	*/
    	//public function __construct($host, $login, $password, $saveDirPath = './')
    	public function __construct($host, $login, $password, $saveDirPath) {
    		$this->host = $host;
    		$this->login = $login;
    		$this->password = $password;
    		$this->saveDirPath = $savedirpath = substr($saveDirPath, -1) == "/" ? $saveDirPath : $saveDirPath."/";
    	}
    	/**
    	* Décode le contenu du message
    	* @param string $message message
    	* @param integer $coding type de contenu
    	* @return message décodé
    	**/
    	private function getDecodeValue($message, $coding) {
    		switch ($coding) {
    		  case 0: //text
    		  case 1: //multipart
    			$message = imap_8bit($message);
    			break;
    		  case 2: //message
    			$message = imap_binary($message);
    			break;
    		  case 3: //application
    		  case 5: //image
    		  case 6: //video
    		  case 7: //other
    			$message = imap_base64($message);
    			break;
    		  case 4: //audio
    			$message = imap_qprint($message);
    			break;
    		}
     
    		return $message;
    	}
     
    	/**
    	* Ouvrir la boîte mail
    	*/
    	public function openMailBox() {
    		$mbox = imap_open($this->host, $this->login, $this->password);
    		if (!$mbox) {
    		  throw new Exception("can't connect: ".imap_last_error());
    		}
     
    		$this->mbox = $mbox;
    	}
     
    	/**
    	* Ferme la boite mail en cours
    	*/
    	public function closeMailBox() {
    		imap_close($this->mbox);
    	}
     
    	/**
    	* Récupère les parties d'un message
    	* @param object $structure structure du message
    	* @return object|boolean parties du message|false en cas d'erreur
    	*/
    	public function getParts($structure) {
    		return isset($structure->parts) ? $structure->parts : false;
    	}
     
    	/**
    	* Tableau définissant la pièce jointe
    	* @param object $part partie du message
    	* @return object|boolean définition du message|false en cas d'erreur
    	*/
    	public function getDParameters($part) {
    		return $part->ifdparameters ? $part->dparameters : false;
    	}
     
    	/**
    	* Récupère les pièces d'un mail donné
    	* @param integer $jk numéro du mail
    	* @return array type, filename, pos
    	*/
    	public function getAttachments($jk) {
    		echo "<br>Dans la classe.getAttachments($jk)";
    		$structure = imap_fetchstructure($this->mbox, $jk);
    		$parts = $this->getParts($structure);
    		$fpos = 2;
    		$attachments = array();
     
    		if ($parts && count($parts)) {
    		  for ($i = 1; $i < count($parts); $i++) {
    			$part = $parts[$i];
     
    			if ($part->ifdisposition && strtolower($part->disposition) == "attachment") {
    			  $ext=$part->subtype;
    			  $params = $this->getDParameters($part);
     
    			  if ($params) {
    				$filename = $part->dparameters[0]->value;
    				$filename = imap_utf8($filename);
    				$attachments[] = array('type' => $part->type, 'filename' => $filename, 'pos' => $fpos);
    			  }
    			}
    			$fpos++;
    		  }
    		}
     
    		return $attachments;
    	}
     
    	/**
    	* Retourne la référence de l'hôte sans la boite mail
    	* @return string {host:port\params} voir http://fr.php.net/imap_open
    	*/
    	public function getRef() {
    		preg_match('#^{[^}]*}#', $this->host, $ref);
    		return $ref[0];
    	}
     
    	/**
    	* Retourne la liste des boites mail associées a celle ouverte
    	* @param string $pattern motif de recherche
    	* @return array liste des boites mail
    	*/
    	public function getList($pattern = '*') {
    		return imap_list($this->mbox, $this->getRef(), $pattern);
    	}
     
    	/**
    	* Récupère la contenu de la pièce jointe par rapport a sa position dans un mail donné
    	* @param integer $jk numéro du mail
    	* @param integer $fpos position de la pièce jointe
    	* @param integer $type type de la pièce jointe
    	* @return mixed data
    	*/
    	public function getFileData($jk, $fpos, $type) {
    		$mege = imap_fetchbody($this->mbox, $jk, $fpos);
    		$data = $this->getDecodeValue($mege,$type);
     
    		return $data;
    	}
     
    	/**
    	* Sauvegarde de la pièce jointe dans le dossier défini avec un nom unique
    	* @param string $filename nom du fichier
    	* @param mixed $data contenu à sauvegarder
    	* @return string emplacement du fichier
    	**/
    	public function saveAttachment($filename, $data) {
    		$filepath = $this->saveDirPath.$filename;
    		$tmp = explode('.', $filename);
    		$ext = array_pop($tmp);
    		$filename = implode('.', $tmp);
    		$i=1;
     
    		while (file_exists($filepath)) {
    		  $filepath = $this->saveDirPath.$filename.$i.'.'.$ext;
    		  $i++;
    		}
     
    		$fp = fopen($filepath, 'w');
    		fputs($fp, $data);
    		fclose($fp);
     
    		return $filepath;
    	}
     
    	/**
    	* Tag un message avec le flag delete
    	* @param integer $jk numéro du message
    	**/
    	public function tagDeleteMessage($jk) {
    		imap_delete($this->mbox, $jk);
    	}
     
    	/**
    	* Supprime les messages tagués avec le flag delete
    	**/
    	public function deleteTaggedMessages() {
    		imap_expunge($this->mbox);
    	}
     
    	/**
    	* Retourne la boite mail
    	* @return object boite mail
    	*/
    	public function getMbox() {
    		return $this->mbox;
    	}
     
    	/**
    	* Retourne le destinataire du message
    	* @param integer $id numéro du mail
    	* @return string mail
    	*/
    	public function getMessageTo($id) {
    		$header = imap_fetchheader($this->mbox, $id);
    		$header = imap_rfc822_parse_headers($header);
    		return $header->to[0]->mailbox.'@'.$header->to[0]->host;
    	}
     
    	/**
    	* Retourne l'emmetteur du message
    	* @param integer $id numéro du mail
    	* @return string mail
    	*/
    	public function getMessageFrom($id) {
    		$header = imap_fetchheader($this->mbox, $id);
    		$header = imap_rfc822_parse_headers($header);
    		return $header->from[0]->mailbox.'@'.$header->from[0]->host;
    	}
     
    	/**
    	* Retourne la date du message
    	* @param integer $id numéro du mail
    	* @return string mail
    	*/
    	public function getMessageDate($id) {
    		$header = imap_fetchheader($this->mbox, $id);
    		$header = imap_rfc822_parse_headers($header);
    		return $header->date;
    	}
     
    	/**
    	* Retourne le sujet du message
    	* @param integer $id numéro du mail
    	* @return string mail
    	*/
    	public function getMessageSubject($id) {
    		$header = imap_fetchheader($this->mbox, $id);
    		$header = imap_rfc822_parse_headers($header);
    		return $header->subject;
    	}
     
    	/**
    	* Retourne le nombre de message dans la boite mail
    	* @param integer $id numéro du mail
    	* @return string mail
    	*/
    	public function getNbMessage() {
    		return imap_num_msg($this->mbox); 
    	}
     
    	/**
    	* Retourne le message le message 
    	*/
    	public function getLastMail($nombreMessage) {
    		return imap_body($this->mbox, $nombreMessage);
    	}
     
    }
    ?>
    voici mon code pour lire les mails :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?php 
    header('Content-Type: text/html; charset=utf-8');
    ?>
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    		<link rel='stylesheet' type='text/css' href='css/style.css' />
    	</head>
    	<body>
    <h1>Script de consultation de boite mails</h1>
    <?php 
     
    require_once '../../fonctions/fonctions_generales.php';
    require_once '../../fonctions/Connect_Base.php';
    require_once '../../fonctions/fonctions_mail.php';
    require_once '../../classes/class_Mails_box_Adherents.php';
     
    require_once '../../classes/class_licencies.php';
    $Class_Licencies = new licencies($GLOBALS['bdd']);
     
    function ReplaceImap($txt)
    {
        $carimap = array("=C3=A9", "=C3=A8", "=C3=AA", "=C3=AB", "=C3=A7", "=C3=80", "=20"   , "=C3=A0", "=C3=89", "=E2=80=99", "=9C", "=C2=AB", "=C2=BB", "=C3=BC", "=C3=BB", "=C3=B4", "=", "3D", "E280A6");
        $carhtml = array("é"     , "è"     , "ê"     , "ë"     , "ç"     , "à"     , "&nbsp;", "à"     , "É"     , "'"        , "oe" , "«"     , "»"     , "ü"     , "û"     , "ô"     , "" , "=" , "...");
        $txt = str_replace($carimap, $carhtml, $txt);
     
        return $txt;
    }
     
     
    $host = '{imap.online.net:143}INBOX';
    $login = 'adherents@scf.asso.fr';
    $password = 'Adherents74';
    $savedirpath="../../mail_script_attachments/" ; // attachement will save in same directory where scripts run othrwise give abs path
    $jk=new MailAttachmentManager($host, $login, $password, $savedirpath); // Creating instance of class####
    		echo "<br>ici 1";
     
    /*recupération Email*/
    $tab=array();
    $jk->openMailBox();
    $last;
    $nombreMessage = $jk->getNbMessage();
    echo "<br>Nb de messages : $nombreMessage";
    echo "<br>De : " . $jk->getMessageTo($nombreMessage);
    echo "<br>From : " . $jk->getMessageFrom($nombreMessage);
    echo "<br>Date : " . $jk->getMessageDate($nombreMessage);
    $Sujet = $jk->getMessageSubject($nombreMessage);
    $Sujet = ReplaceImap($Sujet);
    $Sujet = imap_utf8($Sujet);
    echo "<br>Sujet : $Sujet";
     
    //echo "<br>Dernier mail : " . $last;
    $last=$jk->getLastMail($nombreMessage);
    $LeMail = ReplaceImap($last);
    $LeMail = imap_utf8($LeMail);
    echo "<br>Mail : $LeMail";
     
    $tab=$jk->getAttachments($nombreMessage);
    echo "<br>Tab : "; print_r($tab);
    //$jk->saveAttachment($tab[0]['filename'],$jk->getFileData($last,$tab[0]['pos'],$tab[0]['type']));   
    $jk->closeMailBox();
     
    ?>
    	</body>
    </html>
    le pb est que :
    1. je n'arrive pas à récupérer la pièce jointe
    2. la pièce qui est un PDF s'affiche dans le corps du mail

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    Pour se genre d'opération, il est mieux de passer par le serveur mail. Tu créé par exemple une liste de diffusion et tu fais en sorte que le mail soit renvoyé sur cette liste.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Membre du Club
    Homme Profil pro
    Cobol sur Mainframe et Unix AIX
    Inscrit en
    Mars 2012
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cobol sur Mainframe et Unix AIX

    Informations forums :
    Inscription : Mars 2012
    Messages : 196
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Pour se genre d'opération, il est mieux de passer par le serveur mail. Tu créé par exemple une liste de diffusion et tu fais en sorte que le mail soit renvoyé sur cette liste.
    oui, mais ceci oblige avec une liste de destinataires statiques. Or, ma liste de destinataires peut être dynamique.

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    Si tu créé une liste de diffusion, tu dois pouvoir la modifier par un script, mais là ça ne sera pas du PHP (ça reste possible, mais PHP n'est pas le langage le plus adapté pour faire du système).

    C'est plus lourd de le faire en PHP mais peut-être plus dans ton périmètre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. [Newsletter] Cherche un script d'envoi d'e-mails massif
    Par heteroclite dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 09/02/2007, 07h21
  2. [OutLook] Détecter l'arrivée d'un mail
    Par pc75 dans le forum Outlook
    Réponses: 5
    Dernier message: 22/01/2007, 10h48
  3. [Mail] Script de réception d'e-mail
    Par mejri dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2007, 11h24
  4. [Mail] Spammé par un script PHP d'envoi de mails
    Par Dia_FR dans le forum Langage
    Réponses: 5
    Dernier message: 13/09/2006, 21h57
  5. Réponses: 2
    Dernier message: 19/02/2006, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo