Filtros Exim, variáveis de cabeçalho e codificação MIME

1

Eu escrevo filtros exim para encaminhar e-mail (como maillist). Na condição de filtro eu uso variáveis de cabeçalho. E enfrentei algumas dificuldades com a codificação $ h_subject. Tente explicar com o exemplo.

Novo e-mail enviado do gmail com poucas palavras em russo. Obviamente, o cabeçalho do assunto é codificado por MIME. Parece assim:

Subject: =?utf-8?Q?[nr=5Fbill]=20=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20?=
 =?utf-8?Q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?=

No filtro Exim, quero usar a próxima condição: $h_subject: contains "[nr_bill] Новый заказ оформлен"

O problema é que o Exim decodifica apenas a primeira linha do cabeçalho. Cabeçalho decodificado é assim:

[nr_bill] 0506021301 \n =?utf-8?Q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?=

A primeira linha é decodificada com sucesso e pode ser usada em filtros. Mas a segunda linha não é decodificada. E o pior: Exim economiza espaços e carater de nova linha entre linhas. Como eu sei, novas linhas e espaços de leadind nos cabeçalhos devem ser omitidos no tempo de análise.

Então $h_subject: contains "[nr_bill] Новый está funcionando bem, enquanto $h_subject: contains "[nr_bill] Новый заказ оформлен" não.

Manual diz que a nova linha + espaços é uma prática normal. Mas diz não notar a decodificação MIME em várias partes.

Alguém pode propor como resolver este problema ou apenas explicar qual é o sentido desses comportamentos?

    
por Valera Leontyev 21.12.2012 / 20:35

1 resposta

2

A resposta foi encontrada. Graças a Phil :)

Exim is being very carefully adherent to the MIME specification in RFC2047 which places a maximum length on each encoded-word.

----------------------------8< cut here >8------------------------------

encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" [...]

An 'encoded-word' may not be more than 75 characters long, including 'charset', 'encoding', 'encoded-text', and delimiters. If it is desirable to encode more text than will fit in an 'encoded-word' of 75 characters, multiple 'encoded-word's (separated by CRLF SPACE) may be used.

----------------------------8< cut here >8------------------------------

So the MIME decoder is skipping those long strings and adding them literally.

...

If you set "check_rfc2047_length" false in Exim's main configuration, the header will be decoded correctly; I would assume (but haven't checked) that Exim would then re-encode things correctly as needed.

check_rfc2047_length = false

Portanto, após definir check_rfc2047_length = false , todas as variações de assuntos problemáticos serão decodificadas corretamente.

    
por 25.12.2012 / 12:58

Tags