Goldensites | Разработка сайтов | Создание сайтов | РЕШЕНО! Bitrix postfix DKIM NEUTRAL, домен null или dkim=neutral (body hash did not verify)

РЕШЕНО! Bitrix postfix DKIM NEUTRAL, домен null или dkim=neutral (body hash did not verify)

Работая над созданием очередного сайта, столкнулся с проблемой подтверждения DKIM. И так, на сервере установлен postfix в связке с open-dkim для отправки писем. При отправке почтовых сообщений из CMS Bitrix, в то числе и рассылке, письма приходят на gmail с пометкой dkim=neutral (body hash did not verify), что не есть хорошо!

 

Заголовки выглядят вот так

 

При этом тот же mail говорит, что подпись DKIM верная! В чем же дело? Сама по себе ошибка говорит о том, что с сообщением что то сделали уже после подписания DKIM.

Оказалось дело в том, что редактор Bitrix добавляет лишние пробельные символы в конец шаблона (это в более старых версиях) и добавляются символы переноса строки \r\n, которые в дальнейшем postfix меняет на \n уже после подписания DKIM. Отсюда и возникает ошибка. Но если просто поменять все символы переноса строки на \n, то подпись тоже не проходит проверку. При создании сайтов, часто сталкиваешься казалось бы с мелкой проблемой, а в итоге решить ее очень трудозатратно. Еще полдня поисков и раздумий и оказалось, что еще нам мешают символы табуляции и если попадается большой кусок кода без переносов строки, то postfix сам разбивает его, вставляя перенос строки. Все это приводит к ошибке проверки DKIM NEUTRAL, домен null.

Вот решение, которое мне помогло, Вам, возможно, придется что то допилить.

В файл init.php добавляем функцию


function custom_mail($to, $subject, $message, $additional_headers, $additional_parameters) {
    $message = str_replace(array("<br","<div","<a","<p","<img"),array("\n<br","\n<div","\n<a","\n<p","\n<img"),str_replace(array("\r\n","\n","\r","\t"),'',trim($message)));
    if($additional_parameters!="")
        return @mail($to, $subject, $message, $additional_headers, $additional_parameters);

    return @mail($to, $subject, $message, $additional_headers);
}

В итоге получаем долгожданный DKIM: PASS