BASE64_LENGTH_79_INF: SpamAssasin penaliza los correos electrónicos transaccionales

9

Noté que los correos electrónicos transaccionales de una tienda de Magento a menudo se marcaban como spam. Apache SpamAssasin otorga una 2.0puntuación de la regla BASE64_LENGTH_79_INF .

La explicación de la regla establece:

De acuerdo con http://en.wikipedia.org/wiki/Base64 , la base 64 solo debe tener 76 caracteres de largo, por lo que no tienen formato.

Del artículo vinculado de Wikipedia:

MIME no especifica una longitud fija para las líneas codificadas en Base64, pero sí especifica una longitud máxima de línea de 76 caracteres. Además, especifica que cualquier carácter extra alfabético debe ser ignorado por un decodificador compatible, aunque la mayoría de las implementaciones usan un par de nueva línea CR / LF para delimitar líneas codificadas.

Por lo tanto, parece que el contenido codificado en base64 no se divide en líneas como se esperaba. ¿Alguien encontró lo mismo? ¿Qué podría causar este mal formato?

Fabian Schmengler
fuente

Respuestas:

9

En Zend Framework, magento/lib/Zend/Mime.phpimplementa un const LINELENGTH = 72;pero la constante se sobrescribe app/code/core/Zend/Mime.phpy se establece en 200. Puede sobrescribir app/code/core/Zend/Mime.phputilizando los mecanismos regulares de Magento y cambiar la implementación del encodemétodo, reemplazando self :: LINELENGTH con una 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;
    }
}

/ Editar: inicialmente reemplacé self :: LINELENGTH con Zend_Mime :: LINELENGTH; esto no funcionará porque el cargador automático siempre cargará la clase Zend_Mime desde el núcleo de Magento en lugar de la de lib / Zend.

Adi
fuente
¿Hay alguna razón para codificar a 72 y no a 76?
raduparvan
1
La implementación original de Zend_Mime es const LINELENGTH = 72; (ver lib/Zend/Mime.php), así que no vi ninguna razón para no confiar en eso; probablemente la diferencia con 76 se usa para terminaciones de línea. Codificar el valor en lugar de usar una constante adecuada fue solo para mostrar el punto. En la implementación real, ese valor debe vivir en una constante. / Editar: La implementación de Zend_Mime::encodeBase64()usos chunk_splitque divide la cadena en $ chunklen luego agrega $ end (ver php.net/manual/en/function.chunk-split.php )
Adi
1

¿Cómo se configura su servidor de correo (SMTP)? ¿Es correcto su registro SPF?

Hay varias razones por las cuales el correo podría ser marcado como spam, el contenido es solo una parte de él.

Más información aquí: https://blog.amasty.com/5-steps-for-no-spam-e-mails-in-magento/

Niels
fuente
Estoy buscando esta razón específica, que está relacionada solo con el contenido. Pero el artículo vinculado contiene una información útil: "Magento utiliza de forma predeterminada 200 para la longitud de línea imprimible entre comillas. Esto se puede cambiar anulando la clase Zend_Mime". - ¡Gracias!
Fabian Schmengler