首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在基于PHP的SMTP客户端中设置DomainKeys/DKIM

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

Stack Overflow用户
提问于 2010-05-10 07:43:37
回答 4查看 45K关注 0票数 31

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

我找到的唯一一个是http://php-dkim.sourceforge.net/;它看起来非常粗糙,而且只支持PHP4。考虑到PHP的流行程度,以及DomainKeys对于非垃圾邮件分类的重要性,我希望有更好的工具;你知道有什么工具吗?你还有其他的建议吗?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-22 10:32:59

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

在我的谷歌搜索中,使用dkim-milter和sendmail (在我的例子中是在CentOS 5.2上)在LAMP上设置DKIM的最佳起点是Jeff Atwood's post about sending emails through code

我同意他的观点,首先要解决的两件事是反向PTR记录和DKIM签名。

同样非常重要的是:

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

这是我使用的email ip address blacklist checker

这5件事可能会解决你95%的电子邮件递送问题。

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

我在我的应用程序中使用的PHPMailer库是PHPMailer 5.1,它支持DKIM5.1(并且只支持PHP5),但在研究之后,我认为在sendmail级别实现是一个更好的解决方案。正如您所看到的,即使是PHP5.1的作者也没有建议PHPMailer邮件库级别的http://dkim.worxware.com/是最好的解决方案。

祝你好运。

票数 25
EN

Stack Overflow用户

发布于 2012-10-23 08:45:25

这是一个我已经关注了一段时间的问题,在网络上的任何地方都找不到对原始问题的明确答案。我现在已经能够用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. 确保包含大多数邮件头,以便在您对邮件进行签名后不会对其进行修改。在我有限的研究中,添加最多的报头是Date和Message-ID报头,因此我的报头数组看起来像这样:注意:我用它发送了一封html电子邮件,请根据需要进行更改!此外,将您的域添加为Message-ID的最后一部分

$headers =$headers( '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

  • 您将可以使用上面提到的修改后的dkim.php对您的电子邮件进行签名,并将签名添加到headers数组中,即

需要'dkimNEW.php';$dkim = AddDKIM($headers,$subject,$body);$headers‘$dkim Signature’= $dkim;

代码的其余部分是使用PHP/Pear通过SMTP发送电子邮件的普通代码。完整的工作代码是:

代码语言:javascript
复制
<?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);

?>

PS。以防你没有注意到,用你自己的值替换!

因此,要让DKIM与SMTP电子邮件(或PHP邮件)一起工作,需要做的就是确保指定MTA添加到电子邮件中的所有标头,然后对邮件的标头、主题和正文进行签名,最后将签名部分包含在标头中。

票数 16
EN

Stack Overflow用户

发布于 2011-01-29 15:06:19

你有没有尝试过:phpMailDomainSigner它支持面向对象风格的DKIM-Signature和DomainKey-Signature。

这里有一些例子:

代码语言:javascript
复制
// 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);
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2799611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档