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

StackOverflow https://stackoverflow.com/questions/2799611

Вопрос

Похоже, что есть несколько отличных библиотек для подписания электронных писем с помощью 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.

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

  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/.

Удачи вам.

Другие советы

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

?>

ПС.На всякий случай, если вы не заметили, замените значения на свои!

Таким образом, все, что по сути необходимо для того, чтобы 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top