これはしばらくの間私のレーダーに載っていて、ウェブ上のどこにもこのスレッドの元の質問に対する決定的な答えを見つけることができなかったものです。これで、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メールの送信に使用しましたが、それに合わせて変更してください。また、メッセージ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);
?>
PS。気づかなかった場合に備えて、値を独自のものに置き換えてください。
したがって、DKIMをSMTP電子メール(または実際にはPHPメール)で機能させるために基本的に必要なのは、MTAによって電子メールに追加されるすべてのヘッダーを指定し、ヘッダー、件名、および本文に署名することです。メッセージを送信し、最後にその署名された部分をヘッダーに含めます。