L'art et la manière d'envoyer des mails depuis les pages perso de Free…

Les Pages Perso Chez Free

Par Florent Papin, le , dans Découvrir les pages perso. / Dernière modification : le par Al.
Tags : Erreur 403, Fonction mail(), PHP, Spam, Suspension, Sécurité, Tutoriaux

Envoyer quelques mails depuis son site perso, c'est sympa. En envoyer beaucoup en peu de temps, ça peut être mal vu. En effet, au risque de se répéter, Internet n'est pas une zone de non droit ! Et les sanctions tombent vite pour les serveurs sur la toile. Si un serveur « balance » trop de mails en même temps et/ou[1] a une propension à envoyer trop de SPAM[2], eh bien, il existe sur la toile des instances qui tiennent à jour des listes de serveurs indésirables.

Ce billet est complété par trois autres billets : Protection des forums et des formulaires contre les robots spammeurs, Éviter le spam sur les sites perso et Utiliser correctement les formulaires de contact sur les Pages Perso de Free.

Avec l'expansion du service pages perso (à ce jour, au bas mot, 2,5 millions de comptes activés), l'unique serveur traitant les envois de mails des pages perso a la vie dure (d'ailleurs, c'est un nouveau serveur, perso1, qui traite cela maintenant, soulageant perso0 dans les nombreuses tâches qu'il accomplit). Donc, pour maintenir une qualité de service correcte, certaines limitations ont été mises en place. On peut en citer quelques unes :

  • Pas plus de 2 000 mails envoyés/semaine (cela inclut les tentatives de spam, les flood, les messages non remis… si les formulaires ne sont pas correctement configurés et protégés cela peut aller vite) ; message d'erreur du genre : Warning: mail() [function.mail]: Quota mail atteint… ;
  • Pas plus de 20 destinataires et/ou appels de la fonction mail par exécution de script PHP ; message d'erreur du genre : Warning: mail() [function.mail]: Trop de destinataires, vous êtes suspendu. ;
  • La valeur du From: doit être l'email du compte depuis lequel est envoyé l'email ;
  • Système de détection de SPAM ; message d'erreur du genre : Warning: mail() [function.mail]: SPAM détecté. ;
  • Pas (ou peu) de pièces jointes ;
  • Ne pas inclure de contenus pouvant être assimilés à du spam (nombreux liens…) ;
  • Pas d'envois trop rapprochés ;
  • Pas d'envois trop fréquents au(x) même(s) destinataire(s) ;
  • Ne spécifiez pas tous les en-têtes, uniquement les principaux (cf. le code d'exemple en bas de page) car, si vous écrasez les en-têtes automatiquement insérés par les serveurs d'envoi par les vôtres, il y a de grandes chances que l'email ne passe pas, alors que la fonction mail() était bien codée, le contenu et le format correct, et que l'exécuteur PHP à bien remis l'email au serveur perso1, en charge des envois depuis les PP ;
  • Format mime text/plain ou multipart (text/html + text/plain), n'envoyez jamais de courriel au format text/html uniquement ; le jeu de caractères doit être us-ascii, iso-8859-1, iso-8859-15, UTF-8.

Dans les deux premiers cas, la fonction mail() sera bloquée jusqu'à réinitialisation (1 fois / semaine, le week-end).

Les deux points suivants entraînent le blacklistage de l'IP du visiteur émettrice du SPAM (remise à zéro de temps en temps). Si trop de SPAM sont détectés sur le compte pages perso émettant les emails, alors la fonction mail() est aussi désactivée pour le compte pages perso (remise à zéro de temps en temps).

Les derniers points concernent la conformité de votre courriel vis à vis des normes de techniques (les RFC). Si votre message est mal formaté, il est possible qu'il ne soit pas remis à votre destinataire.

Mais alors, comment faire pour envoyer des mails de façon massive ? (newsletter, etc.)

Et bien, Free a un service gratuit dédié à cela : http://ml.free.fr

La documentation est disponible ici.

Ainsi, vous n'aurez à envoyer qu'un seul mail pour qu'il soit propagé à l'ensemble de vos abonnés.

Et comment faire pour récupérer les résultats d'un formulaire PHP ?

Rendez-vous ici et suivez la documentation. Attention ! Les résultats vous seront envoyés sur l'adresse mail associée à la page perso (exemple : si vous utilisez le formulaire sur http://monsite.free.fr alors le mail sera envoyé à monsite@free.fr).

N.B. : chercher à contourner les limitations mises en place (boucle de rechargement, se connecter à un serveur SMTP externe…) sur le service pages perso de Free peut vous conduire à la suspension, voire la destruction de votre espace pages perso[3]. Je vais d'ailleurs sûrement rédiger un billet en ce sens (« Jouer avec les limites… »).

Tester des problèmes d'envoi de mail depuis les Pages Perso Free

Test de la fonction mail()

Si vous rencontrez des problèmes d'envoi de courriel depuis vos Pages perso, vous pouvez tester simplement la fonction mail() grâce au script PHP suivant :

<?php

/** Nouvelle fonction mail pour le FAI Free, conforme au standard * De temps en temps les courriels ne sont pas envoyés, mais pourtant la fonction mail() renvoie True * ce qui n'est pas conforme a la spécification PHP de cette fonction. * De manière empirique, il a été déterminée qu'un temps d'envoi au moins égal à 2 secondes est une garantie que le courriel * est vraiment envoyé. * Si le mail est vraiment envoyé, une notification de rejet est bien envoyé par Free à l'adresse de l'expéditeur du message * Copyright 2013 - a@a.a <tmp12311@free.fr> * Licence : CeCILL-B, http://www.cecill.info * Merci à Gaming Zone <http://gaming.zone.online.fr> pour ses tests ayant permis de déterminer la durée * */ function mailFree($to , $subject , $message , $additional_headers=null , $additional_parameters=null) { $start_time = time(); $resultat=mail ( $to , $subject, $message, $additional_headers, $additional_parameters); $time= time()-$start_time; return $resultat & ($time>1); } /** Fin de la définition de la fonction*/
/** Le code qui suit est juste donné comme exemple de test de la fonction * * Code de test de la fonction * Modifié par Al <les.pages.perso.chez(chez)free.fr> * */
/* Mettre ici l'adresse mail de votre site Web : si votre site est http://monsite.free.fr/ alors votre adresse email est monsite@free.fr */ $admin = 'Moi <monsite@free.fr>';
$outHead = '<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8" /> <title>Test de la fonction PHP mail() chez Free - Test d\'envoi</title> <meta name="robots" content="noindex,nofollow,noarchive"/> <!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]--> </head><body> <h1>Test de la fonction PHP mail() chez Free - Test d\'envoi</h1> <h2>Appel à la fonction mail() réalisé</h2> <hr/> <h3>Erreur(s) détectée(s) :</h3>'; $out=''; $res=false; if (empty($_POST)||isset($_POST['reset'])){ $dest=''; } else { $dest=$_POST['dest']; if (isset($_POST['send'])){ $sujet='Message envoyé le '.date("l j F Y").' à '.date("H:i:s").', Test numéro 1'; $message="Ma foi,\nTout semble fonctionner correctement.\n\nEnvoyé depuis l'IP={$_SERVER["REMOTE_ADDR"]}"; $additional_headers = "Cc: $admin\r\n"; $additional_headers .= "From: $admin\r\n"; $additional_headers .= "MIME-Version: 1.0\r\n"; $additional_headers .= "Content-Type: text/plain; charset=utf-8\r\n"; // $additional_headers .="Reply-To: $admin\r\n"; $additional_headers .="Return-Path: $admin\r\n"; if (mailFree( $dest, $sujet , $message, $additional_headers )==false) { $out.="<pre style='border: 1px dotted #666666;padding:10px;'><code>L'envoi du message n'a pas été réalisé en raison des limitations des serveurs de Free, merci de réessayer un peu plus tard.</code></pre>"; } else {$res=true;} } } if (!$res) { $out.="<form id='contact' method='post'> <p><strong>Tous les champs sont obligatoires.</strong></p> <p><label for='dest'>Courriel pour la réponse :</label> <input type='text' name='dest' id='dest' value='$dest'/></p> <p><input type='reset' name='reset' value='Effacer' /> <input type='submit' name='send' value='Envoyer'/></p> </form>"; } else { $out.="<pre style='border: 1px dotted #666666;padding:10px;'><code>Merci de votre visite, vous allez recevoir un message à l'adresse : $dest</code></pre>"; } $outForm='<p>Si une erreur du serveur ou un warning du type <code><strong>Warning:</strong> mail() [function.mail]: Trop de spam. Fonction mail() bloquée. in <strong>/mnt/000/xxx/x/0/votrelogin/test-mail.php</strong> on line <strong>17</strong></code> apparaît dans la zone de notification, la fonction PHP <code>mail()</code> de votre compte est bloquée pour spam ou usage excessif. Selon les cas, la fonction PHP <code>mail()</code> sera débloquée automatiquement toutes les fins de semaines ou de temps en temps.</p> <p>Si il n\'apparaît dans la zone de notification aucun warning ou message d\'erreur, la fonction PHP <code>mail()</code> de votre compte fonctionne correctement.</p> <p>Des informations additionnelles sont disponibles dans le billet <a href="http://les.pages.perso.chez.free.fr/l-art-d-envoyer-des-mails-depuis-les-pp-de-free" hreflang="fr" title="L\'art et la manière d\'envoyer des mails depuis les pages perso de Free…">L\'art et la manière d\'envoyer des mails depuis les pages perso de Free…</a> du site <em>Les Pages Perso Chez Free</em>.</p></body></html>'; echo $outHead.$out.$outForm; ob_end_flush(); ?>

Ce script est disponible en téléchargement ici : ⬇︎ Test Fonction PHP mail(). Il est à placer à la racine de votre compte, une fois l'adresse de courriel de l'expéditeur modifiée. Il suffit ensuite de l'appeler en y accédant depuis votre navigateur préféré à l'adresse : http://monsite.free.fr/test-mail.php.

Si vous recevez un courriel, la fonction mail(), votre compte fonctionne correctement. Les dysfonctionnements constatés sont imputables à vos scripts PHP, au formatage de vos courriels, aux serveurs de réception de courriels de vos destinataires, etc. mais pas au serveur d'envoi de mail des pages perso ou à la fonction mail() de votre compte.

Suite à des tests empiriques, il a été démontré que si la fonction mail() est exécutée en moins de 2 secondes environ, les courriels ne sont pas envoyés, que votre message soit correctement formaté ou non. Un test très simple consiste à tester le temps d'exécution de la fonction mail, et si le délai est trop court, il suffit d'informer l'utilisateur et de l'inviter à réessayer ultérieurement.

Voici la fonction incluant cette vérification du délai d'exécution :

<?php
/** Nouvelle fonction mail pour le FAI Free, conforme au standard
* De temps en temps les courriels ne sont pas envoyés, mais pourtant la fonction mail() renvoie True
* ce qui n'est pas conforme a la spécification PHP de cette fonction.
* De manière empirique, il a été déterminée qu'un temps d'envoi au moins égal à 2 secondes est une garantie que le courriel
* est vraiment envoyé.
* Si le mail est vraiment envoyé, une notification de rejet est bien envoyé par Free à l'adresse de l'expéditeur du message
* Copyright 2013 - a@a.a <tmp12311@free.fr>
* Licence : CeCILL-B, http://www.cecill.info
* Merci à Gaming Zone <http://gaming.zone.online.fr> pour ses tests ayant permis de déterminer la durée
* */
function mailFree($to , $subject , $message , $additional_headers=null , $additional_parameters=null) {
$start_time = time();
$resultat=mail ( $to , $subject, $message, $additional_headers, $additional_parameters);
$time= time()-$start_time;
return $resultat & ($time>1);
}
/** Fin de la définition de la fonction*/
?>

Assistance

Vous pouvez demander de l'aide sur le forum Usenet du service Pages Perso de Free, si vous souhaitez que l'admin étudie précisément votre cas, vous pouvez également mentionner l'heure et la date d'envoi, l'adresse email du destinataire et l'adresse email de l'expéditeur. N'oubliez pas que le forum Usenet est public, ne diffusez pas d'informations personnelles (ou envoyez un courriel à l'administrateur une fois votre première demande postée et sur sa demande expresse uniquement.)

Note :
[1] dépend de la configuration des serveurs recevant le courrier.
[2] Là aussi, pour la méthode de détection, ça dépend du destinataire…
[3] NdE : et à l'impossibilité d'en créer de nouvelles.