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 :

Envoi d'e-mail [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut Envoi d'e-mail
    Bonjour,

    J'ai créé une classe censée envoyer des mails au format "multipart/alternative" (texte + HTML) :

    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
    class T_Email extends T_Object
    {
     
    	private $headers;
    	private $boundary;
    	private $subject;
    	private $message;
     
    	public function __construct( $subject , $message )
    	{
     
    		parent::__construct( );
     
    		$this->subject = $subject;
     
    		$this->boundary = md5(uniqid(mt_rand()));
     
    		$this->headers = "MIME-Version: 1.0\r\n"
    					   . "Content-Type: multipart/alternative; boundary=\"" . $this->boundary . "\"\r\n";
     
    		$this->message = "--" . $this->boundary . "\r\n"
         				   . "Content-Type: text/plain; charset=\"" . T_Kernel::EMAIL_CHARSET . "\"\r\n"
         				   . "Content-Transfer-Encoding: 8bit\r\n\r\n"
         				   . strip_tags($message) . "\r\n\r\n"
         				   . "--" . $this->boundary . "\r\n"
         				   . "Content-Type: text/html; charset=\"" . T_Kernel::EMAIL_CHARSET . "\"\r\n"
         				   . "Content-Transfer-Encoding: 8bit\r\n\r\n"
         				   . $message . "\r\n\r\n"
         				   . "--" . $this->boundary . "\r\n";
     
    	}
     
    	public function send( $to , $from = null )
    	{
     
    		if ( ! is_null( $from ) )
    		{
    			$this->headers .= "From: " . $from . "\r\n";
    		}
     
    		return mail( $to , $this->subject , $this->message , $this->headers );
     
    	}
     
    }
    Lorsque je lis les mails envoyés, pour certains clients mail (Orange) le message s'affiche bien en HTML mais une pièce jointe est fournie (elle n'a pas de nom et ne contient rien) ! Pour d'autres clients (gmail), il n'y a carrément aucun contenu...

    La valeur de la constante T_Kernel::EMAIL_CHARSET est "utf-8" mais le problème est toujours présent avec d'autres charsets.

    Où est la coquille ? Merci par avance !

  2. #2
    FoxLeRenard
    Invité(e)
    Par défaut
    Bonjour,

    Je le répétes souvent, il ne faut jamais risquer
    de tout tester d'un seul coup

    Je te proposes de tester l'envoie en HTML avec ce PHP dans lequel tu peux mettre un texte en gras, et en couleur, mais ne changes rien a cette structure ... même pas par exemple le FROM :
    Et encore moins les retour chariot indispensables
    Ne t'occupes pas du charset, c'est par default celui qu'il te faut

    Je part du principe que les images sont non encapsulées , ça fait des messages légers, qui partent mieux chez des free et autre aol ...
    donc les images sont comme je te l'écris.


    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
     
     
    <?php
        $Le_Body = "<html><body bgColor=#ffffff >Ton texte avec couleurs etc ..";
        $Le_Body .= "<img src=\"http://www.monsite.com/image/image.jpg\" />";
        $Le_Body .= "</body></html>";
        $Le_Body .= stripslashes($Le_Body);
     
        $CA="durand Jacques";
        $CAmail="durandJ@orange.fr";
        $DE="Le Site Web";
        $DEmail="sitemail@monsite.com";
     
        $X_A = "".$CA." <".$CAmail.">";
     
        $X_De = "MIME-Version: 1.0\r\n";
        $X_De .= "content-type: text/html; charset=iso-8859-1\r\n";   
        $X_De .= "From: ".$DE." <".$DEmail.">";
        $Le_Objet = "Message de TEST\n\n\n";
        mail($X_A, $Le_Objet, $Le_Body, $X_De);
    ?>
    test cela, puis si ça marche partout, alors peut importe ta fonction qui génére l'ordre, il doit respecter cette forme y compris les retours chariots

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    Merci pour ta réponse. J'avais bien sûr testé le fonctionnement de la classe pour des mails text/plain seuls, puis text/html seuls et tout semblait fonctionner.

    Je vais revérifier mes "\r\n"

  4. #4
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    Merci pour ta réponse. J'avais bien sûr testé le fonctionnement de la classe pour des mails text/plain seuls, puis text/html seuls et tout semblait fonctionner.
    Je vais revérifier mes "\r\n"
    Non l'Ami, ta fonction est loin de respecter ce que je te donnes
    par exemple les mines version ... boundary etc ...
    les emplacements des infos inexacts
    et des manque (je sais sois disant pas obligatoir ...)
    FROM : xxxxxxxxxxxxx <mail aroba provider>

    C' est pour cela qu'il faut mettre tout ce qu'il faut mais rien d'autre !

  5. #5
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    Je viens de trouver, dans la RFC 1341 :

    The encapsulation boundary following the last body part is a distinguished delimiter that indicates that no further body parts will follow. Such a delimiter is identical to the previous delimiters, with the addition of two more hyphens at the end of the line.
    Il faut donc ajouter 2 tirets ('-') à la suite de la dernière frontière :

    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
    class T_Email extends T_Object
    {
     
    	private $headers;
    	private $boundary;
    	private $subject;
    	private $message;
     
    	public function __construct( $subject , $message )
    	{
     
    		parent::__construct( );
     
    		$this->subject = "=?" . T_Kernel::EMAIL_CHARSET . "?B?" . base64_encode($subject) . "?=";
     
    		$this->boundary = md5(uniqid(mt_rand()));
     
    		$this->headers = "MIME-Version: 1.0\r\n"
    					   . "Content-Type: multipart/alternative; boundary=\"" . $this->boundary . "\"\r\n";
     
    		$this->message = "MIME-Version: 1.0\r\n"
    			 		   . "Content-Type: multipart/alternative; boundary=\"" . $this->boundary . "\"\r\n\r\n"
    					   . "This is a multi-part message in MIME format.\r\n\r\n"
    					   . "--" . $this->boundary . "\r\n"
    					   . "Content-Type: text/plain; charset=\"" . T_Kernel::EMAIL_CHARSET . "\"\r\n"
    				       . "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
    			 		   . strip_tags($message) . "\r\n\r\n"
    			 		   . "--" . $this->boundary . "\r\n"
    		   	  		   . "Content-Type: text/html; charset=\"" . T_Kernel::EMAIL_CHARSET . "\"\r\n"
    					   . "Content-Transfer-Encoding: quoted-printable\n\n"
    					   . $message . "\r\n\r\n"
    					   . "--" . $this->boundary . "--\r\n";
     
     
    	}
     
    	public function send( $to , $from = null , $replyTo = null )
    	{
     
    		if ( ! is_null( $from ) )
    		{
    			$this->headers .= "From: " . $from . "\r\n";
    		}
     
    		if ( ! is_null( $replyTo ) )
    		{
    			$this->headers .= "Reply-To: " . $replyTo . "\r\n";
    		}
     
    		return mail( $to , $this->subject , $this->message , $this->headers );
     
    	}
     
    }
    Pour l'encodage des entêtes, utiliser le format "=?charset?encodage?resultat?=".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. L'envois de mail ne m'envois pas de mail ...
    Par PrinceMaster77 dans le forum ASP
    Réponses: 10
    Dernier message: 27/10/2004, 16h28
  2. Envois d'un mail Avec CDont
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/10/2004, 17h34
  3. [TIdSMTP] Envoi d'un mail avec authentification ?
    Par BACUS dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/06/2004, 16h18
  4. Envoi d'un mail automatiquement
    Par batmat86 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/06/2004, 09h20
  5. Envoi d'un mail en VBA: outlook ne se lance pas
    Par Hannibal dans le forum VBA Access
    Réponses: 4
    Dernier message: 01/06/2003, 15h24

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