BASE64_LENGTH_79_INF: SpamAssasin penaliza emails transacionais

9

Notei que e-mails transacionais de uma loja Magento eram frequentemente marcados como spam. O Apache SpamAssasin fornece uma 2.0pontuação da regra BASE64_LENGTH_79_INF .

A explicação da regra afirma:

De acordo com http://en.wikipedia.org/wiki/Base64 , a base 64 deve ter apenas 76 caracteres, portanto, eles estão fora de formato.

Do artigo vinculado da Wikipedia:

MIME não especifica um comprimento fixo para linhas codificadas em Base64, mas especifica um comprimento máximo de linha de 76 caracteres. Além disso, especifica que qualquer caractere extra-alfabético deve ser ignorado por um decodificador compatível, embora a maioria das implementações use um par de nova linha CR / LF para delimitar linhas codificadas.

Portanto, parece que o conteúdo codificado em base64 não é dividido em linhas conforme o esperado. Alguém encontrou o mesmo? O que poderia causar esse formato incorreto?

Fabian Schmengler
fonte

Respostas:

9

No Zend Framework, magento/lib/Zend/Mime.phpimplementa a const LINELENGTH = 72;mas a constante é substituída app/code/core/Zend/Mime.phpe configurada como 200. Você pode sobrescrever app/code/core/Zend/Mime.phpusando os mecanismos regulares do Magento e alterar a implementação do encodemétodo, substituindo self :: LINELENGTH por uma constante diferente:

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;
    }
}

/ Edit: inicialmente substitui self :: LINELENGTH por Zend_Mime :: LINELENGTH; isso não funcionará porque o carregador automático sempre carregará a classe Zend_Mime do núcleo Magento, em vez da classe lib / Zend.

Adi
fonte
existe uma razão para codificar para 72 e não para 76?
Raduparvan 17/09/2015
11
A implementação original do Zend_Mime é const LINELENGTH = 72; (veja lib/Zend/Mime.php), então não vi razão para não confiar nisso; provavelmente a diferença para 76 é usada para terminações de linha. Codificar o valor em vez de usar uma constante adequada era apenas para mostrar o ponto. Na implementação real, esse valor deve viver em uma constante. / Edit: A implementação de Zend_Mime::encodeBase64()usos chunk_splitque dividem a string em $ chunklen então adiciona $ end (veja php.net/manual/en/function.chunk-split.php )
Adi
1

Como o seu servidor de email (SMTP) é configurado? O seu registro SPF está correto?

Existem várias razões pelas quais o e-mail pode ser marcado como spam, o conteúdo é apenas uma parte dele.

Mais informações aqui: https://blog.amasty.com/5-steps-for-no-spam-e-mails-in-magento/

Niels
fonte
Estou procurando por esse motivo específico, que está relacionado apenas ao conteúdo. Mas o artigo vinculado contém algumas informações úteis: "Por padrão, o Magento usa 200 para o comprimento da linha imprimível por cotação. Isso pode ser alterado substituindo a classe Zend_Mime". - obrigado!
Fabian Schmengler