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 :

[PHP 8.0] Fonction mail() et utilisation de templates


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 14
    Points
    14
    Par défaut [PHP 8.0] Fonction mail() et utilisation de templates
    Bonjour à tous,

    Je viens vers vous suite à une erreur plutôt particulière dans l'un de mes scripts, et dont je ne parviens pas à identifier la source.

    J'ai créé une classe d'envoi d'email permettant l'utilisation de fichiers de templates. Ceux-ci comprennent le code HTML à envoyer avec des éléments personnalisables qui sont substitués par les données d'un tableau au moment de l'envoi.

    Le problème est le suivant: en l'état, mon template comprend la css (locale donc) dans une balise style qui sera envoyée dans le mail. Je constate que, dans ce bloc, la ligne 28 est vide:

    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    			.container {
    				background-color: white;
    				border: 2px grey solid;
    				border-radius: 10px;
    				margin-top: 20px;
    				padding: 30px;
    			}
    /*----------------------------------- ligne 28 qui est vide dans mon fichier -----------------------------------*/
    			.footer {
    				text-align:center;
    				padding-top: 10px;
    				padding: 10px 30px 30px ;
    			}
    .

    En l'état, l'envoi du mail fonctionne. Si je supprime la ligne vide, ca ne fonctionne plus. Si je remet manuellement une ligne, ça ne fonctionne pas non plus. Je n'ai que le "Ctrl-Z" qui restaure le fonctionnement.

    Extrait de la fonction d'envoi

    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
    		// Génération du boundary aléatoire
    		$boundary = md5(rand());
     
    		//Définition des headers
    		$headers[] = 'From: Webmaster '.$params['site_title'].' <'.$params['email_webmaster'].'>';
     
    		if(isset($reply_to) && strlen($reply_to) > 0){
    			$headers[] = 'Reply-To: '.$reply_to;
    		}
     
        	$headers[] = 'MIME-Version: 1.0';
        	$headers[] = 'Content-type: multipart/mixed; boundary='.$boundary.' ';
        	$headers[] = 'Content-Transfer-Encoding: 7bit';
     
        	// Assemblage des headers
     		$this->mail_headers = implode("\r\n", $headers);
     
    		//Ajout au sujet
    		$this->subject = $subject;
     
    		//Application du template
    		$mail_content[] = '--'.$boundary;
    		$mail_content[] = 'Content-type: text/html; charset=utf-8';
    		$mail_content[] = 'Content-Transfer-Encoding: quoted-printable';
    		$this->mail_msg =  $this->getFromTemplate($template, $substitute);
    		$mail_content[] = $this->mail_msg;
     
    		// S'il y a une PJ
    		if(!is_null($enclosed) && strlen($enclosed) > 0){
        		$mail_content[] = '--'.$boundary;
        		$mail_content[] = $enclosed;
    		}
     
        	$mail_content[] = "--".$boundary."--";
     
        	// Assemblage du contenu du message
    		$str_mail_content = implode("\r\n", $mail_content);
    		$str_mail_content = wordwrap($str_mail_content, 70,"\r\n");
     
    		//Envoi du mail
        	$result = mail($to, $this->subject, $str_mail_content, $this->mail_headers);
     
        	return $result;
    Ce n'est pas banal comme erreur, et j'avoue ne plus avoir d'idée.

    En bonus: 2ème problème lorsque l'envoi du mail fonctionne bien (avec la ligne blanche donc), je reçois bien un message, mais au format texte avec une partie de la CSS qui se retrouve dans le corps du message.Et la césure se fait justement au niveau de la ligne 28...
    Nom : mail.jpg
Affichages : 114
Taille : 132,9 Ko

    Merci de votre aide :-)

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par Asaiel Voir le message
    Si je supprime la ligne vide, ca ne fonctionne plus.
    qu'est ce qui ne fonctionne plus ? quel est le message d'erreur et le débugage ?

    pour le 2e souci, vous avez peut-être une erreur de format.
    pour des e-mails avec des formats complexes, je conseille souvent d'utiliser la bibliothèque phpmailer qui existe depuis plusieurs années et est très populaire :
    https://github.com/PHPMailer/PHPMailer

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup pour la réponse :-)

    Ce qui ne fonctionne plus, c'est que mon appel à la fonction d'envoi du message me renvoi un false, indiquant que le message ne peut pas être envoyé. Je n'ai pas d'autre message d'erreur.
    Je voulais accéder aux logs de ssmtp (je crois que c'est ce qu'utilise php pour l'envoi de message) afin de trouver des informations sur le problème, mais je n'ai pas trouvé. Je suis sur un Nas Synology DS420 si cela peut aider.

    Concernant le second problème, je vais regarder phpMailer, mais j'aurais aimé comprendre mon erreur, et si possible ne pas intégrer de classe externe supplémentaire.

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut
    Bonjour,

    Je vois que l'email est considéré comme un texte et pas HTML, si vous voulez envoyer toute une page HTML, il faudrait donc garder la structure d'une page HTML
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <!DOCTYPE html><html><head></head><body></body></html>

    Les entêtes ont été définie comme ça
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $headers  = 'MIME-Version: 1.0' . "\n".
    	'Content-type: text/html; charset=utf8mb4' . "\n".
    	'Reply-to: <someemail@gmail.com>' . "\n" .
    	'From: NomDeDomaine<someemail1@gmail.com>' . "\n".
    	"X-Mailer: PHP/" . phpversion() . "\n";

    Je me rappel que j'avais le même problème avec mail et je l'ai corrigé en complétant le message d'email.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 14
    Points
    14
    Par défaut
    Bonjour @Toufik83, et merci pour votre message.

    Je viens de vérifier mon message en affichant le "contenu brut" depuis l'application mail, et ce qui est transmis en tant que contenu du message est bien du code 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
    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
    --351e95cb334ededf5b6ecb4fcefb726d
    Content-type: text/html; charset=utf-8
    Content-Transfer-Encoding: quoted-printable
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>XXX</title>
    		<!-- css -->
    		<style>		
    			html
    {
    				background-color: #56baed;
    				font-size: 90%;
    			}			
    			body
    {
    				font-family: "Poppins", sans-serif;
    			}		
    			a {
    				color:
    #92badd;
    				display:inline-block;
    				text-decoration:
    none;
    				font-weight: 400; 
    			}			
    			.container
    {
    				background-color: white;
    				border: 2px grey
    solid;
    				border-radius: 10px;
    				margin-top: 20px;
    				padding:
    30px;
    			}
     
    			.footer {
    				text-align:center;
    				padding-top:
    10px;
    				padding: 10px 30px 30px ;
    			}			
    			.container,
    .footer{
    				width: 80%;
    				margin-left: auto;
    				margin-right:
    auto;
    			}			
    			div.email #logo {
    				width: auto;
    				height:
    auto;
    				display: block;
    				margin: auto;
    			}
    			div.msg
    {
    				border: 1px grey solid;
    				padding: 5px
    15px;
    				border-radius: 5px;
    				background-color:
    lightyellow;
    			}						
    			p.title {
    				text-transform:
    uppercase;
    				font-weight:
    bold;
    			}		
    		</style>
    	</head>
    	<body>
    	<div class="container
    email">
    		<img
    src="XXX"
    alt="Logo" id="logo" />
    		<p>Bonjour,</p>
    		<p>
    		XXX a
    envoyé un message via le formulaire de contact du site XXX:
    		</p>
     
    		<div class="msg">
    			<p class="title">
    				Test
    4
    			</p>
    			<p>
    			Test 4
    			</p>
    		</div>
     
    		<br/>
    		<p>
    		Vous
    pouvez envoyer un message Ã* cet utilisateur en utilisant le bouton
    répondre directement depuis votre messagerie.
    		</p>
    		<p>
    		Bien
    cordialement,
    		</p>
    		<p>
    		L'équipe du site XXX.
    		</p>
    	</div>
        <div class="footer">
        © XXX
    2023 - Reproduction partielle ou totale interdite
     
    </div>
    	</body>
    </html>
    --351e95cb334ededf5b6ecb4fcefb726d--
    Les headers semblent également bien formés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Received: by XXX (sSMTP sendmail emulation); Sun, 18 Feb 2024 17:31:21 +0100
    Date: Sun, 18 Feb 2024 17:31:21 +0100
    To: XXX@XXX.fr
    Subject: Demande de contact
    From: Webmaster XXX <XXX@XXX.fr>
    Reply-To: XXX@XXX.com
    MIME-Version: 1.0
    Content-type: multipart/mixed; boundary=351e95cb334ededf5b6ecb4fcefb726d 
    Content-Transfer-Encoding: 7bit
    X-Spam-Flag: NO
    Et les headers juste après le boundary concerné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    --351e95cb334ededf5b6ecb4fcefb726d
    Content-type: text/html; charset=utf-8
    Content-Transfer-Encoding: quoted-printable

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 14
    Points
    14
    Par défaut Résolu
    Bon, je crois avoir trouvé la solution, je la partage donc pour que d'autres personnes puissent éventuellement en profiter.

    D'après mes essais, le problème se trouve ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    --351e95cb334ededf5b6ecb4fcefb726d
    Content-type: text/html; charset=utf-8
    Content-Transfer-Encoding: quoted-printable
    <!DOCTYPE html>
    <html>
    	<head>
    Dans la structure du message, il est nécessaire d'avoir une ligne ("\r\n") entre les headers et le début du HTML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    --351e95cb334ededf5b6ecb4fcefb726d
    Content-type: text/html; charset=utf-8
    Content-Transfer-Encoding: quoted-printable
    -- ligne blanche nécessaire --
    <!DOCTYPE html>
    <html>
    	<head>
    Et depuis, ca fonctionne. Sujet résolu, merci aux participants de ce sujet!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/12/2008, 09h32
  2. [Mail] utilisation de la fonction mail en php
    Par chti_juanito dans le forum Langage
    Réponses: 4
    Dernier message: 03/05/2008, 10h57
  3. configurer php.ini pour fonction mail
    Par michka999 dans le forum Apache
    Réponses: 4
    Dernier message: 06/09/2006, 14h13
  4. [Mail] php et la fonction mail
    Par kagura dans le forum Langage
    Réponses: 1
    Dernier message: 01/09/2006, 19h30
  5. [Forum] PHP et la fonction mail()
    Par lolo_the_fripouille dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 13/07/2006, 21h09

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