Отправка DKIM подписанной электронной почты в Outlook.COM через PHP

У меня есть почтовый сервер, хорошо работающий с настройками SPF, DKIM и обратным DNS. Я могу отправить электронную почту на Outlook.com, используя что-то вроде:

echo "This is only a test" | mail [email protected]

Проблема возникает, когда я пытаюсь отправить электронную почту через PHP с использованием того же сервера:

$header .= "Return-Path: Some User <[email protected]>\r\n";
$header .= "From: Some User <[email protected]>\r\n";
$header .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "User-Agent: Some User Mail Sender\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n";

mail("[email protected]","My title", "Message body", $header);

Я попытался проверить свое сообщение с помощью appmaildev.com, и в отчете говорится:

DKIM result: fail (wrong body hash: <*** body hash ***>)

Даже с этой ошибкой Outlook.com говорит, что он прошел проверку DKIM, но все сообщения, отправленные почтовой программой PHP, отправляются в папку нежелательной почты. Вот примеры сообщений, отправленных непосредственно через Bash и через PHP: http://pastebin.com/ndXJszic

Кто-нибудь может мне помочь?

Спасибо.

ИЗМЕНИТЬ После удаления \r из заголовков ошибка хеша тела DKIM исчезла. Но я по-прежнему не могу отправлять электронные письма в Outlook...

Ответ 1

Это может быть проблема с разрешением.

Ваш веб-сервер обычно работает как другой пользователь, чем когда вы используете mail в командной строке, поэтому настройка заголовка From: приведет к созданию дополнительных предупреждающих заголовков в исходящем письме.

Там файл, который вы можете изменить на своем сервере, называется /etc/mail/trusted-users. Убедитесь, что пользователь apache (или любой другой пользователь, с которым работает PHP скрипт работает как), появляется в этом файле; если нет, добавьте имя пользователя, а затем перезагрузите sendmail.

Пример содержимого /etc/mail/trusted-users:

# trusted-users - users that can send mail as others without a warning
# apache, mailman, majordomo, uucp, are good candidates
apache

Ответ 2

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

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

Система антиспама в outlook.com, как и многие другие, проверяет много вещей, например ip-адрес отправителя, количество сообщений электронной почты из этого ip в час, содержание электронной почты (текст, ссылки), репутацию и т.д..

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

Ответ 3

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

<?php

// Include the Pear Mail header
require_once '/usr/share/php/Mail.php';


class MailWrapper {
    public static function Send($to, $subject, $body) {
        // Email details
        $from = 'No Reply <[email protected]>';
        $server = 'mail.yourdomain.com';
        $port = 25;
        $username = '[email protected]';
        $password = 'yourp4ssw0rd';
        // Formalize mail server connection info
        $headers = array('From' => $from,
                 'To' => $to,
                 'Subject' => $subject,
                 'Date' => date('r'),
                 'Return-Path' => $from,
                 'Content-Type' => 'text/html; charset=UTF-8',
                 'Content-Transfer-Encoding' => '7bit',
                 'Mime-Version' => '1.0',
                 'X-Mailer' => 'Your Company (https://yourdomain.com)',
                 'X-Accept-Language' => 'en',
                 'Message-ID' => sha1($body).'@yourdomain.com'
        );
        $connection = array('host' => $server,
                    'auth' => true,
                    'username' => $username,
                    'password' => $password
        );
        // Create the mail server connection 
        $smtp = Mail::factory('smtp', $connection);
        // Send the message
        $mail = $smtp->send($to, $headers, $body);
        // Check for errors
        if (PEAR::isError($mail)) {
            echo '! [email] ['.time().'] Failed sending mail to "'.$to.'"'.PHP_EOL;
            $result = false;
        } else {
            echo '  [email] ['.time().'] Mail sent to "'.$to.'"'.PHP_EOL;
            $result = true;
        }
        return $result;
    }
}

?>

Ответ 4

При устранении неполадок, связанных с доставкой почты, я использую проверку почты по адресу 25.

Он расскажет вам, что проходит/не проходит и как SpamAssasin оценивает ваше сообщение.

URL-адрес: http://www.port25.com/support/authentication-center/email-verification/

Чтобы получать результаты непосредственно по любому адресу, адрес необходимо добавить к адресу check-auth. Например, чтобы отправить результаты: [email protected] образец сообщения должен быть отправлен на [email protected]

С помощью этого вы можете узнать, работает ли ваш DKIM правильно/проверен, и какова ваша оценка SpamAssasin.