web-dev-qa-db-fra.com

Configuration de DomainKeys / DKIM dans un client SMTP basé sur PHP

Il semble qu'il existe d'excellentes bibliothèques pour signer des e-mails avec DomainKeys sur C # /. NET, mais j'ai vraiment du mal à trouver le même type de support pour PHP. Peut-être que je ne cherche pas au bon endroit?

Le seul que j'ai trouvé est http://php-dkim.sourceforge.net/ ; il a l'air incroyablement hacky et ne supporte que PHP4. Compte tenu de la popularité de PHP et de l'importance des clés de domaine pour la classification des e-mails comme non-spam, je m'attendrais à de meilleurs outils; en connaissez-vous? D'autres astuces que vous recommanderiez?

Information supplémentaire: j'utilise un fournisseur SMTP externe car j'ai besoin d'envoyer des milliers d'e-mails par jour.

28
Alex Weinstein

Je recommanderais la prise en charge DKIM au niveau MTA afin que tous les e-mails générés par votre serveur pour un domaine donné soient signés par défaut. (sauf si vous avez une très bonne raison de ne pas signer tous les e-mails générés par le serveur pour un domaine).

Le meilleur point de départ dans ma recherche sur Google pour obtenir la configuration DKIM sur LAMP avec dkim-milter et sendmail (sur CentOS 5.2 dans mon cas) était article de Jeff Atwood sur l'envoi d'e-mails via le code .

Je serais d'accord avec lui que les 2 premières choses que vous devriez aborder sont l'enregistrement PTR inversé et la signature DKIM.

Très important également:

  1. Adresse IP de la boîte d'envoi des e-mails qui n'est pas déjà sur liste noire.
  2. assurez-vous que [email protected] est une boîte e-mail valide
  3. si votre e-mail généré par le serveur doit sembler provenir d'un autre endroit (comme un formulaire de contact devant provenir d'un nom/e-mail fourni dans un formulaire) suivez ces directives pour les en-têtes d'e-mail .

Voici le vérificateur de liste noire d'adresse IP que j'ai utilisé.

Ces 5 choses résoudront peut-être 95% de vos problèmes de délivrabilité des e-mails.

Ce Guide pour Fedora/dkim-milter/postfix est également très bon.

La bibliothèque de messagerie PHP que j'utilise pour mon application est PHPMailer 5.1 qui prend en charge DKIM (et est PHP 5 uniquement), mais après avoir fait la recherche, j'ai décidé l'implémentation au niveau de sendmail était une meilleure solution. Comme vous pouvez le voir, même l'auteur de PHPMailer 5.1 ne suggère pas DKIM au niveau de la bibliothèque de messagerie PHP PHP est la meilleure solution http: //dkim.worxware.com/ .

Bonne chance à vous.

22
codercake

Celui-ci est sur mon radar depuis un certain temps et n'a pas pu trouver de réponse définitive à la question d'origine dans ce fil de discussion sur le Web. J'ai maintenant pu implémenter l'envoi d'e-mails SMTP signés DKIM avec PHP/Pear. Voici les étapes requises.

  1. J'ai trouvé une version modifiée du DKIM de http://www.ra726.net/blog/2010/07/20/sending-email-to-gmail-from-php-without-being-marked-as -spam / (vous pouvez le télécharger via http://www.ra726.net/php-dkim.Zip ). Si vous avez déjà implémenté DKIM et que vous avez juste besoin de le faire fonctionner avec le courrier SMP, tout ce dont vous avez besoin est le fichier dkim.php qui, comme le dit le blog, est légèrement modifié pour gérer les en-têtes passés sous forme de tableau. Dans mon code, je l'ai nommé dkimNEW.php.

  2. Assurez-vous d'inclure la plupart des en-têtes afin que le MTA ne modifie pas le message après l'avoir signé. Dans mes recherches limitées, les en-têtes les plus ajoutés sont les en-têtes Date et Message-ID, donc mon tableau d'en-têtes ressemble à ceci: Remarque: Je l'ai utilisé pour envoyer un e-mail html, changez en fonction! Ajoutez également votre domaine comme dernière partie du Message-ID

    $headers = array(
        'Subject' => $subject,
        'From' => $from,
        'To' => $to,
        'MIME-Version' => '1.0',
        'Date' => date('r'),
        'Message-ID' => '<'.sha1(microtime(true)).'@yourdomain.com>',
        'Content-Type' => 'text/html',
        'Content-Transfer-Encoding' => 'quoted-printable',
    ); // end $headers
    
  3. Vous pourrez ensuite utiliser le dkim.php modifié mentionné ci-dessus pour signer votre e-mail ET ajouter la signature au tableau d'en-têtes, alias

    require 'dkimNEW.php';
    $dkim = AddDKIM($headers, $subject, $body);
    $headers['DKIM-Signature'] = $dkim;
    

Le reste du code est le code normal pour envoyer des e-mails via SMTP avec PHP/Pear. Le code de travail complet est:

<?php
    require_once 'Mail.php';
    require_once 'Mail/mime.php';
  // set all of the parameters
    $subject = 'Test of DKIM';
    $from = 'My Name <[email protected]>';
    $to = 'First Recipient <[email protected]>';
    $pbody ='<html><head></head><body><h1>Done! DKIM test</h1>Result, next?</body></html>';
    $text = strip_tags($pbody);

    // create the headers
    $headers = array(
        'Subject' => $subject,
        'From' => $from,
        'To' => $to,
        'MIME-Version' => '1.0',
        'Date' => date('r'),
        'Message-ID' => '<'.sha1(microtime(true)).'@mydomain.com>',
        'Content-Type' => 'text/html',
        'Content-Transfer-Encoding' => 'quoted-printable',
    ); // end $headers


    // create the message
    $mime = new Mail_mime("\n");
    $mime->setTXTBody($text);
    $mime->setHTMLBody($pbody);

    // always call these methods in this order
    $body = $mime->get();
    $headers = $mime->headers($headers);

    require 'dkimNEW.php' ;
    $dkim = AddDKIM($headers, $subject, $body);
    $headers['DKIM-Signature'] = $dkim;

    // create the smtp mail object
    $smtp_params = array(
        'Host' => 'mail.mydomain.com',
        'auth' => true,
        'username' => 'myUserName',
        'password' => 'myPassWord',
    ); // end $smtp_params
    $smtp = Mail::factory('smtp', $smtp_params);

    // send the message

    $recipients = array('[email protected]', '[email protected]');
    $mail = $smtp->send($recipients, $headers, $body);

?>

PS. Au cas où vous ne l'auriez pas remarqué, remplacez les valeurs par les vôtres!

Par conséquent, tout ce qui est essentiellement nécessaire pour que DKIM fonctionne avec les e-mails SMTP (ou bien le PHP mail) est de s'assurer que vous spécifiez tous les en-têtes ajoutés à votre e-mail par votre MTA, puis signez les en-têtes, l'objet et le corps du message, et incluez enfin cette partie signée dans votre en-tête.

15
Nepaluz

Avez-vous essayé: phpMailDomainSigner Il prend en charge DKIM-Signature et DomainKey-Signature dans le style orienté objet.

Voici un exemple:

// Create mailDomainSigner Object
include_once './lib/class.mailDomainSigner.php';

$mds = &new mailDomainSigner($domain_priv,$domain_d,$domain_s);
$new_data = $mds->sign(
                $mail_data,
                "Message-ID:Subject:From:Content-Type:MIME-Version:Content-Transfer-Encoding:Received:To:Date",
                true,true,false);
11
amarullz

Une classe uniquement pour DKIM qui est une spin-off de PHPMailer, mais avec des améliorations concernant le respect de la RFC et du code Nice-and-clean:

https://sourceforge.net/projects/dkim-class-php/

Exemple :

include_once('dkim.class.php');
$dkim = new DKIM();
$dkim_header = $dkim -> get_DKIM_header($to, $subject, $message, $headers);
mail($to, $subject, $message, $dkim_header.$headers);
10
Louis Ameline