看起来有一些很好的库可以在C#/.NET上对电子邮件进行域密钥签名,但我很难找到同样支持PHP的库。也许我没有找对地方?
我唯一找到的是http://php-dkim.sourceforge.net/;它看起来非常不专业并且只支持PHP4。考虑到PHP的普及度以及域密钥对于将电子邮件分类为非垃圾邮件的重要性,我期望有更好的工具;你知道吗?你有什么其他建议吗?
额外信息:我正在使用外部SMTP提供程序,因为我每天需要发送数千封电子邮件。
看起来有一些很好的库可以在C#/.NET上对电子邮件进行域密钥签名,但我很难找到同样支持PHP的库。也许我没有找对地方?
我唯一找到的是http://php-dkim.sourceforge.net/;它看起来非常不专业并且只支持PHP4。考虑到PHP的普及度以及域密钥对于将电子邮件分类为非垃圾邮件的重要性,我期望有更好的工具;你知道吗?你有什么其他建议吗?
额外信息:我正在使用外部SMTP提供程序,因为我每天需要发送数千封电子邮件。
这是一件我已经关注了一段时间的事情,在整个网络上都找不到对原问题的明确定义,现在我已经能够使用PHP/Pear发送带有DKIM签名的SMTP电子邮件。以下是所需步骤:
我在 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。
确保包含大多数标题,以便MTA在您签署之后不会修改消息。根据我的有限研究,最常添加的标题是日期和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
然后,您将能够使用上述修改后的 dkim.php 对您的电子邮件进行签名,并将签名添加到头部数组中,即
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添加到电子邮件中的所有标头,然后对消息的标头、主题和正文进行签名,并最终将签名部分与标头一起包含。
你尝试过这个吗: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);
这是一个专门用于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);