User Tools

Site Tools


doc:appunti:linux:sa:imap

This is an old revision of the document!


IMAP protocol

Example of an IMAP session:

$ telnet mail.texnet.it 143
Trying 217.19.150.6...
Connected to mail.texnet.it.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT
  THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS]
  Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc.
  See COPYING for distribution information.
a1 CAPABILITY
* CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
  THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
  ACL2=UNION STARTTLS
a1 OK CAPABILITY completed
a2 LOGIN niccolo ********
a2 OK LOGIN Ok.
a3 LIST "" "*"
* LIST (\Marked \HasNoChildren) "." "INBOX"
a3 OK LIST completed
a4 SELECT INBOX
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited
* 2856 EXISTS
* 2856 RECENT
* OK [UIDVALIDITY 1163517848] Ok
* OK [MYRIGHTS "acdilrsw"] ACL
a4 OK [READ-WRITE] Ok
a5 FETCH 5 FAST
* 5 FETCH (FLAGS (\Recent) INTERNALDATE "25-Nov-2005 22:09:41 +0100" RFC822.SIZE 2763)
a5 OK FETCH completed.
a6 FETCH 3 (flags body[header.fields (subject)])
* 3 FETCH (FLAGS (\Recent) BODY[HEADER.FIELDS ("subject")] {94}
Subject: Cron <clamav@pierargo> [ -x /usr/bin/freshclam ] && /usr/bin/freshclam >/dev/null

)
* 3 FETCH (FLAGS (\Seen \Recent))
a6 OK FETCH completed.
a7 LOGOUT

Migrating IMAP folder

offlineimap

Sincronizza una cartella su server IMAP remoto con una Maildir locale oppure un altro server IMAP. Sembra il programma più flessibile e semplice da utilizzare rispetto a isync, mailsync, interimap, imapsync e imapcopy..

La versione 6.3.4 di Debian Wheezy e 6.5.4 (attualmente in Sid) hanno diversi bug. Conviene prendere la versione 6.5.5-rc3 da Github. Per installarlo manualmente copiare offlineimap in /usr/local/bin/ e la directory offlineimap/ in /usr/local/lib/python2.7/dist-packages/.

ATTENZIONE :!: Il programma offre una funzione di sincronizzazione bidirezionale, ma noi siamo interessati soprattutto alla migrazione da un server ad un altro, pertanto la bidirezionalità è un rischio. In caso di confusione sul nome delle cartelle tra i due repository e sullo stato dell'ultima sincronizzazione, c'è il rischio concreto di eliminare i messaggi dal server di origine.

Pertanto, prima di iniziare la sincronizzazione, è opportuno indagare quali cartelle sono presenti sul server di origine e il loro percorso. Inoltre, se si cambia il file di configurazione, è opportuno rimuovere tutti i file di stato che vengono salvati in $HOME/.offlineimap/ relativi ad Account-* e Repository-*.

Esempio #1: da IMAP a Maildir

Il primo esempio riguarda una migrazione da repository IMAP remoto a Maildir locale. Prepariamo il file di configurazione offlineimap-imap-maildir.conf:

[general]
accounts = Test

[Account Test]
remoterepository = RemoteIMAP
localrepository = Localhost

[Repository RemoteIMAP]
type = IMAP
# Strip the "INBOX" prefix when copying to a local Maildir, examples:
# 'INBOX'       => '.'
# 'INBOX.Trash' => '.Trash'
# 'INBOX.Sent'  => '.Sent'
nametrans = lambda foldername: re.sub('^INBOX\.*', '.', foldername)
remotehost = mail.example.org
remoteuser = username
remotepass = MySecret
createfolders = False
sslcacertfile = /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt

[Repository Localhost]
type = Maildir
localfolders = /home/username2/Maildir

Si esegue il programma in modalità --info, senza alcun trasferimento di messaggi:

offlineimap --dry-run --info -c ./offlineimap-imap-maildir.conf

Nell'output si legge:

...
Remote repository 'RemoteIMAP': type 'IMAP'
...
Folderlist:
 INBOX -> 
 INBOX.Drafts -> .Drafts
 INBOX.Archives.2019 -> .Archives.2019
 INBOX.Sent -> .Sent
 INBOX.Spam -> .Spam
 INBOX.Trash -> .Trash

Local repository 'Localhost': type 'Maildir'
Folderlist:

Come si vede il server di origine, oltre alla cartella INBOX, presenenta alcune sottocartelle che hanno il prefisso INBOX.; la regola re.sub() nel file di configurazione serve a tradurre il nome delle cartelle dalla nomenclatura IMAP remota alla Maildir locale (ovviamente si deve verificare lo standard adottato dal server IMAP che gira sull'host di destinazione). In particolare:

  • La INBOX deve essere la cartella radice della Maildir.
  • Il prefisso INBOX delle sottocartelle deve essere rimosso.
  • Ogni sottocartella deve avere il punto come prefisso del nome (directory nascosta Unix).

Vengono create le cartelle $HOME/.offlineimap/Repository-RemoteIMAP/ e $HOME/.offlineimap/Repository-Localhost/, per il momento vuote, ma che conterranno poi lo stato della sincronizzazione.

Esempio #2: da IMAP a IMAP

In questo esempio di effettua la sincronizzazione fra due server IMAP, quindi senza fare accesso diretto al filesystem. Questo il file di configurazione offlineimap-imap-imap.conf:

[general]
accounts = Test

[Account Test]
remoterepository = RemoteIMAP
localrepository = LocalIMAP

[Repository RemoteIMAP]
type = IMAP
# Strip the "INBOX" prefix when copying to a destination IMAP.
# 'INBOX'       => 'INBOX'
# 'INBOX.Trash' => 'Trash'
# 'INBOX.Sent'  => 'Sent'
nametrans = lambda foldername: re.sub(r'^INBOX\.', '', foldername)
remotehost = mail1.example.org
remoteuser = username1
remotepass = MySecret1
sslcacertfile = /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt

[Repository LocalIMAP]
type = IMAP
remotehost = mail2.example.org
remoteuser = username2
remotepass = MySecret2
sslcacertfile = /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
Remote repository 'RemoteIMAP': type 'IMAP'
...
Folderlist:
 INBOX.Drafts -> Drafts
 INBOX
 INBOX.Sent -> Sent
 INBOX.Spam -> Spam
 INBOX.Trash -> Trash

Local repository 'LocalIMAP': type 'MappedIMAP'
...
Folderlist:
 Drafts
 INBOX
 Sent
 Spam
 Trash

Altro

Creare un file di configurazione offlineimap.conf di questo tipo:

[general]
accounts = Test

[Account Test]
localrepository = Local
remoterepository = Remote

[Repository Local]
type = Maildir
localfolders = /home/user1/Maildir
# If the remote IMAP is a Lotus Domino, remove the **''.''** prefix when syncing back.
#nametrans = lambda foldername: re.sub('^\.*', '', foldername)

[Repository Remote]
type = IMAP
# Remote server is Courier-IMAP, strip the "INBOX" prefix when copying locally.
nametrans = lambda foldername: re.sub('^INBOX\.*', '.', foldername)
# Remote server is Lotus Domino, add an "." prefix when copying locally.
#nametrans = lambda foldername: '.' + foldername
remotehost = mail.host1.it
remoteuser = user1
remotepass = password1

quindi eseguire

offlineimap -1 -c offlineimap.conf -d imap,maildir -l offlineimap.log
  • Lo stato della sincronizzazione viene scritto in $HOME/.offlineimap/
  • La Maildir locale può essere anche vuota, viene riempita opportunamente.
  • L'opzione nametrans serve ad evitare che nella Maildir locale ogni cartella abbia un prefisso INBOX (server remoto Courier-IMAP).
  • L'opzione nametrans può servire anche ad aggiungere il prefisso . nelle cartelle locali quando il server remoto non lo ha (server remoto Lotus Domino). In questo caso ci deve essere un nametrans corrispondente nella configurazione locale: quando si sincronizza da locale a remoto il prefisso . deve essere tolto.
  • La versione 6.5.4 ogni tanto va in loop (race condition). Occorre la versione 6.5.5.
  • Con la versione 6.5.4 i messaggi importati hanno mode 0755, usare la versione 6.5.5.

isync

Consente la sincronizzazione di una Maildir locale con un server IMAP remoto.

  • Errore malformed UIDVALIDITY status, compilata versione 1.0.6 al posto della versione 1.0.4 fornita da Debian Jessie.
  • FIXME Esiste un modo di fare trasferimento ricorsivo di tutte le cartelle? Provare l'opzione -1
  • FIXME Problemi con le cartelle che contengono spazi nel nome, vedere la soluzione di eseguire direttamente mbsync.
  • Lo stato della sincronizzazione viene scritto in ogni Maildir nel file .mbsyncstate.

Uso diretto di mbsync

Per il problema delle cartelle che contengono spazi nel nome, si lancia isync --write. Viene generato un file mbsync.conf che deve essere corretto a mano aggiungendo le doppie virgolette. Quindi si esegue:

mbsync --config mbsync.conf <channel_name>

mailsync

Consente la sincronizzazione di un server IMAP remoto con il filesystem locale (non Maildir) oppure altro server IMAP.

Non supporta il formato Maildir su filesystem locale. Il programma in effetti si appoggia sulla libreria c-client per accedere agli archivi di posta, in passato Debian includeva una patch per supportare Maildir, ma questa patch è stata rimossa (verificato in libc-client2007e di Debian Jessie).

Con questo file di configurazione mailsync.conf si sincronizza un server IMAP (remoto) con uno che gira in localhost:

store first-server {
        server  {mail.server1.it/user=user1/novalidate-cert}
        ref     {mail.server1.it}
        pat     *
        prefix  INBOX
        passwd  FirstSecret
}

store second-server {
        server  {localhost/user=user2/novalidate-cert}
        ref     {localhost}
        pat     *
        prefix  INBOX
        passwd  SecondSecret
}

channel first-to-second first-server second-server {
        msinfo  .msinfo
}

Per lanciare la sincronizzazione per la prima volta si cancella un eventuale file di stato .msinfo:

rm .msinfo
mailsync -v -d -di -dc -f mailsync.conf first-to-second

interimap

Effettua la sincronizzazione fra due server IMAP, ma richiede la capability QRESYNC su entrambi.

imapsync

:!: Non presente in Debian 10 Buster. Obsoleto?

To migrate an IMAP account from one host1 to host2, there is the imapsync tool. In this usage example mail messages not longer existing on host1 will be deleted also on host2:

#!/bin/sh
 
login1=username_on_host1
passwd1=SecretOnHost1
login2=username_on_host2
passwd2=SecretOnHost2
 
./imapsync \
    --host1 83.145.162.149 \
    --authmech1 LOGIN \
    --user1 "$login1" \
    --password1 "$passwd1" \
    --subscribed \
    --host2 127.0.0.1 \
    --authmech2 LOGIN \
    --user2 "$login2" \
    --password2 "$passwd2" \
    --subscribe \
    --delete2 --expunge2

FIXME Problema con allegati con BODY vuoti: invece di saltare il messaggio il programma si blocca.

imapcopy

:!: Non presente in Debian 10 Buster. Obsoleto?

Il tool non supporta SSL né TLS, inoltre non effettua una sincronizzazione, ma una copia; quindi se viene eseguito due volte i messaggi vengono duplicati.

Si prepara un file di configurazione $HOME/ImapCopy.cfg con le seguenti opzioni:

SourceServer host1
SourcePort 143
DestServer host2
DestPort 143
converttimezone "UTC" "+0000"
converttimezone "UT"  "+0000"
Copy "login1"  "password1"  "login2"  "password2"

Lanciare il comando con l'opzione -l in modo che venga creato il file di log imapcopy.log.

Quota

Il protocollo IMAP supporta un meccanismo di “quota volontaria”, cioè i vari software (SMTP, IMAP, POP) devono collaborare a mantenere aggiornato un file con le statistiche di occupazione.

Per vedere se il server IMAP supporta correttamente la quota:

telnet 127.0.0.1 143
* OK [CAPABILITY IMAP4rev1 UIDPLUS ... QUOTA ...] Courier-IMAP ready.
a1 LOGIN niccolo MySecret
a1 OK LOGIN Ok.
a2 GETQUOTAROOT INBOX
* QUOTAROOT "INBOX" "ROOT"
* QUOTA "ROOT" (STORAGE 6417 19532)
a2 OK GETQUOTAROOT Ok.
a3 LOGOUT

In questo caso il Courier-IMAP implementa una soft-quota, cioè non quella del kernel Linux. Questa softquota è mantenuta nel file ~/Maildir/maildirsize e bisogna che tutti i programmi che scrivono/leggono nella Maildir lo tengano aggiornato. Ad esempio procmail non lo fa.

Per aggiornare una-tantum il contenuto del file (modificando lo spazio disponibile):

maildirmake -q 20000000S Maildir

I programmi courier-imap e courier-pop si comportano correttamente se trovano il file ~/Maildir/maildirsize, cioè aggiornano il totale dello spazio occupato quando viene eliminato un messaggio.

L'aggiornamento di maildirsize all'arrivo di nuovi messaggi non viene fatto direttamente da Postfix o Exim, si deve utilizzare un opportuno filtro di consegna, come maildrop.

Se qualcuno interviene direttamente sui file nella Maildir, è necessario rigenerare il file maildirsize come visto sopra.

FAM/Gamin library

Il server Courier IMAP sfrutta il supporto FAM (File Alteration Monitor) o Gamin. Conviene installare il pacchetto Debian gamin. Se non è installata una di queste librerie produce i seguente messaggio di errore:

* OK [ALERT] Filesystem notification initialization error -- contact your
  mail administrator (check for configuration errors with the FAM/Gamin library)

Courier IMAP

La connessione cifrata STARTTLS si appoggia su Courier authdaemon. Per effettuare debug lato client si può usare Firefox attivando la Console degli errori dal menu Strumenti. Durante l'aggiornamento da Weezy a Jessie ad esempio si deve risolvere il problema del file /etc/courier/dhparams.pem che deve passare da 1024 ad almeno 2048 bit.

doc/appunti/linux/sa/imap.1615224950.txt.gz · Last modified: 2021/03/08 18:35 by niccolo