BASE64_LENGTH_79_INF: SpamAssasin pénalise les e-mails transactionnels


9

J'ai remarqué que les e-mails transactionnels d'une boutique Magento étaient souvent marqués comme spam. Apache SpamAssasin donne un 2.0score à partir de la règle BASE64_LENGTH_79_INF .

L'explication de la règle indique:

Selon http://en.wikipedia.org/wiki/Base64 , la base 64 ne devrait comporter que 76 caractères, donc ceux-ci sont hors format.

De l'article Wikipédia lié:

MIME ne spécifie pas de longueur fixe pour les lignes codées en Base64, mais il spécifie une longueur de ligne maximale de 76 caractères. De plus, il spécifie que tous les caractères extra-alphabétiques doivent être ignorés par un décodeur conforme, bien que la plupart des implémentations utilisent une paire de nouvelles lignes CR / LF pour délimiter les lignes codées.

Il semble donc que le contenu encodé en base64 ne soit pas divisé en lignes comme prévu. Quelqu'un a-t-il rencontré la même chose? Qu'est-ce qui pourrait provoquer ce mauvais format?

Réponses:


9

Dans Zend Framework, magento/lib/Zend/Mime.phpimplémente a const LINELENGTH = 72;mais la constante est écrasée app/code/core/Zend/Mime.phpet définie sur 200. Vous pouvez écraser en app/code/core/Zend/Mime.phputilisant les mécanismes réguliers de Magento et changer l'implémentation de la encodeméthode, en remplaçant self :: LINELENGTH par une constante différente:

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: initialement j'ai remplacé self :: LINELENGTH par Zend_Mime :: LINELENGTH; cela ne fonctionnera pas car l'autochargeur chargera toujours la classe Zend_Mime depuis le noyau Magento au lieu de celle de lib / Zend.


y a-t-il une raison pour coder en dur à 72 et non à 76?
raduparvan

1
L'implémentation originale de Zend_Mime est const LINELENGTH = 72; (voir lib/Zend/Mime.php) donc je n'ai vu aucune raison de ne pas y faire confiance; la différence à 76 est probablement utilisée pour les fins de ligne. Coder en dur la valeur au lieu d'utiliser une constante correcte était juste pour montrer le point. Dans la mise en œuvre réelle, cette valeur doit vivre dans une constante. / Edit: L'implémentation d' Zend_Mime::encodeBase64()utilisations chunk_splitqui divise la chaîne en $ chunklen ajoute ensuite $ end (voir php.net/manual/en/function.chunk-split.php )
Adi

1

Comment votre serveur de messagerie (SMTP) est-il configuré? Votre enregistrement SPF est-il correct?

Il y a plusieurs raisons pour lesquelles le courrier peut être marqué comme spam, le contenu n'en est qu'une partie.

Plus d'informations ici: https://blog.amasty.com/5-steps-for-no-spam-e-mails-in-magento/


Je recherche cette raison spécifique, liée au contenu uniquement. Mais l'article lié contient une information utile: "Magento utilise par défaut 200 pour la longueur de ligne imprimable entre guillemets. Cela peut être changé en remplaçant la classe Zend_Mime." - Merci!
Fabian Schmengler du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.