Настройка DomainKeys/DKIM в SMTP-клиенте на основе PHP [закрыто]
-
04-10-2019 - |
Вопрос
Похоже, что есть несколько отличных библиотек для подписания электронных писем с помощью DomainKeys на C#/.NET, но мне очень трудно найти такую же поддержку для PHP.Может я не там ищу?
Единственное, что я нашел, это http://php-dkim.sourceforge.net/;он выглядит невероятно хакерски и поддерживает только PHP4.Учитывая, насколько популярен PHP и насколько важны DomainKeys для классификации электронной почты как неспама, я бы ожидал лучших инструментов;ты знаешь какой-нибудь?Какие еще трюки вы бы порекомендовали?
Дополнительная информация:Я использую внешнего поставщика SMTP, потому что мне нужно отправлять тысячи электронных писем в день.
Решение
Я бы рекомендовал поддержку DKIM на уровне MTA, чтобы вся электронная почта, сгенерированная вашим сервером для данного домена, была подписана по умолчанию.(если только у вас нет действительно веской причины не подписывать всю электронную почту, генерируемую сервером для домена).
Лучшей отправной точкой в моих поисках в Google для настройки DKIM на LAMP с помощью dkim-milter и sendmail (в моем случае на CentOS 5.2) было Сообщение Джеффа Этвуда об отправке электронных писем с помощью кода.
Я согласен с ним, что первые две вещи, которые вам следует решить, — это обратная запись PTR и подпись DKIM.
Также очень важно:
- IP-адрес ящика для отправки электронной почты еще не внесен в черный список.
- убедитесь, что postmaster@emailsendingdomain.com является действительным почтовым ящиком
- если электронное письмо, сгенерированное вашим сервером, должно появиться откуда-то еще (например, контактная форма должна исходить от имени/адреса электронной почты, указанного в форме) следуйте этим рекомендациям для заголовков электронных писем.
Здесь проверка черного списка IP-адресов электронной почты что я использовал.
Эти 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.Ниже приведены необходимые шаги.
Я нашел модифицированную версию 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, упомянутый выше, для подписи вашего электронного письма И добавить подпись в массив заголовков, т. е.
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);
?>
ПС.На всякий случай, если вы не заметили, замените значения на свои!
Таким образом, все, что по сути необходимо для того, чтобы 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);