web-dev-qa-db-ja.com

PHPベースのSMTPクライアントでのDomainKeys / DKIMの設定

C#/。NETでメールのDomainKeys署名を行うための優れたライブラリーがいくつかあるようですが、PHPの同じ種類のサポートを見つけるのに本当に苦労しています。多分私は正しい場所を探していませんか?

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

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

28
Alex Weinstein

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

Dkim-milterとsendmail(私の場合はCentOS 5.2)を使用してLAMPでDKIMセットアップを取得するための私のグーグルの開始点は Jeff Atwoodのコードによるメール送信に関する投稿 でした。

あなたが最初に取り組むべき2つのことは、リバースPTRレコードとDKIM署名であることに同意します。

また非常に重要:

  1. まだブラックリストに登録されていないメールを送信するためのボックスのIPアドレス。
  2. [email protected]が有効なメールボックスであることを確認してください
  3. サーバーが生成した電子メールが他の場所から送信されたように見える必要がある場合(フォームで提供された名前/電子メールから送信された連絡先フォームなど) 電子メールヘッダーに関するこれらのガイドラインに従ってください

これが、私が使用した email ip address blacklist checker です。

これらの5つのことで、おそらくメール配信の問題の95%が解決されます。

これ Fedora/dkim-milter/postfixのガイド も非常に優れています。

PHP私のアプリで使用するメールライブラリは、DKIMをサポートするPHPMailer 5.1です(PHP 5のみ))が、調査の結果、ご覧のとおり、PHPMailer 5.1の作成者でさえ、DKIMをPHPメールライブラリレベルが最適なソリューションであると提案していません http: //dkim.worxware.com/

幸運を祈ります。

22
codercake

これは、しばらくの間私のレーダーにあり、このスレッドでWeb上のどこにも元の質問に対する明確な答えを見つけることができませんでした。これで、PHP/Pearを使用したDKIM署名付きSMTPメールの送信を実装できました。以下は必要な手順です。

  1. http://www.ra726.net/blog/2010/07/20/sending-email-to-gmail-from-php-without-being-marked-asからDKIMの修正バージョンを見つけました-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 <[email protected]>';
    $to = 'First Recipient <[email protected]>';
    $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('[email protected]', '[email protected]');
    $mail = $smtp->send($recipients, $headers, $body);

?>

PS。気づかなかった場合に備えて、値を独自のものに置き換えてください。

したがって、DKIMがSMTP電子メール(またはPHP mail))で動作するようにするために基本的に必要なことは、MTAによって電子メールに追加されるすべてのヘッダーを指定することです。次に、メッセージのヘッダー、件名、本文に署名し、最後にその署名された部分をヘッダーに含めます。

15
Nepaluz

試してみてください: 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);
11
amarullz

PHPMailerからのスピンオフであるDKIM専用のクラスですが、RFCの尊重とnice-and-cleanコードが改善されています。

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);
10
Louis Ameline