101 votes

Comment envoyer des e-mails et éviter qu'ils soient classés comme spam ?

Il s'agit d'un question canonique sur la façon de gérer les e-mails envoyés par votre serveur qui sont mal classés comme spam. Pour plus d'informations, vous pouvez trouver ces questions similaires utiles :

Je souhaite parfois envoyer des bulletins d'information à mes clients. Le problème est que certains de ces messages sont considérés comme des spams. La plupart du temps par Outlook chez le client (même dans mon propre Outlook 2007).

Je voudrais maintenant savoir ce qu'il faut faire pour créer de "bons" courriels. Je connais la recherche inversée, etc., mais (par exemple), qu'en est-il d'un lien de désabonnement avec un identifiant unique ? Cela augmente-t-il le taux de spam ?

8voto

Basj Points 479

Solution détaillée pour éviter que les courriels soient identifiés comme spam et/ou n'arrivent pas aux destinataires

Exemple de situation : Vous avez un serveur qui exécute un site web PHP pour example.com qui doit envoyer des e-mails . Et vous remarquez que vos courriels ne sont pas toujours délivrés. (Gros problème si vous êtes propriétaire d'une boutique, et que les clients ne reçoivent pas les emails après un achat !)

Si vous suivez toutes les étapes suivantes, il devrait résoudre 99,9% des problèmes. (J'ai d'abord pensé qu'il était possible de ne faire que quelques-uns d'entre eux, et de sauter DKIM par exemple, mais finalement tous étaient nécessaires pour résoudre tous les problèmes que j'avais).

  1. Tout d'abord, qui envoie les e-mails ?

    Lorsque votre code PHP envoie des emails, c'est souvent avec la célèbre fonction PHP mail(...) . Mais que fait cette fonction, sous le capot ? Exécutons un test.php page contenant <?php echo ini_get('sendmail_path'); ?> . Vous obtiendrez par exemple : /usr/sbin/sendmail -t -i . Bonne nouvelle, maintenant nous savons quel programme gère vraiment les emails !
    Maintenant une info délicate : le nom sendmail peut être divers programmes . Même si vous voyez sendmail à l'étape précédente, vous avez peut-être sendmail o postfix o exim ou qmail, etc. installés. Faisons dpkg -S /usr/sbin/sendmail . La réponse est postfix: /usr/sbin/sendmail ok, cela signifie nous avons postfix installé .

  2. Regardez dans le fichier journal /var/mail/www-data pour savoir quels e-mails n'ont pas été correctement envoyés, et pourquoi. Cela pourrait être utile pour les prochaines étapes.

  3. Comme mentionné sur Le blog de Jeff Atwood il est temps d'examiner les enregistrements PTR inversés. (Plus de détails seront ajoutés ici).

  4. Ajoutez la ligne suivante dans le fichier de configuration de postfix /etc/postfix/main.cf fichier :

    inet_protocols=ipv4

    Puis redémarrez postfix avec service restart postfix . Pourquoi ? Parce que j'ai eu des problèmes de ce genre lorsque le destinataire est gmail :

    Notre système a détecté que ce message ne respecte pas les directives d'envoi IPv6 concernant les enregistrements PTR et l'authentification 550-5.7.1. Veuillez revoir 550-5.7.1 https://support.google.com/mail/?p=ipv6_authentication_error pour plus d'informations sur 550 5.7.1.

    El solution la plus facile était alors de passer postfix en ipv4 uniquement, d'où cette étape 4 (qui pourrait être inutile pour vous ?).

  5. Enregistrements DNS SPF . Afin de prouver que vous êtes autorisé à envoyer des e-mails à partir de @example.com vous pouvez ajouter un enregistrement SPF dans les enregistrements DNS du domaine. example.com . J'ai trouvé quelque part que The DNS record type 99 (SPF) has been deprecated Nous utilisons donc un enregistrement TXT à la place. Ajoutons ceci comme un enregistrement DNS TXT (voir également la note 1) :

    v=spf1 a mx include:_spf.google.com include:sendgrid.net ~all

    Pourquoi ces inclusions ? Parce que mon serveur ne sera pas le seul à envoyer des e-mails à partir de @example.com ! J'ai configuré Gmail pour Envoyer le courrier en tant que contact@example.com ( voir la capture d'écran ici ), en utilisant le fournisseur SMTP de confiance Sendgrid . Si je n'ajoute pas ces include: Gmail ne serait pas autorisé à envoyer des e-mails à partir de @example.com .

  6. DKIM la signature numérique. Comme indiqué aquí L'objectif de DKIM est de garantir que le contenu du courrier n'a pas été altéré pendant sa transmission. Voici le processus d'installation dans Ubuntu (guide utile aquí aussi) :

    • apt-get install opendkim opendkim-tools

    • Créez les clés (vous pouvez également générer les clés et l'enregistrement TXT DNS correspondant à l'aide de la commande http://dkimcore.org/tools/ ):

      mkdir /etc/opendkim
      cd /etc/opendkim
      opendkim-genkey -t -s mail -d example.com
    • Mettons ça dans /etc/opendkim.conf :

      Syslog                 yes
      Domain                 *
      KeyFile                /etc/opendkim/mail.private
      Selector               mail
      AutoRestart            yes
      Background             yes
      Canonicalization       relaxed/relaxed
      DNSTimeout             5
      Mode                   sv
      SubDomains             no

      ceci dans /etc/default/opendkim :

      SOCKET="inet:8891@localhost" # Ubuntu default - listen on loopback on port 8891

      et enfin ajouter ceci à la fin du fichier de configuration de postfix /etc/postfix/main.cf :

      # DKIM
      milter_default_action = accept
      milter_protocol = 2
      smtpd_milters = inet:localhost:8891
      non_smtpd_milters = inet:localhost:8891
    • Maintenant, ajoutons la clé publique (trouvée dans /etc/opendkim/mail.txt ) aux enregistrements DNS de votre domaine :

      mail._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=OqYHd...waPaQAX"

      Voici à quoi cela ressemble avec mon registrar Namelynx :

    • Dernière étape pour DKIM : redémarrer les services de messagerie avec service restart opendkim ; service restart postfix .

  7. Vérifiez si tout fonctionne. La méthode la plus simple consiste à envoyer un courrier électronique via PHP à l'adresse suivante auth-results@verifier.port25.com (cet outil très utile est mis à disposition par Port25 Solutions) :

    $emailfrom = "Example <contact@example.com>";
    $headers  = "MIME-Version: 1.0 \n";
    $headers .= "Content-Transfer-Encoding: 8bit \n";
    $headers .= "Content-type: text/plain; charset=utf-8\n";
    $headers .= "Reply-To: " . $emailfrom . "\n";
    $headers .= "From: " . $emailfrom . "\n";
    $headers .= "Bcc: example@gmail.com\n";
    mail("check-auth@verifier.port25.com", "Hello", "Hello!", $headers);

    Ensuite, voyez la réponse de cet outil, elle devrait ressembler à ceci :

    ==========================================================
    Summary of Results
    ==========================================================
    SPF check:          pass
    DKIM check:         pass
    SpamAssassin check: ham

    Le service mail-tester.com est également utile.

  8. (Facultatif) Essayez postmaster.google.com. Je l'ai utilisé mais je ne me souviens pas si ça a aidé ou pas.

  9. Si cela ne fonctionne toujours pas Pour éviter les jours et les nuits de débogage (infructueux), une solution pourrait consister à externaliser le courrier électronique auprès d'une solution professionnelle. Ici est un bon article à ce sujet. En voici une citation : "L'envoi d'emails depuis votre application peut s***. La moitié du temps, les messages qui sont envoyés depuis votre propre serveur se retrouvent simplement dans le dossier de courrier indésirable du destinataire." que j'ai malheureusement découvert vrai, après des semaines d'ajustements.


Notes supplémentaires :

(1)

-all : Fail: All mail servers not listed in the SPF record are explicitly not authorized to send mail using the sender’s domain.
~all : Soft Fail: All mail servers not listed in the SPF record are not authorized to send mail using the sender’s domain, but the owner of the domain is unwilling to make a strong assertion to that effect.
?all : Neutral: The domain controller cannot or does not want to assert whether or not all mail servers not listed in the SPF record are authorized to send mail using the sender’s domain.
+all : Pass: All mail servers are authorized to send mail on behalf of the sender’s domain.

7voto

wonderer Points 963

Dans le cadre de mon activité en ligne, les courriels de confirmation de commande étaient envoyés dans les spams ou n'étaient même pas délivrés (rejetés par les serveurs de messagerie). Il s'agissait de simples courriels "Voici un résumé de votre commande" avec un lien vers le domaine de notre site. Nous avons fini par acheter quelques comptes Google Apps pour mon entreprise. Vous pouvez configurer l'un d'entre eux pour qu'il agisse comme votre serveur SMTP. Le fait que Google soit notre expéditeur de courrier a mis fin à tous ces problèmes.

En ce qui concerne les lettres d'information par courrier électronique, il faut absolument utiliser un service qui gère les inscriptions et les retraits pour vous. L'utilisation d'un autre service pour envoyer des courriers en masse vous fera probablement bannir.

3voto

Henry Points 880

Un nouveau guide a été publié sur la boîte de réception des e-mails.

Le plus complet que j'ai jamais vu. Une liste de contrôle de 43 points différents qui couvrent tous les moyens d'éviter d'être marqué comme spam. Elle est mise à jour en permanence.

De la configuration du DNS à la configuration de l'authentification, en passant par la mise en place d'un contrôle de la réputation, la réduction du taux de rebond, le test du contenu de vos e-mails, etc.

Couverture de tout, de tête à queue, par ZeroBounce.NET

https://www.zerobounce.net/guide-to-improve-inbox-and-delivery.html

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X