BASE64_LENGTH_79_INF: SpamAssasin karze transakcyjne wiadomości e-mail

9

Zauważyłem, że e-maile transakcyjne ze sklepu Magento były często oznaczone jako spam. Apache SpamAssasin podaje 2.0wynik z reguły BASE64_LENGTH_79_INF .

Wyjaśnienie reguły stanowi:

Zgodnie z http://en.wikipedia.org/wiki/Base64 , podstawa 64 powinna mieć tylko 76 znaków, więc są one nie w formacie.

Z powiązanego artykułu w Wikipedii:

MIME nie określa stałej długości linii zakodowanych w Base64, ale określa maksymalną długość linii wynoszącą 76 znaków. Dodatkowo określa, że ​​wszelkie znaki niealfabetyczne muszą być ignorowane przez zgodny dekoder, chociaż większość implementacji używa pary nowej linii CR / LF do rozgraniczenia zakodowanych linii.

Wygląda więc na to, że treść zakodowana w standardzie base64 nie jest dzielona na wiersze zgodnie z oczekiwaniami. Czy ktoś spotkał to samo? Co może powodować ten zły format?

Fabian Schmengler
źródło

Odpowiedzi:

9

W Zend Framework magento/lib/Zend/Mime.phpimplementuje a, const LINELENGTH = 72;ale stała jest nadpisywana app/code/core/Zend/Mime.phpi ustawiana na 200. Możesz nadpisywać app/code/core/Zend/Mime.phpza pomocą regularnych mechanizmów Magento i zmieniać implementację encodemetody, zastępując self :: LINELENGTH inną stałą:

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

/ Edycja: początkowo zamieniłem self :: LINELENGTH na Zend_Mime :: LINELENGTH; to nie zadziała, ponieważ autoloader zawsze ładuje klasę Zend_Mime z rdzenia Magento zamiast tej z lib / Zend.

Adi
źródło
czy jest jakiś powód, aby zakodować na stałe 72, a nie 76?
raduparvan
1
Oryginalna implementacja Zend_Mime to const LINELENGTH = 72; (patrz lib/Zend/Mime.php), więc nie widziałem powodu, aby temu nie ufać; prawdopodobnie różnica do 76 jest używana dla zakończeń linii. Zakodowanie wartości zamiast użycia właściwej stałej miało jedynie pokazać punkt. W rzeczywistej realizacji wartość ta musi żyć w sposób ciągły. / Edycja: Implementacja Zend_Mime::encodeBase64()zastosowań, chunk_splitktóra dzieli ciąg na $ chunklen, a następnie dodaje $ end (patrz php.net/manual/en/function.chunk-split.php )
Adi
1

Jak skonfigurowany jest Twój serwer pocztowy (SMTP)? Czy Twój rekord SPF jest prawidłowy?

Istnieje wiele powodów, dla których poczta może być oznaczona jako spam, treść jest tylko jej częścią.

Więcej informacji tutaj: https://blog.amasty.com/5-steps-for-no-spam-e-mails-in-magento/

Niels
źródło
Szukam tego konkretnego powodu, który jest związany tylko z treścią. Ale połączony artykuł zawiera użyteczne informacje: „Domyślnie Magento używa 200 dla długości linii do wydrukowania w cudzysłowie. Można to zmienić, zastępując klasę Zend_Mime”. - dzięki!
Fabian Schmengler,