Настройка DomainKeys/DKIM в SMTP-клиенте на основе PHP

Похоже, что есть несколько замечательных библиотек для подписи электронных писем DomainKeys на C#/.NET, но мне очень трудно найти такую ​​же поддержку PHP. Может я не смотрю в нужном месте?

Единственный, который я нашел, это http://php-dkim.sourceforge.net/; это выглядит невероятно хакерским и поддерживает только PHP4. Учитывая популярность PHP и то, насколько важны DomainKeys для классификации электронной почты как не спама, я бы ожидал более совершенных инструментов; ты знаешь что-нибудь? Какие еще уловки вы бы порекомендовали?

Дополнительная информация: я использую внешнего SMTP-провайдера, потому что мне нужно отправлять тысячи писем в день.

4 ответа

Решение

Я бы порекомендовал поддержку DKIM на уровне MTA, чтобы вся электронная почта, генерируемая вашим сервером для данного домена, была подписана по умолчанию. (если у вас нет действительно веской причины не подписывать всю сгенерированную сервером электронную почту для домена).

Лучшей отправной точкой в ​​моем поиске настроек DKIM на LAMP с помощью dkim-milter и sendmail (на CentOS 5.2 в моем случае) была публикация Джеффа Этвуда об отправке электронных писем с помощью кода.

Я согласен с ним, что первые две вещи, на которые вы должны обратить внимание, это обратная запись PTR и подписание DKIM.

Также очень важно:

  1. IP-адрес ящика для отправки электронной почты, еще не занесенного в черный список.
  2. убедитесь, что postmaster@emailsendingdomain.com является действующим почтовым ящиком
  3. если электронная почта, сгенерированная вашим сервером, должна появиться откуда-то еще (например, контактная форма, в которой нужно указать имя / адрес электронной почты, указанный в форме), следуйте этим рекомендациям для заголовков электронной почты.

Вот проверка черного списка адресов электронной почты, которую я использовал.

Эти 5 вещей решат, возможно, 95% ваших проблем с доставкой электронной почты.

Это руководство по Fedora/dkim-milter/postfix также очень хорошо.

Почтовой библиотекой PHP, которую я использую для своего приложения, является PHPMailer 5.1, которая поддерживает DKIM (и только PHP 5), но после исследования я решила, что реализация на уровне sendmail - лучшее решение. Как вы можете видеть, даже автор PHPMailer 5.1 не предлагает DKIM на уровне почтовой библиотеки PHP - лучшее решение http://dkim.worxware.com/.

Удачи вам.

Это тот, который был на моем радаре некоторое время и не мог найти окончательного ответа на первоначальный вопрос в этой теме нигде в Интернете. Теперь я могу реализовать отправку подписанного SMTP-сообщения DKIM с PHP/Pear. Ниже приведены необходимые шаги.

  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 не изменял сообщение после того, как вы его подписали. В моем ограниченном исследовании самыми добавленными заголовками являются заголовки Date и Message-ID, поэтому мой массив заголовков выглядит следующим образом: Примечание: я использовал это для отправки html-письма, измените, чтобы удовлетворить! Кроме того, добавьте свой домен в качестве последней части идентификатора сообщения

    $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;
    

Остальная часть кода является нормальным кодом для отправки электронной почты через SMTP с PHP/Pear. Полный рабочий код:

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

Класс, предназначенный исключительно для DKIM, который является побочным продуктом PHPMailer, но с улучшениями, касающимися соблюдения 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);
Другие вопросы по тегам