2010-05-09 171 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添加到您的電子郵件中的所有標題,然後簽署標題,郵件的主題和正文,並最終將您的標題包含在簽名部分中。