在基于PHP的SMTP客户端中设置DomainKeys/DKIM

Ale*_*ein 26 php smtp email-spam domainkeys dkim

看起来有一些很棒的库可以在C#/ .NET上对DomainKeys进行电子邮件签名,但是我很难找到同样的PHP支持.也许我不是在寻找合适的地方?

我找到的唯一一个是http://php-dkim.sourceforge.net/ ; 它看起来非常h​​acky并且仅支持PHP4.考虑到PHP的流行程度,以及DomainKeys对于非垃圾邮件分类的重要性,我希望有更好的工具; 你知道吗?你推荐的任何其他技巧?

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

cod*_*ake 22

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

我在google搜索中使用dkim-milter和sendmail(在我的案例中为CentOS 5.2)上使用LAMP设置DKIM的最佳起点是Jeff Atwood关于通过代码发送电子邮件的帖子.

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

同样非常重要:

  1. 发送电子邮件的框的IP地址尚未列入黑名单.
  2. 确保postmaster@emailsendingdomain.com是一个有效的电子邮箱
  3. 如果您的服务器生成的电子邮件需要来自其他地方(例如需要来自表单中提供的姓名/电子邮件的联系表单),请遵循以下电子邮件标题指南.

这是我使用的电子邮件IP地址黑名单检查器.

这5件事可能会解决95%的电子邮件可传递性问题.

这本Fedora/dkim-milter/postfix指南也非常好.

我用于我的应用程序的PHP邮件库是PHPMailer 5.1,它支持DKIM(仅限PHP 5),但在进行研究后,我决定在sendmail级别实现更好的解决方案.正如您所看到的,即使PHPMailer 5.1的作者也不建议PHP邮件库级别的DKIM是最佳解决方案http://dkim.worxware.com/.

祝你好运.


Nep*_*luz 16

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

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

  2. 确保包含大多数标头,以便MTA在签名后不会修改邮件.在我的有限研究中,添加最多的标题是Date和Message-ID标题,因此我的标题数组如下所示:注意:我用它来发送html电子邮件,更改为适合!此外,将您的域添加为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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,您将使用上面提到的修改后的dkim.php来签署您的电子邮件并将签名添加到头部数组,又名

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

其余代码是使用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);

?>
Run Code Online (Sandbox Code Playgroud)

PS.如果您没有注意到,请用您自己的值替换值!

因此,使DKIM与SMTP电子邮件(或实际上是PHP邮件)一起工作所需要的只是确保您指定MTA添加到电子邮件中的所有标题,然后签署标题,主题和正文.消息,最后包含带标题的签名部分.


ama*_*llz 11

您是否尝试过:phpMailDomainSigner它支持面向对象样式的DKIM-Signature和DomainKey-Signature.

这里有一些例子:

// 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);
Run Code Online (Sandbox Code Playgroud)


Lou*_*ine 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);
Run Code Online (Sandbox Code Playgroud)