User Tools

Site Tools


doc:appunti:linux:sa:imap

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:linux:sa:imap [2013/10/14 09:33] – [offlineimap] niccolodoc:appunti:linux:sa:imap [2024/03/21 12:56] (current) – [offlineimap] niccolo
Line 41: Line 41:
 a6 OK FETCH completed. a6 OK FETCH completed.
 a7 LOGOUT a7 LOGOUT
 +</code>
 +
 +Some IMAP servers present all the folders as subfolders of the INBOX:
 +
 +<code>
 +a3 LIST "" "*"
 +* LIST (\HasNoChildren)       "." "INBOX.Sent"
 +* LIST (\HasNoChildren)       "." "INBOX.Trash"
 +* LIST (\HasNoChildren)       "." "INBOX.Spam"
 +* LIST (\Marked \HasChildren) "." "INBOX"
 +a4 CREATE INBOX.Archive
 +</code>
 +
 +For other IMAP servers, the folders are outside the INBOX:
 +
 +<code>
 +a3 LIST "" "*"
 +* LIST (\HasNoChildren)                 "." Spam
 +* LIST (\HasNoChildren \Drafts)         "." Drafts
 +* LIST (\HasNoChildren \UnMarked \Sent) "." Sent
 +* LIST (\HasNoChildren \Trash)          "." Trash
 +* LIST (\HasNoChildren)                 "." INBOX
 +a4 CREATE Archive
 </code> </code>
  
 ===== Migrating IMAP folder ===== ===== Migrating IMAP folder =====
  
-==== imapsync ====+==== offlineimap ====
  
-To migrate an IMAP account from one host1 to host2, there is the **''[[http://www.linux-france.org/prj/imapsync/|imapsync]]''** toolIn this usage example mail messages not longer existing on host1 will be deleted also on host2:+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**..
  
-<code bash> +**ATTENZIONE** :!: Le versioni **6.3.4** di Debian Wheezy e **6.5.4** hanno diversi bug.
-#!/bin/sh+
  
-login1=username_on_host1 +**ATTENZIONE** :!: La versione **7.3.0** (git20210225) di Debian 11.3 Bullseye ha un bug con le cartelle IMAP che **contengono degli spazi** (vedere pull risolutivo [[https://github.com/OfflineIMAP/offlineimap3/pull/80|#80]]). Un rimedio temporaneo è creare manualmente la cartella IMAP sul server ricevente. Esiste il pacchetto **offlineimap3_0.0~git20211018.e64c254+dfsg-1~bpo11+1_all.deb** in bullseye-backports.
-passwd1=SecretOnHost1 +
-login2=username_on_host2 +
-passwd2=SecretOnHost2+
  
-./imapsync \ +**ATTENZIONE** :!: Il programma effettua una sincronizzazione **bidirezionale**, ma noi siamo interessati alla migrazione di una mailbox 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**
-    --host1 83.145.162.149 \ + 
-    --authmech1 LOGIN \ +**ATTENZIONE** :!: La versione **8.0.0** (Debian GNU/Linux 12 Bookworm) non riesce a gestire correttamente la sincronizzazione con server Courier IMAP in presenza di sottocartelle di primo livello o ulteriori. Vedere l'**[[https://github.com/OfflineIMAP/offlineimap3/issues/188|issue #188]]**
-    --user1 "$login1" \ + 
-    --password1 "$passwd1\ +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-*%%**. 
-    --subscribed \ + 
-    --host2 127.0.0.1 \ +=== Esempio #1: da IMAP a Maildir === 
-    --authmech2 LOGIN + 
-    --user2 "$login2" \ +Il primo esempio riguarda una migrazione da repository **IMAP remoto** a **Maildir locale**. Prepariamo il file di configurazione **offlineimap-imap-maildir.conf**: 
-    --password2 "$passwd2" \ + 
-    --subscribe \ +<file> 
-    --delete2 --expunge2+[general] 
 +accounts = Test 
 + 
 +[Account Test] 
 +remoterepository = RemoteIMAP 
 +localrepository = Localhost 
 + 
 +[Repository RemoteIMAP] 
 +type = IMAP 
 +# Strip the "INBOXprefix 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/Actalis_Authentication_Root_CA.crt 
 +ssl_version = tls1_2 
 +# If you don't want IMAPS on port 993, you can use STARTTLS on port 143. 
 +#ssl = no 
 +#starttls = yes 
 + 
 +[Repository Localhost] 
 +type = Maildir 
 +localfolders = /home/username2/Maildir 
 +</file> 
 + 
 +Per impostazione predefinita offlineimap tenta una connessione **SSL** su porta **993/TCP**, verificando il certificato del server remoto. Senza l'opzione **sslcacertfile** il client offlineimap non è in grado di inziare la sessione TLS e si blocca con il seguente errore: 
 + 
 +<code> 
 +offlineimap.error.OfflineImapError: No CA certificates and no server fingerprints configured. 
 +    You must configure at least something, otherwise having SSL helps nothing.
 </code> </code>
  
-FIXME Problema con allegati con BODY vuotiinvece di saltare il messaggio il programma si blocca. +Per vedere quale Certification Authority deve essere usata è necessario recuperare il certificato SSL dal server remoto, ad esempio con il comando:
-==== imapcopy ====+
  
-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.+<code> 
 +openssl s_client -showcerts -connect mail.example.org:993 
 +</code>
  
-Si prepara un file di configurazione **''$HOME/ImapCopy.cfg''** con le seguenti opzioni:+Quindi si ispeziona la **certificate chain** alla ricerca di **O**rganization e **C**ommon **N**ame con valori del tipo: 
 + 
 +  * O = Actalis S.p.A., CN = Actalis Organization Validated Server CA G3 
 +  * O = Let's Encrypt, CN = R3 
 + 
 +Avendo installato il pacchetto **ca-certificates**, si cerca nella directory **/usr/share/ca-certificates/mozilla/** il certificato giusto da usare. Dopo aver abilitato SSL si può incappare anche nel seguente errore:
  
 <code> <code>
-SourceServer host1 +[SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:727)
-SourcePort 143 +
-DestServer host2 +
-DestPort 143 +
-converttimezone "UTC" "+0000" +
-converttimezone "UT"  "+0000" +
-Copy "login1"  "password1"  "login2"  "password2"+
 </code> </code>
  
-Lanciare il comando con l'opzione **''-l''** in modo che venga creato il file di log ''imapcopy.log''.+Questo significa che il server utilizza una versione debole di SSL, vulnerabile ad attacchi del tipo //Factoring RSA Export Keys// poiché usa una chiave Diffie-Hellman più corta di 768 byte. In questo caso, se non possiamo correggere il server, è necessario aggiungere l'opzione di configurazione ''ssl_version = tls1_2''.
  
-==== isync ====+Se si desidera utilizzare una connessione con STARTTLS su porta 143, è necessario aggiungere le opzioni ''ssl no'' e ''starttls yes''.
  
-  Errore **''malformed UIDVALIDITY status''**, compilata **versione 1.0.6** al posto della versione 1.0.4 fornita da Debian Jessie. +Si esegue il programma in modalità **%%--info%%**, senza alcun trasferimento di messaggi:
-  * Problemi con le cartelle che contengono spazi nel nome: risolto lanciando **''%%isync --write%%''**, quindi corretto a mano il file generato ''mbsync.conf'' e lanciato il backend **''mbsync''**. +
-  * Esiste un modo di fare trasferimento ricorsivo di tutte le cartelle? Provare l'opzione **''-1''**+
  
-==== offlineimap ====+<code> 
 +offlineimap --dry-run --info -c ./offlineimap-imap-maildir.conf 
 +</code>
  
-Creare un file di configurazione **''offlineimap.conf''** di questo tipo:+Nell'output si legge: 
 + 
 +<code> 
 +... 
 +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: 
 + 
 +</code> 
 + 
 +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**:
  
 <file> <file>
Line 105: Line 187:
  
 [Account Test] [Account Test]
-localrepository Local +remoterepository RemoteIMAP 
-remoterepository Remote+localrepository LocalIMAP
  
-[Repository Local+[Repository RemoteIMAP
-type = Maildir +type = IMAP 
-localfolders = /home/user1/Maildir+# 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 
 +createfolders = False 
 +sslcacertfile = /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
  
-[Repository Remote]+[Repository LocalIMAP]
 type = IMAP type = IMAP
-remotehost = mail.host1.it +remotehost = mail2.example.org 
-remoteuser = user1 +remoteuser = username2 
-remotepass = password1+remotepass = MySecret2 
 +sslcacertfile = /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
 </file> </file>
  
-quindi eseguire+Si esegue il programma in modalità **%%--info%%**:
  
 <code> <code>
-offlineimap -c offlineimap.conf+offlineimap --dry-run --info -c ./offlineimap-imap-imap.conf
 </code> </code>
 +
 +Verifichiamo l'output:
 +
 +<code>
 +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
 +</code>
 +
 +Si capisce che i due server IMAP utilizzano una struttura diversa: il primo ha il prefisso ''INBOX.'' per ogni sottocartella, mentre il secondo no. Anche in questo caso è stato necessario utilizzare l'opzione **nametrans** con una opportuna **re.sub()** leggermente diversa dall'esempio #1. Si verifica comunque che il nome ''INBOX'' non viene trasformato, mentre per le sottocartelle avviene la corretta trasformazione che consiste semplicememte nel rimuovere il prefisso ''INBOX.'', compreso il punto.
 +
 +=== Sincronizzazione ===
 +
 +La sincronizzazione avviene semplicemente eseguendo il comando con l'opportuno file di configurazione. In questo esempio si esegue un thread singolo (opzione **%%-1%%**) e si scrive nel file di log (opzione **%%-l%%**) il debug del protocollo imap e maildir (opzione **%%-d%%**):
 +
 +<code>
 +offlineimap -1 -c offlineimap-imap-imap.conf -d imap,maildir -l offlineimap.log
 +</code>
 +
 +  * Lo stato della sincronizzazione viene scritto in **''$HOME/.offlineimap/''**
 +  * La ''Maildir'' locale può essere anche vuota, viene riempita opportunamente.
 +  * Potrebbe essere necessario specificare l'opzione **''nametrans''** per entrambi i repository, in modo che la sincronizzazione bidirezionale crei le giuste cartelle sul server remoto, ma noi abbiamo preferito utilizzare l'opzione ''createfolders = False'' in modo che non vi sia propagazione di cartelle verso il server origine.
 +
 +=== Soluzione problemi ===
 +
 +Vedere **[[offlineimap3]]**.
 +
 +
 +==== 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:
 +
 +<code>
 +mbsync --config mbsync.conf <channel_name>
 +</code>
 +
 ==== mailsync ==== ==== 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). **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 si sincronizza un server IMAP (remoto) con uno che gira in localhost:+Con questo file di configurazione **mailsync.conf** si sincronizza un server IMAP (remoto) con uno che gira in localhost:
  
 <file> <file>
Line 158: Line 311:
 mailsync -v -d -di -dc -f mailsync.conf first-to-second mailsync -v -d -di -dc -f mailsync.conf first-to-second
 </code> </code>
 +
 +==== 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 **''[[http://www.linux-france.org/prj/imapsync/|imapsync]]''** tool. In this usage example mail messages not longer existing on host1 will be deleted also on host2:
 +
 +<code bash>
 +#!/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
 +</code>
 +
 +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:
 +
 +<code>
 +SourceServer host1
 +SourcePort 143
 +DestServer host2
 +DestPort 143
 +converttimezone "UTC" "+0000"
 +converttimezone "UT"  "+0000"
 +Copy "login1"  "password1"  "login2"  "password2"
 +</code>
 +
 +Lanciare il comando con l'opzione **''-l''** in modo che venga creato il file di log ''imapcopy.log''.
 +
 ===== Quota ===== ===== Quota =====
  
Line 199: Line 407:
 </code> </code>
  
-====== ====== +====== Courier IMAP ======
- +
-----+
  
-<php>echo '<rel="me" href="https://profiles.google.com/100662196154811835450">Profilo Google+</a>' . "\n";</php>+La connessione cifrata STARTTLS si appoggia su [[authdaemon_problem]]. Per effettuare debug lato client si può usare Firefox attivando la **Console degli errori** dal menu **Strumenti**. Durante l'aggiornamento da Weezy 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.1381736027.txt.gz · Last modified: 2013/10/14 09:33 by niccolo