2010-05-09 19 views
21

Il semble qu'il y ait de bonnes bibliothèques pour faire la signature de 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?Configuration de DomainKeys/DKIM dans un client SMTP basé sur PHP

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

Informations supplémentaires: J'utilise un fournisseur SMTP externe car j'ai besoin d'envoyer des milliers d'emails par jour.

+0

vers le bas vote \t Voici les fonctions par exemple comment envoyer des emails avec DKIM et php mail() Fonction: https://github.com/breakermind/PHP-DKIM –

Répondre

21

Je recommanderais le support DKIM au niveau MTA pour que tous les emails générés par le 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 emails générés par le serveur pour un domaine).

Le meilleur point de départ dans mon googling pour obtenir l'installation de DKIM sur LAMP avec dkim-milter et sendmail (sur CentOS 5.2 dans mon cas) était Jeff Atwood's post about sending emails through code.

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

également très important:

  1. adresse IP de la boîte pour envoyer des courriels pas déjà mis à l'index.
  2. faire [email protected] vous est une boîte e-mail valide
  3. si votre serveur e-mail généré doit sembler venir d'ailleurs (comme un formulaire de contact avoir besoin de venir de nom/email fourni sous une forme) follow these guidelines for email headers.

Voici le email ip address blacklist checker que j'ai utilisé.

Ces 5 choses vont résoudre peut-être 95% de vos problèmes de délivrabilité d'email. Ce Guide for Fedora/dkim-milter/postfix est également très bon. La bibliothèque de mail PHP que j'utilise pour mon application est PHPMailer 5.1 qui a le support de DKIM (et est PHP 5 seulement), mais après avoir fait la recherche, j'ai décidé que 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 que DKIM au niveau de la bibliothèque de messagerie PHP est la meilleure solution http://dkim.worxware.com/.

Bonne chance à vous.

+0

Infos utiles, mais pas pour moi, Pardon. J'utilise un fournisseur de messagerie SMTP externe et n'ai aucun contrôle sur leur code. Je dois les utiliser car j'envoie des milliers de courriels. Les autres suggestions ne s'appliquent pas directement à ma question. –

+0

@Alex: J'étais sur le point de coder ma propre implémentation DKIM pour PHP mais je suis avec jigglee: le MTA devrait le gérer. Imaginez que le MTA modifie/reformate le contenu de l'e-mail, il n'y a aucun moyen pour PHP de le savoir à priori et cela ferait tomber les clés privées/publiques, cela aurait un effet négatif. –

+0

MISE À JOUR: J'ai depuis trouvé une meilleure combinaison: postfix + opendkim. Je sais que cela n'aborde toujours pas le problème d'un fournisseur SMTP externe d'Alex, mais je connais d'autres personnes qui trouvent cette recherche de threads qui ont une racine sur le serveur de messagerie. [Ce blog] (http://blog.calmblue.net/2010/05/opendkim-postfix-centos/) est un excellent guide pour le mettre en place. – codercake

11

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

Voici quelques exemples:

// 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); 
+0

Ceci vous mènera au téléchargement de la dernière version: http://code.google.com/a /apache-extras.org/p/phpmailer/downloads/list En outre, l'administrateur de projet original de PHPMailer a créé un site Web pour créer les fichiers DKIM nécessaires pour signer des emails avec PHPMailer: http://dkim.worxware.com/ – Cameron

10

Une classe uniquement pour DKIM qui est un spin-off de PHPMailer, mais avec des améliorations en ce qui concerne le respect de la RFC et agréable et nettoyer le code:

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); 
+0

Le projet a été transféré à GitHub: https://github.com/louisameline/php-mail-signature – Gerald

13

Ceci est un qui a été sur mon radar pendant un moment et n'a pas pu trouver une réponse définitive à la question originale dans ce fil partout sur le web. J'ai maintenant été en mesure de mettre en œuvre l'envoi de courrier électronique SMTP signé DKIM avec PHP/Pear. Voici les étapes requises.

  1. Je trouve 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 avec du 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 en tableau. Dans mon code, je l'ai appelé 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 ma recherche limitée, les en-têtes les plus ajoutés sont les en-têtes Date et Message-ID, ainsi mon tableau d'en-têtes ressemble à ceci: Note: J'ai utilisé ceci pour envoyer un email HTML, changer pour convenir! De plus, ajoutez votre domaine en tant que la 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 obtiendrez alors d'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 d'envoyer des courriels via SMTP avec PHP/PEAR. Le code de fonctionnement 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 essentiel pour que DKIM fonctionne avec les emails SMTP (ou le courrier PHP) est de s'assurer que vous spécifiez tous les en-têtes ajoutés à votre email par votre MTA, puis de signer les en-têtes, sujet et le corps du message, et enfin inclure cette partie signée avec votre en-tête.