Caracteres gregos na barra lateral do mutt (nomes de caixas de correio originados via offlineimap)

6

Mutt 's barra lateral , não lê corretamente caracteres gregos (caixas de correio nomeadas usando caracteres gregos). De qualquer forma, não existe tal problema dentro do índice e do pager , onde Caracteres / palavras / nomes gregos aparecem bem.

AtualizaçãoapósocomentáriodeGilles

Aconfiguraçãoemquestão,usadaemdoissistemasdiferentes(umaestaçãodetrabalhoeumlaptop,amboscomoFuntooeoGNUbash,versão4.2.45(1)-release),incluiomuttparaler/escrevere-mailsde/paraumservidorIMAP.Arespostaparalocaleé

LANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE=POSIX
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

e nenhuma variável de código de idioma é definida em qualquer um dos arquivos de configuração do mutt.

As mensagens são realmente sincronizadas via offlineimap e enviadas usando postfix . offlineimap , registra a lista de caixas de correio (nomes) em um arquivo (ou seja, um arquivo denominado mailboxes ) que é originado em um dos arquivos de configuração do mutt (instruindo source ~/.mutt/mailboxes ). Olhando para o conteúdo do arquivo mailboxes , revela que os nomes gregos já são "mal interpretados".

Em qualquer caso, os nomes em grego aparecem bem por meio de um cliente de webmail (RoundCube), que acessa também o mesmo servidor IMAP e, portanto, as caixas de correio suspeitas.

Perguntas

  • Por que isso acontece?
  • É um problema de% mis_configuration?
  • Como isso pode ser resolvido?

Problema restante? [março de 2015] (ver também a resposta abaixo)

No entanto, os nomes das pastas do repositório local (nomes de diretório) ainda estão em um estado ilegível. Ou seja, o nome da pasta em grego mostrado acima (Υποτροφία) é, na verdade, o diretório offlineimap . Isso significa que as conversões de nome da pasta ocorrem depois, e não durante, da sincronização de nomes e mensagens de pastas? Ou é necessário remover esses diretórios (do repositório local) e forçar outra sincronização via offlineimap (tomando cuidado para não permitir que as respectivas pastas de caixas de correio sejam removidas do repositório remoto) ?

    
por Nikos Alexandris 02.07.2014 / 15:03

1 resposta

5

Resumindo ,

o "problema" surge do fato de que, IMAP4 codifica nomes de pastas usando uma codificação UTF-7 modificada . O offlineimap não converte nomes de pastas em algo legível antes de criar repositórios locais (por exemplo, em UTF-8). Isso, por sua vez, deriva nomes de pastas ilegíveis, como os mostrados na captura de tela da pergunta. Portanto, não é nem o Mutt nem o offlineimap

A questão é discutida em detalhes e resolvida nos seguintes posts e repositórios git:

A solução

Essencialmente, um script de python (fornecido abaixo) que ajuda a derivar nomes de pastas legíveis, é alimentado no arquivo de configuração do offlineimap (que é offlineimaprc , conforme explicado em Manual do OfflineIMAP ) . Além disso, uma linha de código instrutiva para a tradução do nome da pasta apropriada (usando as funções definidas no script python), ou seja,

# Name translation from UTF7 to UTF8
nametrans = lambda foldername: foldername.decode('imap4-utf-7').encode('utf-8')

é adicionado no arquivo de configuração do offlineimap sob a seção com as opções para o repositório remoto.

Atualização, (abril de 2015)

Outra regra é necessária para a operação inversa, consulte Filtragem de pastas e tradução de nomes . Estas instruções podem ser algo como

# Name translation, reverse!
nametrans = lambda foldername: foldername.decode('utf-8').encode('imap4-utf-7')

No arquivo mailboxes , aquele criado pelo offlineimap, os nomes dos gregos aparecem corretamente. Isso resolve o problema dentro do mutt e os nomes das pastas aparecem como intencionais (neste caso, nomes gregos).

Problemarestante?

Noentanto,osnomesdaspastasdorepositóriolocal(nomesdediretório)aindaestãoemumestadoilegível.Ouseja,onomedapastaemgregomostradoacima(Υποτροφία)é,naverdade,odiretório&A6UDwAO,A8QDwQO,A8YDrwOx-.Issosignificaque,asconversõesdenomedepastaocorremdepois,enãodurante,dasincronizaçãodenomesdepastasemensagens?Ouénecessárioremoveressesdiretórios(dorepositóriolocal)eforçaroutrasincronizaçãoviaofflineimap(tomandocuidadoparanãopermitirqueasrespectivaspastasdecaixasdecorreiosejamremovidasdorepositórioremoto)?

ScriptPythonparalidarcomnomesdecaixasdecorreiointernacionais(IMAP,UTF-7):

#vim:fileencoding=utf-8r"""
Imap folder names are encoded using a special version of utf-7 as defined in RFC
2060 section 5.1.3.

From: http://piao-tech.blogspot.com/2010/03/get-offlineimap-working-with-non-ascii.html

5.1.3.  Mailbox International Naming Convention

   By convention, international mailbox names are specified using a
   modified version of the UTF-7 encoding described in [UTF-7].  The
   purpose of these modifications is to correct the following problems
   with UTF-7:

    1) UTF-7 uses the "+" character for shifting; this conflicts with
     the common use of "+" in mailbox names, in particular USENET
     newsgroup names.

    2) UTF-7's encoding is BASE64 which uses the "/" character; this
     conflicts with the use of "/" as a popular hierarchy delimiter.

    3) UTF-7 prohibits the unencoded usage of "\"; this conflicts with
     the use of "\" as a popular hierarchy delimiter.

    4) UTF-7 prohibits the unencoded usage of "~"; this conflicts with
     the use of "~" in some servers as a home directory indicator.

    5) UTF-7 permits multiple alternate forms to represent the same
     string; in particular, printable US-ASCII chararacters can be
     represented in encoded form.

   In modified UTF-7, printable US-ASCII characters except for "&"
   represent themselves; that is, characters with octet values 0x20-0x25
   and 0x27-0x7e.  The character "&" (0x26) is represented by the two-
   octet sequence "&-".

   All other characters (octet values 0x00-0x1f, 0x7f-0xff, and all
   Unicode 16-bit octets) are represented in modified BASE64, with a
   further modification from [UTF-7] that "," is used instead of "/".
   Modified BASE64 MUST NOT be used to represent any printing US-ASCII
   character which can represent itself.

   "&" is used to shift to modified BASE64 and "-" to shift back to US-
   ASCII.  All names start in US-ASCII, and MUST end in US-ASCII (that
   is, a name that ends with a Unicode 16-bit octet MUST end with a "-
   ").

    For example, here is a mailbox name which mixes English, Japanese,
    and Chinese text: ~peter/mail/&ZeVnLIqe-/&U,BTFw-

"""

import binascii
import codecs

# encoding
def modified_base64(s):
  s = s.encode('utf-16be')
  return binascii.b2a_base64(s).rstrip(b'\n=').replace(b'/', b',').decode('ascii')

def doB64(_in, r):
  if _in:
    r.append('&%s-' % modified_base64(''.join(_in)))
    del _in[:]

def encoder(s):
  r = []
  _in = []
  for c in s:
    ordC = ord(c)
    if 0x20 <= ordC <= 0x25 or 0x27 <= ordC <= 0x7e:
      doB64(_in, r)
      r.append(c)
    elif c == '&':
      doB64(_in, r)
      r.append('&-')
    else:
      _in.append(c)
  doB64(_in, r)
  return (''.join(r).encode('ascii'), len(s))

# decoding
def modified_unbase64(s):
  b = binascii.a2b_base64(s.replace(b',', b'/') + b'===')
  return str(b, 'utf-16be')

def decoder(s):
  r = []
  decode = []
  for c in s:
    if c == b'&' and not decode:
      decode.append(b'&')
    elif c == b'-' and decode:
      if len(decode) == 1:
        r.append('&')
      else:
        r.append(modified_unbase64(b''.join(decode[1:])))
      decode = []
    elif decode:
      decode.append(c)
    else:
      r.append(c.decode('ascii'))
  if decode:
    r.append(modified_unbase64(b''.join(decode[1:])))
  bin_str = ''.join(r)
  return (bin_str, len(s))

class StreamReader(codecs.StreamReader):
  def decode(self, s, errors='strict'):
    return decoder(s)

class StreamWriter(codecs.StreamWriter):
  def decode(self, s, errors='strict'):
    return encoder(s)

def imap4_utf_7(name):
  if name == 'imap4-utf-7':
    return (encoder, decoder, StreamReader, StreamWriter)

codecs.register(imap4_utf_7)
    
por 05.07.2014 / 13:07