BASE64_LENGTH_79_INF: SpamAssasin наказывает транзакционные электронные письма


9

Я заметил, что транзакционные электронные письма из магазина Magento часто отмечались как спам. Apache SpamAssasin дает 2.0оценку по правилу BASE64_LENGTH_79_INF .

Объяснение правила гласит:

Согласно http://en.wikipedia.org/wiki/Base64 , база 64 должна быть длиной всего 76 символов, поэтому они не в формате.

Из связанной статьи Википедии:

MIME не определяет фиксированную длину для строк в кодировке Base64, но он определяет максимальную длину строки в 76 символов. Кроме того, он указывает, что любые неалфавитные символы должны игнорироваться совместимым декодером, хотя большинство реализаций используют пару новой строки CR / LF для разделения кодированных строк.

Таким образом, похоже, что закодированное в base64 содержимое не разбивается на строки, как ожидалось. Кто-нибудь сталкивался с тем же? Что может вызвать этот плохой формат?

Ответы:


9

В Zend Framework magento/lib/Zend/Mime.phpреализует, const LINELENGTH = 72;но константа перезаписывается app/code/core/Zend/Mime.phpи устанавливается на 200. Вы можете перезаписать, app/code/core/Zend/Mime.phpиспользуя обычные механизмы Magento, и изменить реализацию encodeметода, заменив self :: LINELENGTH другой константой:

public static function encode($str, $encoding, $EOL = self::LINEEND)
{
    switch ($encoding) {
        case self::ENCODING_BASE64:
           // original: return self::encodeBase64($str, self::LINELENGTH, $EOL);
           return self::encodeBase64($str, 72, $EOL); // hardcoded value, just to emphasize the meaning

        case self::ENCODING_QUOTEDPRINTABLE:
            return self::encodeQuotedPrintable($str, self::LINELENGTH, $EOL);

        default:
            /**
             * @todo 7Bit and 8Bit is currently handled the same way.
             */
            return $str;
    }
}

/ Изменить: изначально я заменил себя :: LINELENGTH на Zend_Mime :: LINELENGTH; это не будет работать, потому что автозагрузчик всегда будет загружать класс Zend_Mime из ядра Magento, а не из lib / Zend.


Есть ли причина для жесткого кодирования до 72, а не 76?
Радупарван

1
Первоначальной реализацией Zend_Mime является const LINELENGTH = 72; (см. lib/Zend/Mime.php), Поэтому я не видел причин не доверять этому; вероятно, разница до 76 используется для окончания строки. Жесткое кодирование значения вместо использования правильной константы было просто показать точку. В реальной реализации это значение должно быть постоянным. / Edit: Реализация Zend_Mime::encodeBase64()использования, chunk_splitкоторая разбивает строку в $ chunklen, а затем добавляет $ end (см. Php.net/manual/en/function.chunk-split.php )
Adi

1

Как настроен ваш почтовый сервер (SMTP)? Ваша запись SPF верна?

Существуют различные причины, по которым письмо может быть помечено как спам, контент является только его частью.

Более подробная информация здесь: https://blog.amasty.com/5-steps-for-no-spam-e-mails-in-magento/


Я ищу эту конкретную причину, которая связана только с содержанием. Но связанная статья содержит полезную информацию: «Magento по умолчанию использует 200 для длины строки для печати в кавычках. Это можно изменить, переопределив класс Zend_Mime». - Спасибо!
Фабиан Шменглер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.