質問

C#/.NET で電子メールの DomainKeys 署名を行うための優れたライブラリがいくつかあるようですが、PHP に対して同様のサポートを見つけるのに非常に苦労しています。もしかしたら、私が探している場所が間違っているのでしょうか?

私が見つけた唯一のものは http://php-dkim.sourceforge.net/;見た目は信じられないほどハックで、PHP4 のみをサポートしています。PHP の人気の高さと、電子メールを非スパムとして分類するために DomainKeys がどれほど重要であるかを考えると、私はより優れたツールを期待します。何か知っていますか?他にお勧めのトリックはありますか?

追加情報:1 日に何千通もの電子メールを送信する必要があるため、外部 SMTP プロバイダーを使用しています。

役に立ちましたか?

解決

MTA レベルで DKIM をサポートし、特定のドメインに対してサーバーが生成したすべての電子メールがデフォルトで署名されるようにすることをお勧めします。(ドメインに対してサーバーが生成したすべての電子メールに署名しない正当な理由がない限り)。

dkim-milter と sendmail (私の場合は CentOS 5.2 上) を使用して LAMP 上で DKIM セットアップを取得するための私のグーグル検索の最良の出発点は、 コードを介した電子メールの送信に関する Jeff Atwood の投稿.

最初に対処すべき 2 つは、リバース PTR レコードと DKIM 署名であるという彼の意見に私も同意します。

こちらも非常に重要です:

  1. まだブラックリストに登録されていない電子メールを送信するボックスの IP アドレス。
  2. postmaster@emailsendingdomain.com が有効なメール ボックスであることを確認してください
  3. サーバーで生成された電子メールが他の場所から送信されたように見える必要がある場合 (お問い合わせフォームがフォームで指定された名前/電子メールから送信される必要がある場合など) 電子メールのヘッダーについては、次のガイドラインに従ってください.

ここにあります メールIPアドレスブラックリストチェッカー 私が使ったもの。

これら 5 つのことにより、おそらく電子メールの到達性の問題の 95% が解決されます。

これ Fedora/dkim-milter/postfix のガイド もとても良いです。

私のアプリで使用している PHP メール ライブラリは、DKIM サポートを備えた PHPMailer 5.1 (PHP 5 のみ) ですが、調査を行った結果、sendmail レベルで実装する方がより良い解決策であると判断しました。ご覧のとおり、PHPMailer 5.1 の作者ですら、PHP メール ライブラリ レベルの DKIM が最良のソリューションであるとは示唆していません。 http://dkim.worxware.com/.

幸運を祈ります。

他のヒント

これはしばらく私の関心事でしたが、このスレッドの元の質問に対する決定的な答えはウェブ上のどこにも見つかりませんでした。PHP/Pear を使用して DKIM 署名付き SMTP 電子メールの送信を実装できるようになりました。以下に必要な手順を示します。

  1. DKIM の修正バージョンを見つけました。 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 メールで動作させる必要がある場合、必要なのは dkim.php ファイルだけです。ブログにあるように、このファイルは配列として渡されるヘッダーを処理するように少し変更されています。私のコードでは、dkimNEW.php という名前を付けました。

  2. 署名後に MTA がメッセージを変更しないように、ほとんどのヘッダーを必ず含めてください。私の限られた調査では、最も多く追加されたヘッダーは日付ヘッダーとメッセージ 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
    
  3. 次に、上記の変更された 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 によって電子メールに追加されるすべてのヘッダーを確実に指定し、ヘッダー、件名、本文に署名することだけです。メッセージを編集し、最後にその署名部分をヘッダーに含めます。

試してみましたか: phpMailDomainSigner オブジェクト指向スタイルの DKIM 署名と DomainKey 署名をサポートします。

ここにいくつかの例を示します。

// 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);

PHPMailer から派生した DKIM 専用のクラスですが、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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top