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

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

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

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

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

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

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

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

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

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

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

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

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

Удачи вам.

Это тот, который был на моем радаре некоторое время и не смог найти окончательного ответа на исходный вопрос в этой теме в любом месте в Интернете. Теперь я смог реализовать отправку DKIM подписанного SMTP-сообщения с помощью 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);