2010-05-09 172 views
21

看起来好像有一些很棒的库可以在C#/ .NET上执行DomainKeys电子邮件签名,但是我很难找到相同的类型对PHP的支持。也许我没有找到正确的地方?在基于PHP的SMTP客户端中设置DomainKeys/DKIM

我发现的唯一一个是http://php-dkim.sourceforge.net/;它看起来非常难以置信,只支持PHP4。考虑到PHP的受欢迎程度,以及DomainKeys对电子邮件分类非垃圾邮件的重要程度,我期望有更好的工具;你知道吗?你会推荐的其他技巧?

其他信息:我正在使用外部SMTP提供程序,因为我需要每天发送数千封电子邮件。

+0

下投票 \t 下面是例子功能是如何发送电子邮件与DKIM和PHP mail()函数: https://github.com/breakermind/PHP-DKIM – 2017-09-26 12:07:48

回答

21

我建议在MTA级别上使用DKIM支持,因此您为给定域的所有服务器生成的电子邮件都默认签名。 (除非您有充分的理由不签署域名的所有服务器生成的电子邮件)。

在Google上使用dkim-milter和sendmail(在我的情况下,在CentOS 5.2上)在LAMP上获取DKIM安装的最佳起点是Jeff Atwood's post about sending emails through code

我同意他的观点,你应该解决的前两件事是反向PTR记录和DKIM签名。

也很重要:

  • IP盒子的地址发送电子邮件尚未被列入黑名单。
  • 确保[email protected]是一个有效的电子邮箱
  • 如果你的服务器生成的电子邮件需要似乎来自其他地方(如联系表格需要来自于形式提供的名称/电子邮件)follow these guidelines for email headers
  • 这是我使用的email ip address blacklist checker

    这5件事情可能会解决您的电子邮件传递能力问题的95%。

    这个Guide for Fedora/dkim-milter/postfix也很好。

    我用于我的应用程序的PHP邮件库是PHPMailer 5.1,它具有DKIM支持(并且仅支持PHP 5),但是在做了研究之后,我决定在sendmail级别实现是一个更好的解决方案。正如你所看到的,即使PHPMailer 5.1的作者也不建议在PHP邮件库级别DKIM是最好的解决方案http://dkim.worxware.com/

    祝你好运。

    +0

    有用的信息,但不适合我,抱歉。我正在使用外部SMTP电子邮件提供程序,无法控制其代码。我必须使用它们,因为我正在发送数千封电子邮件。 其余的建议并不直接适用于我的问题。 – 2010-06-12 07:04:08

    +0

    @Alex:我正要为PHP编写我自己的DKIM实现,但我使用jigglee:MTA应该处理它。想象一下,MTA修改/重新格式化电子邮件内容,PHP无法事先知道这一点,并且这会使私钥/公钥崩溃,这会产生不利影响。 – 2010-07-28 18:55:59

    +0

    更新:我从那以后找到了一个更好的组合:postfix + opendkim。我知道这仍然不能解决Alex的外部SMTP提供者问题,但我知道其他人发现此线程正在搜索邮件服务器上的根。 [这篇博文](http://blog.calmblue.net/2010/05/opendkim-postfix-centos/)是一个很好的指导。 – codercake 2011-07-19 16:54:07

    11

    你试试看:phpMailDomainSigner它支持面向对象风格的DKIM签名和DomainKey签名。

    这里的一些示例:

    // 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

    这将带您下载最新版本:http://code.google.com/a /apache-extras.org/p/phpmailer/downloads/list 此外,PHPMailer的原始项目管理员创建了一个网站,用于创建使用PHPMailer为电子邮件签名所需的DKIM文件:http://dkim.worxware.com/ – Cameron 2011-09-19 18:52:56

    10

    甲仅用于DKIM类,这是从PHPMailer的分拆,但与关于关于RFC和漂亮和 - 干净的代码的改进:

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

    实施例:

    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

    该项目转移到GitHub:https://github.com/louisameline/php-mail-signature – Gerald 2017-03-17 01:08:19

    13

    这是一个已经在我的雷达一段时间,并无法找到一个明确的答案在这个线程在这个线程的任何地方的原始问题。我现在已经能够实现用PHP/Pear发送DKIM签名的SMTP电子邮件。以下是所需的步骤。

    1. 我找到了DKIM的修改版本从http://www.ra726.net/blog/2010/07/20/sending-email-to-gmail-from-php-without-being-marked-as-spam/(您可以通过http://www.ra726.net/php-dkim.zip下载)。如果你已经实现了DKIM并且只需要使它与SMP邮件一起工作,那么你所需要的就是dkim.php文件,正如博客所说的那样,该文件稍作修改以处理作为数组传递的头文件。在我的代码中,我将其命名为dkimNEW.php。

    2. 确保包含大多数标头,以便MTA在签名后不会修改消息。在我有限的研究中,最多添加的头文件是Date和Message-ID头文件,因此我的头文件数组看起来像这样:注意:我使用它来发送html电子邮件,并进行更改以适合!此外,添加您的域名作为邮件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. 然后你会得到利用上述修改dkim.php签署您的电子邮件和签名添加到阵列头,又名

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

    代码的其余部分是正常码通过与PHP/SMTP梨发送电子邮件。完整的工作代码是:

    <?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。以防万一您没有注意到,请用您自己的值替换!

    因此,使DKIM与SMTP电子邮件(甚至PHP邮件)一起工作所需的一切就是确保您指定由MTA添加到您的电子邮件中的所有标题,然后签署标题,邮件的主题和正文,并最终将您的标题包含在签名部分中。