Эта проблема:
Я использую OpenDKIM с Postfix. Почта генерируется в PHP с использованием следующего кода, а затем отправляется с mail()
:
// message
$message = "--$hash".PHP_EOL;
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"".PHP_EOL;
$message .= "Content-Transfer-Encoding: base64".PHP_EOL.PHP_EOL;
$message .= base64_encode($body).PHP_EOL.PHP_EOL;
$message .= "--$hash".PHP_EOL;
OpenDKIM отлично работает для любых сообщений длиной до 742 символов, но если сообщение составляет 742 символа или более, Google сообщает, что DKIM «body hash did not verify
».
Глядя на DKIM и Google, я не могу найти никакой информации о том, что может вызвать это. Я пробовал несколько сообщений, которые состоят из 741 символа (все проходят) и несколько сообщений, которые составляют 742 символа (все не удается).
Ошибки:
Единственная ошибка в получении электронной почты Google (который говорит, что не может подтвердить подлинность):
dkim=neutral (body hash did not verify) [email protected];
/var/log/maillog
имеет следующее (или что-то подобное) на успешных и неудачных электронных письмах:
Nov 5 00:58:57 ip-XX-XX-XX-XX opendkim[3953]: 7D2946081A: DKIM-Signature field added (s=default, d=mailer.example.com)
Решение:
Согласно приведенному ниже решению @Adrien Lebner, это было простое изменение
base64_encode($body)
в
chunk_split(base64_encode($body), 76, PHP_EOL)
это решило проблему.
Что делать, если вы отправляете одинаковый контент в нескольких строках?
DKIM может сломаться, если длина строки слишком велика:
2.1.1. Пределы длины линии
Есть две ограничения, которые эта спецификация накладывает на число
символов в строке. Каждая строка символов ДОЛЖНА быть не более
чем 998 символов, и ДОЛЖНЫ быть не более 78 символов,
исключая CRLF.
Других решений пока нет …