#!/usr/bin/env python """Invia il contenuto di una directory come messaggio MIME. Uso: dirmail [opzioni] from to [to ...]* Opzioni: -h / --help Stampa questo messaggio ed esce. -d directory --directory=directory Invia il contenuto della directory specificata altrimenti usa la directory corrente. Vengono inviati solo i file regolari della directory e non vengono coinvolte le sotto directory. `from' è l'indirizzo email di chi invia il messaggio. `to' è l'indirizzo email del destinatario del messaggio. Possono essere passati più destinatari. L'email viene inviata tramite inoltro al vostro server SMTP locale che quindi esegue il normale processo di consegna. La vostra macchina locale deve avere in esecuzione un server SMTP. """ import sys import os import getopt import smtplib # Per l'individuazione del tipo MIME in base a nome e estensione del file import mimetypes from email import Encoders from email.Message import Message from email.MIMEAudio import MIMEAudio from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart from email.MIMEImage import MIMEImage from email.MIMEText import MIMEText COMMASPACE = ', ' def usage(code, msg=''): print >> sys.stderr, __doc__ if msg: print >> sys.stderr, msg sys.exit(code) def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) except getopt.error, msg: usage(1, msg) dir = os.curdir for opt, arg in opts: if opt in ('-h', '--help'): usage(0) elif opt in ('-d', '--directory'): dir = arg if len(args) < 2: usage(1) sender = args[0] recips = args[1:] # Crea il messaggio contenitore (outer) outer = MIMEMultipart() outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir) outer['To'] = COMMASPACE.join(recips) outer['From'] = sender outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' # Fa in modo che il messaggio termini con un fine riga outer.epilogue = '' for filename in os.listdir(dir): path = os.path.join(dir, filename) if not os.path.isfile(path): continue # Individua il tipo del contenuto in base all'estensione del #+ file. La codifica verrà ignorata, anche se dovremmo effettuare #+ un controllo su cosette come file compressi e gzip. ctype, encoding = mimetypes.guess_type(path) if ctype is None or encoding is not None: # Non si capisce il tipo o il file è codificato (compresso) #+ quindi si usa un generico tipo bag-of-bits. ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) if maintype == 'text': fp = open(path) # Notate: dovrebbe gestire la tipologia del carattere usato msg = MIMEText(fp.read(), _subtype=subtype) fp.close() elif maintype == 'image': fp = open(path, 'rb') msg = MIMEImage(fp.read(), _subtype=subtype) fp.close() elif maintype == 'audio': fp = open(path, 'rb') msg = MIMEAudio(fp.read(), _subtype=subtype) fp.close() else: fp = open(path, 'rb') msg = MIMEBase(maintype, subtype) msg.set_payload(fp.read()) fp.close() # Codifica il carico utile usando Base64 Encoders.encode_base64(msg) # Imposta il parametro del nome del file msg.add_header('Content-Disposition', 'attachment', filename=filename) outer.attach(msg) # Adesso invia il messaggio s = smtplib.SMTP() s.connect() s.sendmail(sender, recips, outer.as_string()) s.close() if __name__ == '__main__': main()