Настройка DomainKeys/DKIM в PHP-SMTP-клиенте
Похоже, что есть несколько отличных библиотек для подписи электронной почты DomainKeys на С#/. NET, но мне очень трудно найти ту же поддержку PHP. Может быть, я не смотрю в нужное место?
Единственное, что я нашел, - http://php-dkim.sourceforge.net/; он выглядит невероятно взломанным и поддерживает только PHP4. Учитывая, насколько популярным является PHP, и насколько важны DomainKeys для классификации по электронной почте как спам, я бы ожидал лучших инструментов; знаете ли вы? Любые другие трюки, которые вы бы рекомендовали?
Дополнительная информация: я использую внешний SMTP-провайдер, потому что мне нужно отправлять тысячи писем в день.
Ответы
Ответ 1
Я бы рекомендовал поддержку DKIM на уровне MTA, поэтому по умолчанию ваш почтовый сервер, созданный сервером для данного домена, подписан. (если у вас нет повода для того, чтобы не подписывать все созданные сервером письма для домена).
Лучшая отправная точка в моем поисковом рассылке для установки DKIM на LAMP с dkim-milter и sendmail (на CentOS 5.2 в моем случае) была Jeff Atwood post about отправка писем через код.
Я согласен с ним в том, что первыми двумя вещами, которые вам следует адресовать, являются обратная запись PTR и подпись DKIM.
Также очень важно:
- IP-адрес поля для отправки электронной почты, не входящего в черный список.
- убедитесь, что [email protected] является допустимым почтовым ящиком
- если ваш сервер, созданный по электронной почте, должен появиться откуда-то еще (например, контактная форма, необходимая для получения имени или электронной почты, предоставленная в форме) следовать этим рекомендации для заголовков электронной почты.
Вот email ip address blacklist checker, который я использовал.
Эти 5 вещей разрешат, возможно, 95% ваших проблем с доставкой электронной почты.
Этот Руководство для Fedora/dkim-milter/postfix тоже очень хорошо.
Почтовая библиотека PHP, которую я использую для моего приложения, - это PHPMailer 5.1, поддерживающая DKIM (и только PHP 5), но после проведения исследования я решил, что внедрение на уровне sendmail было лучшим решением. Как вы можете видеть, даже автор PHPMailer 5.1 не предлагает DKIM на уровне почтовой библиотеки PHP - лучшее решение http://dkim.worxware.com/. p >
Удачи вам.
Ответ 2
Это тот, который был на моем радаре некоторое время и не смог найти окончательного ответа на исходный вопрос в этой теме в любом месте в Интернете. Теперь я смог реализовать отправку DKIM подписанного SMTP-сообщения с помощью PHP/Pear. Ниже приведены требуемые шаги.
-
Я нашел модифицированную версию 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.
-
Убедитесь, что вы включили большинство заголовков, чтобы 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
-
Затем вы сможете использовать модифицированный dkim.php, упомянутый выше, чтобы подписать вашу электронную почту и добавить подпись в массив заголовков, aka
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 <[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), чтобы вы указали все заголовки, которые добавлены в ваш адрес электронной почты вашим MTA, затем подписывайте заголовки, тему и тело сообщения, и, наконец, включить эту подписанную часть с вашим заголовком.
Ответ 3
Попробуйте: 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);
Ответ 4
Класс исключительно для 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);