Accueil > Recettes Techniques > Linux > Dedibox : Envoyer des mails à partir d’un site.

Dedibox : Envoyer des mails à partir d’un site.

samedi 10 mars 2007, par Julien Falconnet

Avec le durcissement généralisé de la lutte antispam, il devient de plus en plus difficile d’avoir simplement un site qui envoi des mail de récupération de mot de passe...

Après bien des soucis pour héberger la Version 1 du site Lunastars, sur un serveur mutualisé, j’ai fini par opter pour une solution dédiée chez DEDIBOX. Jusqu’à présent j’en étais plutôt content : installation facile, debian disponible, les lenteurs du dédié disparues, mes joueurs heureux.... le top quoi.

Mais après un mois, je regarde un peu les statistiques d’inscription et m’aperçois qu’aucune inscription n’a été validée depuis la migration. En le recoupant avec des mails de personnes déclarant avoir du mal à recevoir des mails du site, je me lance dans une enquete... et je découvre que j’ai une pelleté de mails refusés (pas tous par exemple les miens passent :( ). Plein de hotmail, mais aussi la poste, des domaines de particuliers etc.

Après quelques recherches sur le net, il semblerait qu’il soit en train de s’établir un système de serveur de confiance. Les serveurs qui ne seraient pas explicitement "de confiance" se verraient refusé le droit de faire transiter les mails considérés par défaut comme du spam.

Il doit bien y avoir des moyens de résoudre le problème mais lesquels. Voici le récits de mes recherches et expérimentations.

 Mails insufisament renseigné

Les serveurs qui relaient les mails sont de plus en plus difficiles sur le contenus des headers des mails (la partie qui est avant le mail et qu’en général on affiche pas). En particulier la fonction PHP mail() par défaut ne rempli peut ou pas ces champs. Si les headers sont insuffisants les serveur vont carrément refuser le mail.

Diagnostic

Si des mails n’arrivent pas, et que dans vos log de message (sous Debian/Exim4 : /var/spool/exim4/msglog), vous avez des messages du type

  • 501 (501 5.1.7 Bad sender address syntax, 501 Bad address syntax, 501 Invalid Address)... ou 553 (553 sorry, your envelope sender domain must exist (#5.7.1) , 501 FROM Invalid mail address, invalid domain name syntax)
  • 550 5.1.0 SIZE=1576 domain missing or malformed
  • 553 5.1.3 ... Hostname required

C’est probablement que les champs des headers sont mal renseignés.
Vérifiez en particulier le return-path de vos mails, la plupart des prestataires de mails en exigent un pour accepter de faire transiter les mails.

Solution au niveau code PHP
Il est possible de renseigner le 4e champs de la fonction "mail()" avec les headers (ou entêtes) importants. En particulier assurez vous que les champs ci dessous soient renseignés.

$entete  = "From: Nom Expediteur <expediteur@monsite.tld>\r\n";
$entete .= "Reply-To: Nom Expediteur <expediteur@monsite.tld>\r\n";
$entete .= "Return-Path: expediteur@monsite.tld\r\n";
$entete .= "Message-ID: <".time().".site@monsite.tld>\r\n";
$entete .= "X-Mailer: PHP v".phpversion()."\r\n"
$entete .= "X-Sender: expediteur@monsite.tld\r\n";
$entete .= "X-auth-smtp-user: expediteur@monsite.tld \r\n";
$entete .= "X-abuse-contact: abuse@monsite.tld ";

J’ai bien galéré pour en arriver là, mais rien à faire... le return-path des mails envoyés restaient déséspérément :

  • Return-Path :

alors j’ai du aller plus loins ...
Solution au niveau php.ini

aprés moult recherche il semble qu’il faille modifier le php.ini (/etc/php5/apache2/php.ini) pour moi aprése une recherche de sendmail :
sendmail_path = /usr/sbin/sendmail -fenvoyeur monsite.tld -t -i

et Oh joie Oh bonheur le return path des mails envoyé est enfin correctement modifié.

Et poum ça passe pour les @poste.fr et sans doute les autres...

 Serveur en liste noire

Ca j’ai pas eu le problème, mais on sait jamais, autant garder la recherche sous le coude.

Si vous avez fait trop d’erreurs, que votre serveur a été détourné etc il est possible que votre serveur aie été mis en liste noire. Pour vérifier que le serveur n’est pas blacklisté

 SPF

Ca non plus j’ai pas encore eu besoin, mais je pense le faire bientôt (notament pour un de mes domaines qui est utilisé comme source apparente de spam). L’idée c’est de restreindre à quelques ip les serveur qui ont le droit d’envoyer un mail semblant provenir d’un domaine. Ensuite on indique cette information au niveau du DNS et les serveurs ’intelligents’ peuvent ’vérifier’ au niveau DNS que les mails viennent bien d’un smtp ’autorisé’ avant de transmettre et dégager sinon.

Une petite définition.

Un outil pour générer le code spf : OpenSPF wizard

Spécificité de certains grands fournisseurs de mail :


Quelques références qui m’ont bien aidés :

Attention à partir 31 Mars 2007 mais il reste possible de l’activer manuellement par la console de gestion (Avancé- Configuration de la protection SMTP )


Cet article n’est qu’un résumé de diverses recherches sur un domaine que je maîtrise mal, il se peut que j’ai fait des erreurs de compréhension. Toutes les remarques sont les bienvenues.