代码之家  ›  专栏  ›  技术社区  ›  Alex Weinstein

在基于php的smtp客户端中设置domainkeys/dkim[已关闭]

  •  23
  • Alex Weinstein  · 技术社区  · 14 年前

    看起来有一些很棒的库可以在c/.net上对电子邮件进行域键签名,但是我很难找到对php的同样支持。也许我找的地方不对?

    我唯一找到的是 http://php-dkim.sourceforge.net/ ;它看起来非常粗糙,只支持php4。考虑到php有多流行,以及域键对于电子邮件分类(非垃圾邮件)有多重要,我希望有更好的工具;你知道吗?你还有其他的建议吗?

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

    4 回复  |  直到 14 年前
        1
  •  21
  •   The Pixel Developer    14 年前

    我建议在MTA级别支持DKIM,这样默认情况下,服务器为给定域生成的所有电子邮件都是签名的。(除非你有很好的理由不签署一个域的所有服务器生成的电子邮件)。

    在我的google中,使用dkim milter和sendmail(在我的例子中是centos 5.2)在lamp上设置dkim的最佳起点是 Jeff Atwood's post about sending emails through code .

    我同意他的看法,你应该解决的前两件事是反向ptr记录和dkim签名。

    同样非常重要的是:

    1. 发送电子邮件的框的IP地址尚未被列入黑名单。
    2. 确保postmaster@emailsendingdomain.com是有效的电子邮件框
    3. 如果您的服务器生成的电子邮件需要来自其他地方(如联系人表单需要来自表单中提供的姓名/电子邮件) follow these guidelines for email headers .

    这是 email ip address blacklist checker 我用过的。

    这5件事也许能解决95%的电子邮件传递问题。

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

    我在应用程序中使用的php邮件库是phpmailer 5.1,它支持dkim(并且仅支持php5),但经过研究,我决定在sendmail级别实现是一个更好的解决方案。如您所见,即使phpmailer 5.1的作者也不建议在php邮件库级别使用dkim是最好的解决方案。 http://dkim.worxware.com/ .

    祝你好运。

        2
  •  14
  •   Nepaluz    12 年前

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

    1. 我从 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 mail一起工作,那么您所需要的就是dkim.php文件,正如博客中所说,该文件经过了一些修改,以处理作为数组传递的头。在我的代码中,我将其命名为dkimnew.php。

    2. 请确保包含大多数邮件头,以便MTA在您对邮件签名后不会对其进行修改。在我有限的研究中,添加最多的标题是日期和邮件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来签署您的电子邮件,并将签名添加到headers数组,aka

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

    剩下的代码是使用php/pear通过smtp发送电子邮件的普通代码。完整的工作代码是:

    <?php
        require_once 'Mail.php';
        require_once 'Mail/mime.php';
      // set all of the parameters
        $subject = 'Test of DKIM';
        $from = 'My Name <myname@mydomain.com>';
        $to = 'First Recipient <recipient1@domain.com>';
        $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('recipient1@domain.com', 'recipient2@domain.com');
        $mail = $smtp->send($recipients, $headers, $body);
    
    ?>
    

    如果你没有注意到,用你自己的值替换!

    因此,使dkim与smtp电子邮件(或者实际上是php邮件)协同工作所需的全部工作就是确保指定了mta添加到电子邮件中的所有邮件头,然后对邮件头、主题和正文进行签名,最后在hEADER。

        3
  •  11
  •   amarullz    13 年前

    你有没有试过: 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);
    
        4
  •  10
  •   Louis Ameline    12 年前

    一个专为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);