PHP/Mails
< PHP
Mail()
modifier
Le code suivant se connecte à localhost:25 pour envoyer un mail[1] :
<?php
$to = 'Destinataire@gmail.com';
$subject = 'Sujet du mail';
$message = 'Contenu du message';
$headers = 'From: Expediteur@gmail.com' . "\r\n" .
'Reply-To: Expediteur@gmail.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
Si la machine hébergeant le script n’est pas pourvue d'un serveur SMTP, le freeware portable Simple Mail Server[2] peut jouer ce rôle rapidement sans installation.
PEAR
modifierPour paramétrer un SMTP distant éventuellement SSL, télécharger les classes mails du framework PEAR Mail[3], Net SMTP[4] et Net Socket[5] qu’elles utilisent.
Pour ajouter un fichier joint télécharger Mail Mime[6].
PHPMailer
modifierTélécharger PHPMailer[7] pour bénéficier des classes de ce framework.
Problèmes connus
modifier- La connexion a échoué
- Vérifier le serveur HTTP qui interprète le .php.
- SMTP Error: Could not connect to SMTP host
- SMTP server error: ERR Email ID not found
- Cette section est vide, insuffisamment détaillée ou incomplète. Votre aide est la bienvenue ! Comment faire ?
- Si les mails partent sans arriver :
- Vérifier que l'IP de l'expéditeur n’est pas blacklistée : http://whatismyipaddress.com/blacklist-check
- Définir un reverse DNS si absent
- Veiller à ce que le mail ne soit pas présumé spam, en évitant les sujets vides par exemple, ou les pièces jointes exécutables non compressées (.exe, .cmd, .vbs...).
Utilisation de Mail () plus complexe...
modifierExemple
<?php
$mail = 'test@test.fr'; // Déclaration de l'adresse de destination.
if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui rencontrent des bogues.
{
$passage_ligne = "\r\n";
}
else
{
$passage_ligne = "\n";
}
//=====Déclaration des messages au format texte et au format HTML.
$message_txt = "Bonjour, voici un e-mail envoyé par un script PHP.";
$message_html = "<html><head></head><body><b>Bonjour</b>, voici un e-mail envoyé par un <i>script PHP</i>.</body></html>";
//==========
//=====Création de la boundary
$boundary = "-----=".md5(rand());
//==========
//=====Définition du sujet.
$sujet = "Hey mon ami !";
//=========
//=====Création du header de l'e-mail.
$header = "From: \"WeaponsB\"<test@test.fr>".$passage_ligne;
$header.= "Reply-to: \"WeaponsB\" <test@test.fr>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
//==========
//=====Création du message.
$message = $passage_ligne."--".$boundary.$passage_ligne;
//=====Ajout du message au format texte.
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_txt.$passage_ligne;
//==========
$message.= $passage_ligne."--".$boundary.$passage_ligne;
//=====Ajout du message au format HTML
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_html.$passage_ligne;
//==========
$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
//==========
//=====Envoi de l'e-mail.
mail($mail,$sujet,$message,$header);
//==========
?>
Explication:
- Ouverture boundary.(sert à séparer les différentes parties de notre e-mail)
- Déclaration de type (exemple texte, par défaut les clients mail tentent de convertir l'HTML en texte).
- Texte.
- Ouverture boundary.
- Déclaration de type (exemple HTML,par défaut les clients mail tentent de convertir l'HTML en texte)).
- HTML.
- Fermeture boundary.
- Fermeture boundary.
Avec la mise en place de pièce jointe
modifierExemple
<?php
$mail = 'test@test.fr'; // Déclaration de l'adresse de destination.
if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui présentent des bogues.
{
$passage_ligne = "\r\n";
}
else
{
$passage_ligne = "\n";
}
//=====Déclaration des messages au format texte et au format HTML.
$message_txt = "Bonjour, voici un e-mail envoyé par un script PHP.";
$message_html = "<html><head></head><body><b>Bonjour</b>, voici un e-mail envoyé par un <i>script PHP</i>.</body></html>";
//==========
//=====Lecture et mise en forme de la pièce jointe.
$fichier = fopen("background.jpg", "r");
$attachement = fread($fichier, filesize("background.jpg"));
$attachement = chunk_split(base64_encode($attachement));
fclose($fichier);
//==========
//=====Création de la boundary.
$boundary = "-----=".md5(rand());
$boundary_alt = "-----=".md5(rand());
//==========
//=====Définition du sujet.
$sujet = "Fichier important";
//=========
//=====Création du header de l'e-mail.
$header = "From: \"WeaponsB\"<test@test.fr>".$passage_ligne;
$header.= "Reply-to: \"WeaponsB\" <weaponsb@mail.fr>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
//==========
//=====Création du message.
$message = $passage_ligne."--".$boundary.$passage_ligne;
$message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
//=====Ajout du message au format texte.
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_txt.$passage_ligne;
//==========
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
//=====Ajout du message au format HTML.
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_html.$passage_ligne;
//==========
//=====On ferme la boundary alternative.
$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
//==========
$message.= $passage_ligne."--".$boundary.$passage_ligne;
//=====Ajout de la pièce jointe.
$message.= "Content-Type: image/jpeg; name=\"background.jpg\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: base64".$passage_ligne;
$message.= "Content-Disposition: attachment; filename=\"background.jpg\"".$passage_ligne;
$message.= $passage_ligne.$attachement.$passage_ligne.$passage_ligne;
$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
//==========
//=====Envoi de l'e-mail.
mail($mail,$sujet,$message,$header);
//==========
?>
Explication:
- Ouverture boundary.
- Déclaration du nouveau content-type et de la seconde boundary.
- Ouverture boundary_2.
- Déclaration de type (exemple texte).
Texte.
- Ouverture boundary_2.
- Déclaration de type (exemple HTML).
HTML.
- Fermeture boundary_2.
- Ouverture boundary.
- Déclaration de la pièce jointe 1.
- Ouverture boundary.
- Déclaration de la pièce jointe 2.
- Ouverture boundary.
- Déclaration de la pièce jointe [...].
- Ouverture boundary.
- Déclaration de la pièce jointe n.
- Fermeture boundary.
Références
modifier- ↑ http://php.net/manual/fr/function.mail.php
- ↑ https://sourceforge.net/projects/simplemailsvr/
- ↑ http://pear.php.net/package/Mail/download
- ↑ http://pear.php.net/package/Net_SMTP/download
- ↑ http://pear.php.net/package/Net_Socket/download
- ↑ http://pear.php.net/package/Mail_Mime/download
- ↑ http://sourceforge.net/projects/phpmailer/