[Fixed] PHP - Mail() - Gmail

Coucou =)

Me revoila avec un nouveau problème "qu'il est bon d'en avoir un quand on s'ennuit".

Alors je suis sûr que j’dois être complètement Allah Rue par rapport à comment doit être utilisée la fonction mail en PHP mais je l’assume pleinement :stuck_out_tongue:

Que voudrais-je faire ?
Envoyer un mail dont le contenu est en html et proposant donc des liens hypertextes, des images et bref, que du classique :stuck_out_tongue:

Que se passe-t-il ?
Le mail s’affiche correctement sur Hotmail et Yahoo… Mais il est completement fucked sur GMail. En fait c’est simple, il n’interprète pas le $headers comme en étant un… Il ne fait que l’afficher, comme du simple texte. Du coup, tout le mail est affiché comme du texte brut.

La source :

[code]<?
// ------------------------ DESTINATAIRES
$to = « Terenas MSN NGTerenas@hotmail.com ».", « ; // notez la virgule
$to .= « Terenas GMail Terenas@gmail.com ». », « ;
$to .= « Terenas Yahoo NGTerenas@yahoo.fr ». », ";
$to .= « Terenas Free NGTerenas@free.fr »;

// ------------------------ SUBJECT
$subject = « test image »;

// ------------------------ CORPS
$message = "

gni gni !

bla bla <a href="gni.php">gni gni
lalalala li la lo
<img src="http://www.blabla.com/lol.jpg\">

";

// ------------------------ HTML DOCUMENT
$headers = « MIME-Version: 1.0\r\n »;
$headers .= « Content-type: text/html; charset=iso-8859-1\r\n »;

// ------------------------ FROM
$headers .= « From: NaS Script Terenas@netingame.com\r\n »;

// ------------------------ ENVOI DU MAIL
mail($to, $subject, $message, $headers);
?>[/code]

_<
help me ='(

Attention je vais peut-être dire une connerie : Gmail n’accepte pas le html.

S’il ne l’interprête pas, tu es b***é. Ou alors tu écris au (gods)devs de Gmail…

[quote name=‹ Ismar › date=’ 17 Dec 2004, 16:04’]Attention je vais peut-être dire une connerie : Gmail n’accepte pas le html.

S’il ne l’interprête pas, tu es b***é. Ou alors tu écris au (gods)devs de Gmail…
[right][post=« 314109 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Ah oui j’avais oublié de préciser…
En utilisant l’option d’internet explorer « envoyer la page par mail », donc en passant par un client tel Outlook…
Classique quoi… Bah le mail s’affiche sous sa correcte forme !

Donc GMail gère l’html… et le problème vient de la fonction Mail PHP ou de mon script :confused:

Et je préciserais: on a un forum webdev pour ca, mon cher Terenas :P.

Waaaah, on a déplacé le post aussi vite que mon ombre, ou j’ai du caca dans les yeux?

[quote name=’[PERE]Cil’ date=’ 17 Dec 2004, 16:35’]Et je préciserais: on a un forum webdev pour ca, mon cher Terenas :P.
[right][post=« 314119 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Et on est ou la ?
Dans le forum Web Dev… :stuck_out_tongue:
(et ne me dit pas que tu as move le thread, c’est pas vrai :stuck_out_tongue: )

J’ai trouvé la solution au fait :P;
Il semblerait qu’Hotmail et Yahoo interpretent correctement le code “a l’arrache” tandis que Gmail prefere le code “strict”.

Donc il fallait ceci, que je remplis de commentaires pour expliquer, et pour controler que j’ai moi-meme compris :

[code]<?
// genere un nombre aleatoire (utilisé dans le header et “l’encadrement” du message)
srand((double)microtime()*1000000);
$boundary = md5(uniqid(rand()));

// suite de mon en-tete (j’ai retiré le From/Reply-To, etc~)
$header .=“MIME-Version: 1.0\n”;
$header .=“Content-Type: multipart/alternative;boundary=$boundary\n”;

// a placer au tout début du corps du message
$message = “\nThis is a multi-part message in MIME format.”;
$message .="\n–$boundary\nContent-Type: text/html;charset=“iso-8859-1”\n\n";

// a placer a la fin du corps du message
$message .="\n–$boundary–\n end of the multi-part";
?>[/code]

[quote name=‹ Terenas › date=’ 28 Dec 2004, 00:49’]J’ai trouvé la solution au fait :P;
Il semblerait qu’Hotmail et Yahoo interpretent correctement le code « a l’arrache » tandis que Gmail prefere le code « strict ».

Donc il fallait ceci, que je remplis de commentaires pour expliquer, et pour controler que j’ai moi-meme compris :

[code]<?
// genere un nombre aleatoire (utilisé dans le header et « l’encadrement » du message)
srand((double)microtime()*1000000);
$boundary = md5(uniqid(rand()));

// suite de mon en-tete (j’ai retiré le From/Reply-To, etc~)
$header .=« MIME-Version: 1.0\n »;
$header .=« Content-Type: multipart/alternative;boundary=$boundary\n »;

// a placer au tout début du corps du message
$message = « \nThis is a multi-part message in MIME format. »;
$message .="\n–$boundary\nContent-Type: text/html;charset=« iso-8859-1 »\n\n";

// a placer a la fin du corps du message
$message .="\n–$boundary–\n end of the multi-part";
?>[/code]
[right][post=« 316882 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Merci bien, je cherchait justement à faire la meme chose :stuck_out_tongue:
comme quoi google c’est bien, mais la zone aussi :stuck_out_tongue:
( arf tant pis pour les 3 smileys en trois lignes :stuck_out_tongue: )

Blog inside :
j’ai perdu ma page qui marchait bien, et maintenant en reprenant un code ancien j’ai le probleme suivant :
on voit en clair dans le mail les « MIME-Version: 1.0 » et autre « Content-Type: multipart/alternative;boundary »
IMPOSSIBLE de trouver la solution

[code]<?php

$email ="fser512@hotmail.com";
srand((double)microtime()*1000000);
$boundary = md5(uniqid(rand()));

$header =« MIME-Version: 1.0\n »;
$header .=« Content-Type: multipart/alternative;boundary=$boundary\n »;
// text/html j’ai essayer pour eviter d’afficher <a href=« lien …
$header .=« From: Progboards pass_recovery@progboards.com\n »;
// a placer au tout début du corps du message
$message = « \nThis is a multi-part message in MIME format. »;
$message .= »\n–$boundary\nContent-Type: text/html;charset=« iso-8859-1 »\n\n";
$message .=« Bonjour, \nUne demande de changement votre mot de passe a été enreg
istré sur <a href=« http://progboards.com »>progboards \nDemande effectuée par : $info .
Big brother has you.
Si vous êtes bien l’auteur de cette demande, merci de cliquer sur
<a href=« http://code-libre.org/?page=pass_recovery&chaine=$gener »>ce lien
( ou de vous rendre a cette page http://progboards.com/?page=pass_recovery&chaine=$gener ).
Sinon, vous pouvez supprimer ce message. »;
// a placer a la fin du corps du message
$message .="\n–$boundary–\n end of the multi-part";

$sujet=« Votre mot de passe progboards.com »;

mail($email,$sujet,$message,$header);
?>[/code]
j’suis retourné là :stuck_out_tongue:
edit: code

dans ta function mail tu appelles $headers au lieu de $header
;p

MERDE j’ai corrigé le headers dans le nom de variable mais pas dans la fonction
:idiot: :P"
Bon apres encore une ou deux modifs, ça marche :stuck_out_tongue:
merci ^^
( non pas traiter de boulet :stuck_out_tongue: )

Salut,

J’arrive tard, très tard :slight_smile:

Je suis tombé carrément par hasard sur ce post qui m’a beaucoup aidé. Moi aussi j’avais un problème d’envoi avec Gmail qui me retournait un message d’erreur comme quoi le message n’avait pas pu etre transmis.

Maintenant grâce à vous ça marche.

Cependant, je souhaiterais savoir comment faire pour ne pas que le message arrive en spam. Car je fais un test sur mon mail perso en gmail, mais ça arrive en spam.

Quelqu’un a une idée ?

Merci d’avance.

[quote=“Dge06, post:11, topic: 20314”][/quote]

Il faut :

  • envoyer ses emails avec une IP propre (celles de OVH sont régulièrement flagées pour spam)
  • gérer le reverse DNS (champ PTR)
  • configurer le serveur de mail pour que son HELO matche le PTR
  • implémenter le DKIM et le SPF

Bonjour et bonne année,

j’ai aussi un petit problème de mail()

J’envoie mon e-mail depuis un site hébergé sur one and one, sur le messagerie one and one tout se passe bien, j’ai testé sur hotmail çà passe aussi. Par contre sur gmail, il semble ne pas prendre mon header.

J’ai fait le tour de nombreux forum pour voir les solutions existantes mais je dois avoir les yeux qui ne voient plus clairs car je vois pas d’où vient le problème.

Voici mon code et le résultat dans gmail
 

<?php
session_start();
require('fct_espclient.php');//insertion page fonctions

$session_id=$_SESSION['session_id'];
if (!isset($_SESSION['session_id']))
{
    echo "";

}
else
{
$f=connect();

$action_id=$_POST[“action_id”];
$struct_id=$_POST[“struct_id”];

if (isset($_POST[“urgent”]))$urgent=“urgent: “;
else $urgent=””;
$struct_mail=$_POST[“struct_mail”];
$objet=$_POST[“objet”];
$contenu=$_POST[“contenu”];
$struct_nom=$_POST[“struct_nom”];
include(‘menugen.php’);

if (isset($_FILES[‘userfile’]) && is_uploaded_file($_FILES[‘userfile’][‘tmp_name’])or ((isset($_POST[‘doc_id’]))and($_POST[‘doc_id’]!=""))) $HA_supp=“oui”;
else $HA_supp=“non”;
$requete1=mysql_query(“select * from utilisateur,session where (session.session_id=$session_id)and(session.user_id=utilisateur.user_id)”);
while ($row=mysql_fetch_array($requete1))
{
$d=date(“Y-m-d”);

$query = "INSERT INTO heure_action (HA_id,tache_id,HA_date,HA_comment,user_id,HA_supp,comm_id,HA_etat,action_id)
                                VALUES(’’,‘2’,’$d’,"mail à $struct_nom “,’$row[user_id]’,’$HA_supp’,‘1’,‘valide’,’$action_id’);”;
$result = MYSQL_QUERY($query);
$req_sess=“select max(HA_id) k from heure_action”;
                       $result_sess = MYSQL_QUERY($req_sess);
                       while($rsk = mysql_fetch_object($result_sess))
                       {
                               $HA_id=$rsk->k;
                       }
                       mysql_free_result($result_sess);

mysql_query(“insert into message values (’’,”$objet","$contenu",’$HA_id’,‘non’)");
$req_sess=“select max(mess_id) k from message”;
$result_sess = MYSQL_QUERY($req_sess);
while($rsk = mysql_fetch_object($result_sess))
 {
      $mess_id=$rsk->k;
}
mysql_free_result($result_sess);
mysql_query(“insert into mess_struc values (’’,’$mess_id’,’$struct_id’)”);

$suj=$urgent.$objet;
$mail_to ="xxxxxxxxxx@hotmail.com";//Destinataire  
$from_mail = $row[‘user_mail’]; //Expediteur  
$from_name = $row[‘user_mail’]; //Votre nom, ou nom du site  
$reply_to = $row[‘user_mail’]; //Adresse de réponse  
$subject = utf8_decode($suj);
$subject = mb_encode_mimeheader($subject,“UTF-8”);   

$contenuhtml="";

    
// clé aléatoire de limite
srand((double)microtime()*1000000);
$boundary = md5(uniqid(rand()));
// Headers
$entete = “MIME-Version: 1.0 \n”;  
$entete .= “Content-Type: multipart/mixed; boundary=”$boundary" \n";

$entete .= “From: $from_mail \n”;  
$entete .= “Bcc: $from_mail, blain1965@gmail.com \n”;
$entete .= “X-Priority: 1 \n”;  
$entete .= “Content-Transfer-Encoding:8bit \n”;
$entete .= ‘X-Mailer: PHP/’ . phpversion();
$entete .= " \n";  
 
// Message
$message  = “This is a multi-part message in MIME format. \n”;
$message  .= “–$boundary \n”;
$message .= “Content-Type: text/plain; charset=“ISO-8859-1”\n”;
$message .= “Content-Transfer-Encoding: binary\n”;
$message .= $contenu;
$message .= “\n”;
$message  .= “–$boundary \n”;  
$message .= “Content-Type: text/html; charset=“iso-8859-1” \n”;  
$message .= “Content-Transfer-Encoding:binary \n”;  
$message .= “\n”;  
$message .= $contenuhtml;  
$message .= “\n”;  
 
// Pièce jointe
if (isset($_POST[‘doc_id’]))
{
    $requete2=mysql_query(“select doc_nom from document where(doc_id=$_POST[doc_id])”);
    while ($res=mysql_fetch_array($requete2))
    {
        $file_name = $res[‘doc_nom’];
        if (file_exists(".docs/".$file_name))
        {
            $file_type = filetype(".docs/".$file_name);
            $file_size = filesize(".docs/".$file_name);
        
            $content = file_get_contents(".docs/".$file_name);
            $content = chunk_split(base64_encode($content));
            
            $message .= “–$boundary \n”;
            $message .= “Content-type: $file_type;name=”$file_name"\n";
            $message .= “Content-transfer-encoding:base64 \n”;
            $message .= “Content-Disposition: attachment; filename=”$file_name" \n";  
            $message .= “\n”;  
            $message .= $content."\n";
            $message .= “\n”;
            mysql_query(“insert into mess_pj values (’’,’$mess_id’,’$_POST[doc_id]’,’’)”);
        }
    }
    mysql_free_result($requete2);
}
if (isset($_FILES[‘userfile’]) && is_uploaded_file($_FILES[‘userfile’][‘tmp_name’]))
{

         $file_name = $_FILES[‘userfile’][‘name’];

           $file_type = filetype($_FILES[‘userfile’][‘tmp_name’]);
           $file_size = filesize($_FILES[‘userfile’][‘tmp_name’]);
           $content = chunk_split(base64_encode(file_get_contents($_FILES[‘userfile’][‘tmp_name’])));

        $message .= “–$boundary \n”;
            $message .= “Content-type: $file_type;name=”$file_name"\n";
            $message .= “Content-transfer-encoding:base64 \n”;
            $message .= “Content-Disposition: attachment; filename=”$file_name" \n";  
            $message .= “\n”;  
            $message .= $content."\n";
            $message .= “\n”;
        
            mysql_query(“insert into mess_pj values (’’,’$mess_id’,’’,”$file_name")");
           unlink($_FILES[‘userfile’][‘tmp_name’]);

        //…
}
// Fin
$message .= “–”.$boundary."-- \n end of the multi-part";
 
// Function mail()
mail($mail_to, $subject, $message, $entete);

}
 mysql_free_result($requete1);
mysql_close($f);

}
?>

J’ai deux sources possible pour les pièces jointes, soit sur l’herbergeur (listées sur une BDD) soit uploader
                                                                  

                               
From: xxxxxx@gmail.com
To:  
Date: Sun, 22 Dec 2013 22:24:04 +0100
Subject: test
 
This is a multi-part message in MIME format.
--56cb8620624e6641bbe66343a30b06c0
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: binary
teste
--56cb8620624e6641bbe66343a30b06c0
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding:binary

teste
--56cb8620624e6641bbe66343a30b06c0 Content-type: file;name="Affiche fete noel 2013.pdf" Content-transfer-encoding:base64 Content-Disposition: attachment; filename="Affiche fete noel 2013.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhmci1GUikgL1N0cnVjdFRyZWVSb290IDgwIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4v UGFnZUxhYmVscyAxMTAgMCBSPj4NCmVuZG9iag0KMiAwIG9iag0KPDwvVHlwZS9QYWdlcy9Db3Vu dCAxL0tpZHNbIDMgMCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50 IDIgMCBSL1Jlc291cmNlczw8L1hPYmplY3Q8PC9JbWFnZTUgNSAwIFIvSW1hZ2U3IDcgMCBSL0lt <> bGVyDQo8PC9TaXplIDExMi9Sb290IDEgMCBSL0luZm8gNzkgMCBSL0lEWzw0Q0JDMUJDREM1NzU3 OTQ0QUY5MERCMEY4OTMwMkU0MD48NENCQzFCQ0RDNTc1Nzk0NEFGOTBEQjBGODkzMDJFNDA+XSAv UHJldiA3NjczMTMvWFJlZlN0bSA3NjY3NjE+Pg0Kc3RhcnR4cmVmDQo3Njk3MTMNCiUlRU9G --56cb8620624e6641bbe66343a30b06c0--  end of the multi-part

merci d'avance