Strumenti Utente

Strumenti Sito


documentazione_3di_riservata:manuali_sysadmin:mail

Questa è una vecchia versione del documento!


Gestione servizi di posta

Mail interna

Mail esterna

Procedure automatizzate

Conversione maildir posftfix in file mbox (no struttura subdir)

Dalla wiki di Dovecot si è estratto e riadattato uno script perl per convertire in mbox anche le maildir prodotte da postfix mediante il programma formail (già presente nella suite di postfix).

Si riporta il codice utilizzato per la conversione. Lo script necessita del pacchetto Path::Iterator::Rule (presente anche su CPAN) per funzionare. Nel caso la propria distro non lo preveda tra i suoi pacchetti, è possibile installarlo mediante il comando:

cpan -i Path::Iterator::Rule
maildir2mbox.pl
#!/usr/bin/perl
 
use Path::Iterator::Rule;
use Cwd;
use File::Basename;
use File::Spec;
 
use warnings;
 
sub recurse_maildir {
  my $rule = Path::Iterator::Rule->new;
 
  $rule->directory;
  $rule->skip_subdirs ("cur","new","tmp");
 
  foreach my $dir ( $rule->all($_[0])) {
    next unless stat("$dir/cur") || stat("$dir/new");
    print "Going into ",  $dir, "\n";
    my $pwd = getcwd;
    chdir ($dir);
    if ($dir eq $parentDir ) {
      $dir = "INBOX";
   }                                                                                                                                                                                                 
    my $cleanDir = basename($dir);                                                                                                                                                                    
    if ($cleanDir =~ m/^\.(.*)/ ) {                                                                                                                                                                   
       $cleanDir = $1;                                                                                                                                                                                
    }                                                                                                                                                                                                 
    my $finalOutputFile = File::Spec->catfile (dirname ($outputfile),$cleanDir . "_" .  basename ($outputfile));                                                                                      
    print "Saving all mails to $finalOutputFile)\n";
    my @files = (<cur/*>,<new/*>);
    foreach my $file (@files) {
       next unless -f $file; # skip non-regular files
       next unless -s $file; # skip empty files
       next unless -r $file; # skip unreadable files
       $file =~ s/'/'"'"'/;  # escape ' (single quote)
       my $run = "cat '$file' | $cmd >>'$finalOutputFile'";
       system($run) == 0 or warn "cannot run \"$run\".";
    }
    chdir ($pwd);
  }
 
}
 
# dw-maildirtombox.pl
# dw = Dovecot Wiki :-)
# NOTE! The output file must not contain single quotes (')!
# figure out which program to run
$cmd="reformail -f1";
system("$cmd </dev/null >/dev/null 2>/dev/null") == 0 or $cmd="formail";
system("$cmd </dev/null >/dev/null 2>/dev/null") == 0
or die "cannot find reformail or formail on your \$PATH!\nAborting";
$parentDir=$ARGV[0];
$outputfile=$ARGV[1];
if (($outputfile eq '') || ($parentDir eq ''))
{ die "Usage: ./archivemail.pl mailbox outputfile\nAborting"; }
 
recurse_maildir ($parentDir);

Conversione maildir posftfix in file mbox (con struttura subdir)

Frugando nel web, è venuto fuori uno script in python che permette la conversione da maildir a mbox mantenendo la struttura delle sottocartelle.

Il codice dello script è riportato nel seguito.

NB: si è dovuto modificare l'interprete Python nel hashbang, poiché sul vecchio server di posta l'interprete di default era python3.

NB: lo script funziona solo se lanciato da dentro la maildir che si intende convertire. È quindi necessario specificare come percorso per la maildir il path attuale, ovvero '.'.

maildir2mbox.py
#!/usr/bin/python2
# -*- coding: utf-8 -*-
"""
Frédéric Grosshans, 19 January 2012
Nathan R. Yergler, 6 June 2010
 
This file does not contain sufficient creative expression to invoke
assertion of copyright. No warranty is expressed or implied; use at
your own risk.
 
---
 
Uses Python's included mailbox library to convert mail archives from
maildir [http://en.wikipedia.org/wiki/Maildir] to
mbox [http://en.wikipedia.org/wiki/Mbox] format, icluding subfolder.
 
See http://docs.python.org/library/mailbox.html#mailbox.Mailbox for
full documentation on this library.
 
---
 
To run, save as md2mb.py and run:
 
$ python md2mb.py [maildir_path] [mbox_filename]
 
[maildir_path] should be the the path to the actual maildir (containing new,
cur, tmp, and the subfolders, which are hidden directories with names like
.subfolde.subsubfolder.subsubsbfolder);
 
[mbox_filename] will be newly created, as well as a [mbox_filename].sbd the
directory.
"""
 
import mailbox
import sys
import email
import os
 
def maildir2mailbox(maildirname, mboxfilename):
   """
   slightly adapted from maildir2mbox.py,
   Nathan R. Yergler, 6 June 2010
   http://yergler.net/blog/2010/06/06/batteries-included-or-maildir-to-mbox-again/
 
 
   """
   # open the existing maildir and the target mbox file
   maildir = mailbox.Maildir(maildirname, email.message_from_file)
   mbox = mailbox.mbox(mboxfilename)
 
   # lock the mbox
   mbox.lock()
 
   # iterate over messages in the maildir and add to the mbox
   for msg in maildir:
       mbox.add(msg)
 
   # close and unlock
   mbox.close()
   maildir.close()
 
 
dirname=sys.argv[-2]
mboxname=sys.argv[-1]
print(dirname +' -> ' +mboxname)
mboxdirname=mboxname+'.sbd'
maildir2mailbox(dirname,mboxname)
if not os.path.exists(mboxdirname): os.makedirs(mboxdirname)
 
listofdirs=[dn for dn in os.walk(dirname).next()[1] if dn not in ['new', 'cur', 'tmp']]
#print(listofdirs)
for curfold in listofdirs:
   if os.path.exists(os.path.join(curfold,'new')):
        curlist=[mboxname]+curfold.split('.')
        curpath=os.path.join(*[dn+'.sbd' for dn in curlist if dn])
        if not os.path.exists(curpath): os.makedirs(curpath)
        print('| ' +curfold +' -> '+curpath[:-4])
        maildir2mailbox(os.path.join(dirname,curfold),curpath[:-4])
 
 
print('Done')

Backup di tutte le cartelle di posta

In concomitanza agli script sopra riportati, sono stato realizzati altri script bash per effettuare il backup automatizzato di tutte le maildir degli utenti. Il primo script esegue le seguenti operazioni per ogni maildir:

  1. compressione in 7z di tutta la maildir così com'è
  2. conversione in mbox di tutte le cartelle contenute nella maildir e successiva compressione in 7z
  3. salvataggio degli archivi compressi su \\storage\UTSHARE\nomeUtente

Di seguito il codice dello script.

backupMaildirs.sh
#!/bin/bash
 
MAILDIR_ROOT=/var/vmail/3di.it
OUTPUT_ROOT=/mnt/UTSHARE
OUTPUT_GROUP=5106
MAILDIRS=(aalberghini abarducci afistani bcerr commerciale dcwerr dpranteda eluconi fcappelli ganastasi gmgelli helpdesk helpdesk-area itarlassi lpalumbo lsopko mb-archivio mb-proto mbelluomini mbernardini mbrugnetti mciullo mgelli mpascale mstancikova ncandelora opera-assistenza pgramaccioni ppala rtirabassi scavinato sesar siammtest spassarotto sstagni sviluppo test-archiviatore tickets vcapoccia)
 
set -e
 
cd "$MAILDIR_ROOT"
for USER in ${MAILDIRS[@]}
do
        echo "Processing $USER maildir"
        TEMPDIR=$(mktemp -d)
        if [ ! -d "$OUTPUT_ROOT/$USER" ]
        then
                echo "Creating output folder"
                install -d  -m700 -g "$OUTPUT_GROUP" -o "$USER" "$OUTPUT_ROOT/$USER"
        fi
        echo "Creating maildir archive: 7z a -mx=9 -m0=LZMA2 $OUTPUT_ROOT/$USER/${USER}_maildir.7z"
        7z a -mx=9 -m0=LZMA2 "$OUTPUT_ROOT/$USER/${USER}_maildir.7z" "$USER"
        echo "Creating mbox archives: /root/bin/dw-maildir2mbox_recur.pl $USER $TEMPDIR/${USER}.mbox"
        /root/bin/dw-maildir2mbox_recur.pl "$USER" "$TEMPDIR/${USER}.mbox"
        ( cd "$TEMPDIR" && 7z a -mx=9 -m0=LZMA2 "$OUTPUT_ROOT/$USER/${USER}_mbox.7z" *.mbox )
        rm -rf "$TEMPDIR"
        chown $USER:$OUTPUT_GROUP "$OUTPUT_ROOT/$USER/${USER}"_{maildir,mbox}.7z
done

Il secondo script provvede ad utilizzare lo script Python riportato in precedenza per esportare anche la struttura di cartelle in formato mbox:

backupMaildirs_struct.sh
#!/bin/bash
 
MAILDIR_ROOT=/var/vmail/3di.it
OUTPUT_ROOT=/mnt/UTSHARE
OUTPUT_GROUP=5106
MAILDIRS=(aalberghini abarducci afistani bcerr commerciale dcwerr dpranteda eluconi fcappelli ganastasi gmgelli helpdesk helpdesk-area itarlassi lpalumbo lsopko mb-archivio mb-proto mbelluomini mbernardini mbrugnetti mciullo mgelli mpascale mstancikova ncandelora opera-assistenza pgramaccioni ppala rtirabassi scavinato sesar siammtest spassarotto sstagni sviluppo test-archiviatore tickets vcapoccia)
TMPDIR=/var/vmail/tmp
 
set -e
 
cd "$MAILDIR_ROOT"
for USER in ${MAILDIRS[@]}
do
        echo "Processing $USER maildir"
        TEMPDIR=$(mktemp -p "$TMPDIR" -d)
        if [ ! -d "$OUTPUT_ROOT/$USER" ]
        then
                echo "Creating output folder"
                install -d  -m700 -g "$OUTPUT_GROUP" -o "$USER" "$OUTPUT_ROOT/$USER"
        fi
        echo "Entering $USER directory"
        cd "$USER"
        echo "Creating mbox structured archive: /root/bin/maildir2mbox.py . $TEMPDIR/INBOX"
        /root/bin/maildir2mbox.py . "$TEMPDIR/INBOX"
        echo "Exiting $USER directory"
        cd ..
        ( cd "$TEMPDIR" && 7z a -mx=9 -m0=LZMA2 "$OUTPUT_ROOT/$USER/${USER}_mbox_dirs.7z" * )
        rm -rf "$TEMPDIR"
        chown $USER:$OUTPUT_GROUP "$OUTPUT_ROOT/$USER/${USER}"_mbox_dirs.7z
done

Mailing listi

In aruba per poter scrivere ad una mailing list bisogna essere membri. Se un servizio, come nel caso di jenkins, va aggiunto l'indirizzo utilizzato per l'invio come membro della mailing list.

/data/attic/documentazione_3di_riservata/manuali_sysadmin/mail.1455268993.txt.gz · Ultima modifica: 2017/09/08 10:59 (modifica esterna)