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)