这是我关注了一段时间的问题,在网络上的任何地方都无法在此线程中找到原始问题的明确答案。我现在已经能够使用 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 在您签名后不会修改邮件。在我有限的研究中,添加最多的标头是 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
然后,您将使用上面提到的修改后的 dkim.php 对您的电子邮件进行签名并将签名添加到 headers 数组,也就是
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);
?>
PS。以防万一你没有注意到,用你自己的替换值!
因此,使 DKIM 与 SMTP 电子邮件(或实际上是 PHP 邮件)一起工作所需要做的就是确保您指定由 MTA 添加到电子邮件中的所有标头,然后签署标头、主题和正文消息,最后在您的标题中包含该签名部分。