martedì 9 novembre 2010

KMail: migrare le impostazioni delle cartelle

La mia posta elettronica vanta un numero sterminato di cartelle e di filtri che uso per gestire un altrettanto vasto numero di iscrizioni a mailing lists. Una cosa molto gradevole di KMail è che è un client di posta furbo: quando si migra da un computer ad un altro o da una versione all'altra, spostare le cartelle di posta e i file di configurazione è sufficiente per migrare l'intera posta comprensiva di account, regole e filtri.
Tuttavia KMail non è così furbo da aggiustare anche gli account associati alle cartelle di posta, e quindi a seguito della migrazione un nuovo messaggio creato dentro ad una qualsiasi cartella viene editato con l'account di default. Ovviamente è possibile sistemare manualmente il problema, ma nel mio caso questa soluzione mi avrebbe portato via troppo tempo. 
Ho quindi deciso di studiare come KMail associa le identità degli account alle cartelle e di creare un banale programma che, in modo molto goffo, aggiusti le cose per me.
KMail memorizza le identità degli account di posta nel file emailidentities, e ogni identità in tale file contiene un valore identificativo univoco come proprietà dal nome uoid. Ogni identità ha quindi una linea del tipo
uoid = 1234556
con il valore numerico che cambia a seconda dell'identità. Il primo passo è quindi quello di recuperare lo uoid associato ad un account di posta (nel mio caso non ho account duplicati su varie identità, altrimenti il test dovrebbe essere piu' complesso).
A questo punto, nel file di configurazione principale di KMail, kmailrc, occorre analizzare ogni sezione di ogni cartella, e infatti in essa si troverà una linea che indica se occorre usare l'identità di default (UseDefaultIdentity = true) e una linea che indica l'identità da usare al suo posto (Identity = uoid). Quindi individuata la sezione corrispondente alla cartella che si vuole manipolare, è sufficiente inserire le due righe di cui sopra specificando l'identità da usare e facendo in modo che l'identità di default risulti disabilitata per tale cartella.
Si può fare ancora di piu': nel mio caso le cartelle corrispondenti a mailing list sono, con grande fantasia, tutte raggruppate sotto un'unica cartella dal nome Mailing List. Ebbene, kmailrc contiene nel nome della sezione il percorso completo della cartella, incluso il nome del padre della cartella. Quindi nel mio caso, le cartelle da manipolare non devono essere specificate manualmente ma possono essere ricavate automaticamente usando il prefisso Mailing List.
Di seguito presento lo script Perl che realizza quanto descritto sopra. Il suo utilizzo, da linea di comando, prevede il passaggio di due argomenti: il percorso al file di configurazione principale kmailrc e un indirizzo di posta da usare per ottenere l'identità dell'account. L'output è un file di configurazione differente, denominato kmailrc.new da sostituire, previo controllo, a quello originale.


#!/usr/bin/perl

open( KMAILRC, "<$ARGV[0]" )       || die("\nCannot open the specified kamilrc file\n$!\n");
open( EMAILIDENTITIES, "<$ARGV[1]")|| die("\nCannot open the email identities file\n$!\n");
open( NEWCONFIG, ">kmailrc.new" )  || die("\nCannot open the new configuration file\n$!\n");


$emailAddress = $ARGV[2];
$IDENTITY = undef();

# first step: find the identity id
while( ($line = ) && (! defined($IDENTITY) ) ){
    chomp( $line );
    if( $line =~ /$emailAddress/ ) {
 print "\nFound e-mail addrress $line";
 while( ($line = ) && (! defined( $IDENTITY ) ) ){
     if( $line =~ /uoid/ ){
  $line =~ s/(uoid=)(.*)/$2/;
  $IDENTITY = $line;
  print "\nFound an identity uoid = $IDENTITY\n";
  
     }
 }
    }
}











$FolderKey = $ARGV[3];

while( $line =  ){
    chomp( $line );

    if( $line =~ /\[Folder-\.$FolderKey/ ){
 chomp( $line );
 print NEWCONFIG $line , "\n";
 print "\nFound folder $line\n";
 $doneThisFolder = "";

 while( ($innerLine = ) && (! $doneThisFolder ) ){
     chomp( $innerLine );

     if ( $innerLine =~ /UseDefaultIdentity/ ){
  print NEWCONFIG "UseDefaultIdentity=false\n";
  print NEWCONFIG "Identity=$IDENTITY\n";
  $doneThisFolder = "true";
     }
     elsif( $innerLine =~ /Identity/ ){
  # print nothing, it has already be printed in the 
  # UseDefaultIdentity identity
     }
     else{
  print NEWCONFIG $innerLine , "\n";
     }
     
 }

    }
    else{
 print NEWCONFIG $line , "\n";
    }
    
}

Nessun commento: