31

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

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

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

4

4 に答える 4

25

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/

幸運を祈ります。

于 2010-05-22T02:32:58.643 に答える
16

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

  1. 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という名前を付けています。

  2. 署名した後に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
    
  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によって電子メールに追加されるすべてのヘッダーを指定し、ヘッダー、件名、および本文に署名することです。メッセージを送信し、最後にその署名された部分をヘッダーに含めます。

于 2012-10-23T00:45:24.507 に答える
11

試してみましたか : 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);
于 2011-01-29T07:06:18.813 に答える
10

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);
于 2012-04-29T19:14:15.337 に答える