#!/usr/bin/env python from __future__ import with_statement from smtpd import SMTPServer import asyncore from email import message_from_string import os from datetime import datetime import smtplib #ripped out of mimetypes.MimeTypes().types_map_inv exts = { 'application/andrew-inset': '.ez', 'application/annodex': '.anx', 'application/atomcat+xml': '.atomcat', 'application/atomserv+xml': '.atomsrv', 'application/atom+xml': '.atom', 'application/bbolin': '.lin', 'application/cap': '.cap', 'application/cu-seeme': '.cu', 'application/davmount+xml': '.davmount', 'application/dsptype': '.tsp', 'application/ecmascript': '.es', 'application/hta': '.hta', 'application/java-archive': '.jar', 'application/javascript': '.js', 'application/java-serialized-object': '.ser', 'application/java-vm': '.class', 'application/m3g': '.m3g', 'application/mac-binhex40': '.hqx', 'application/mathematica': '.nb', 'application/msaccess': '.mdb', 'application/msword': '.doc', 'application/mxf': '.mxf', 'application/octet-stream': '.bin', 'application/oda': '.oda', 'application/ogg': '.ogx', 'application/pdf': '.pdf', 'application/pgp-keys': '.key', 'application/pgp-signature': '.pgp', 'application/pics-rules': '.prf', 'application/pkcs7-mime': '.p7c', 'application/postscript': '.ps', 'application/rar': '.rar', 'application/rdf+xml': '.rdf', 'application/rss+xml': '.rss', 'application/rtf': '.rtf', 'application/rtf': '.rtf', 'application/smil': '.smil', 'application/vnd.android.package-archive': '.apk', 'application/vnd.cinderella': '.cdy', 'application/vnd.google-earth.kml+xml': '.kml', 'application/vnd.google-earth.kmz': '.kmz', 'application/vnd.mozilla.xul+xml': '.xul', 'application/vnd.ms-excel': '.xls', 'application/vnd.ms-pki.seccat': '.cat', 'application/vnd.ms-pki.stl': '.stl', 'application/vnd.ms-powerpoint': '.ppt', 'application/vnd.oasis.opendocument.chart': '.odc', 'application/vnd.oasis.opendocument.database': '.odb', 'application/vnd.oasis.opendocument.formula': '.odf', 'application/vnd.oasis.opendocument.graphics': '.odg', 'application/vnd.oasis.opendocument.graphics-template': '.otg', 'application/vnd.oasis.opendocument.image': '.odi', 'application/vnd.oasis.opendocument.presentation': '.odp', 'application/vnd.oasis.opendocument.presentation-template': '.otp', 'application/vnd.oasis.opendocument.spreadsheet': '.ods', 'application/vnd.oasis.opendocument.spreadsheet-template': '.ots', 'application/vnd.oasis.opendocument.text-master': '.odm', 'application/vnd.oasis.opendocument.text': '.odt', 'application/vnd.oasis.opendocument.text-template': '.ott', 'application/vnd.oasis.opendocument.text-web': '.oth', 'application/vnd.openxmlformats-officedocument.presentationml.presentation': '.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': '.ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.template': '.potx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': '.xltx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': '.dotx', 'application/vnd.rim.cod': '.cod', 'application/vnd.smaf': '.mmf', 'application/vnd.stardivision.calc': '.sdc', 'application/vnd.stardivision.chart': '.sds', 'application/vnd.stardivision.draw': '.sda', 'application/vnd.stardivision.impress': '.sdd', 'application/vnd.stardivision.writer-global': '.sgl', 'application/vnd.stardivision.writer': '.sdw', 'application/vnd.sun.xml.calc': '.sxc', 'application/vnd.sun.xml.calc.template': '.stc', 'application/vnd.sun.xml.draw': '.sxd', 'application/vnd.sun.xml.draw.template': '.std', 'application/vnd.sun.xml.impress': '.sxi', 'application/vnd.sun.xml.impress.template': '.sti', 'application/vnd.sun.xml.math': '.sxm', 'application/vnd.sun.xml.writer.global': '.sxg', 'application/vnd.sun.xml.writer': '.sxw', 'application/vnd.sun.xml.writer.template': '.stw', 'application/vnd.symbian.install': '.sis', 'application/vnd.visio': '.vsd', 'application/vnd.wap.wbxml': '.wbxml', 'application/vnd.wap.wmlc': '.wmlc', 'application/vnd.wap.wmlscriptc': '.wmlsc', 'application/vnd.wordperfect5.1': '.wp5', 'application/vnd.wordperfect': '.wpd', 'application/x-123': '.wk', 'application/x-7z-compressed': '.7z', 'application/x-abiword': '.abw', 'application/x-apple-diskimage': '.dmg', 'application/x-bcpio': '.bcpio', 'application/x-bittorrent': '.torrent', 'application/x-cab': '.cab', 'application/x-cbr': '.cbr', 'application/x-cbz': '.cbz', 'application/x-cdf': '.cdf', 'application/x-cdlink': '.vcd', 'application/x-chess-pgn': '.pgn', 'application/x-cpio': '.cpio', 'application/x-debian-package': '.deb', 'application/x-dms': '.dms', 'application/x-doom': '.wad', 'application/x-dvi': '.dvi', 'application/x-font': '.gsf', 'application/x-freemind': '.mm', 'application/x-futuresplash': '.spl', 'application/x-gnumeric': '.gnumeric', 'application/x-go-sgf': '.sgf', 'application/x-graphing-calculator': '.gcf', 'application/x-gtar': '.tgz', 'application/x-hdf': '.hdf', 'application/xhtml+xml': '.xhtml', 'application/x-httpd-eruby': '.rhtml', 'application/x-httpd-php3': '.php3', 'application/x-httpd-php3-preprocessed': '.php3p', 'application/x-httpd-php4': '.php4', 'application/x-httpd-php5': '.php5', 'application/x-httpd-php': '.php', 'application/x-httpd-php-source': '.phps', 'application/x-ica': '.ica', 'application/x-info': '.info', 'application/x-internet-signup': '.ins', 'application/x-iphone': '.iii', 'application/x-iso9660-image': '.iso', 'application/x-jam': '.jam', 'application/x-java-jnlp-file': '.jnlp', 'application/x-jmol': '.jmz', 'application/x-kchart': '.chrt', 'application/x-killustrator': '.kil', 'application/x-koan': '.skm', 'application/x-kpresenter': '.kpr', 'application/x-kspread': '.ksp', 'application/x-kword': '.kwd', 'application/x-latex': '.latex', 'application/x-lha': '.lha', 'application/x-lyx': '.lyx', 'application/x-lzh': '.lzh', 'application/x-lzx': '.lzx', 'application/x-maker': '.fm', 'application/x-mif': '.mif', 'application/xml': '.xml', 'application/x-msdos-program': '.exe', 'application/x-msi': '.msi', 'application/x-ms-wmd': '.wmd', 'application/x-ms-wmz': '.wmz', 'application/x-netcdf': '.nc', 'application/x-ns-proxy-autoconfig': '.pac', 'application/x-nwc': '.nwc', 'application/x-object': '.o', 'application/x-oz-application': '.oza', 'application/x-pkcs12': '.p12', 'application/x-pkcs7-certreqresp': '.p7r', 'application/x-pkcs7-crl': '.crl', 'application/x-python-code': '.pyc', 'application/x-qgis': '.qgs', 'application/x-quicktimeplayer': '.qtl', 'application/x-redhat-package-manager': '.rpm', 'application/x-ruby': '.rb', 'application/x-shar': '.shar', 'application/x-shockwave-flash': '.swf', 'application/x-silverlight': '.scr', 'application/xspf+xml': '.xspf', 'application/x-stuffit': '.sit', 'application/x-sv4cpio': '.sv4cpio', 'application/x-sv4crc': '.sv4crc', 'application/x-tar': '.tar', 'application/x-tex-gf': '.gf', 'application/x-texinfo': '.texi', 'application/x-tex-pk': '.pk', 'application/x-trash': '.bak', 'application/x-troff-man': '.man', 'application/x-troff-me': '.me', 'application/x-troff-ms': '.ms', 'application/x-troff': '.tr', 'application/x-ustar': '.ustar', 'application/x-wais-source': '.src', 'application/x-wingz': '.wz', 'application/x-x509-ca-cert': '.crt', 'application/x-xcf': '.xcf', 'application/x-xfig': '.fig', 'application/x-xpinstall': '.xpi', 'application/zip': '.zip', 'audio/amr': '.amr', 'audio/amr-wb': '.awb', 'audio/annodex': '.axa', 'audio/basic': '.snd', 'audio/flac': '.flac', 'audio/midi': '.mid', 'audio/midi': '.mid', 'audio/mpeg': '.mp3', 'audio/ogg': '.ogg', 'audio/prs.sid': '.sid', 'audio/x-aiff': '.aif', 'audio/x-gsm': '.gsm', 'audio/x-mpegurl': '.m3u', 'audio/x-ms-wax': '.wax', 'audio/x-ms-wma': '.wma', 'audio/x-pn-realaudio': '.rm', 'audio/x-realaudio': '.ra', 'audio/x-scpls': '.pls', 'audio/x-sd2': '.sd2', 'audio/x-wav': '.wav', 'chemical/x-alchemy': '.alc', 'chemical/x-cache': '.cac', 'chemical/x-cache-csf': '.csf', 'chemical/x-cactvs-binary': '.cbin', 'chemical/x-cdx': '.cdx', 'chemical/x-cerius': '.cer', 'chemical/x-chem3d': '.c3d', 'chemical/x-chemdraw': '.chm', 'chemical/x-cif': '.cif', 'chemical/x-cmdf': '.cmdf', 'chemical/x-cml': '.cml', 'chemical/x-compass': '.cpa', 'chemical/x-crossfire': '.bsd', 'chemical/x-csml': '.csm', 'chemical/x-ctx': '.ctx', 'chemical/x-cxf': '.cxf', 'chemical/x-embl-dl-nucleotide': '.embl', 'chemical/x-galactic-spc': '.spc', 'chemical/x-gamess-input': '.gam', 'chemical/x-gaussian-checkpoint': '.fch', 'chemical/x-gaussian-cube': '.cub', 'chemical/x-gaussian-input': '.gau', 'chemical/x-gaussian-log': '.gal', 'chemical/x-gcg8-sequence': '.gcg', 'chemical/x-genbank': '.gen', 'chemical/x-hin': '.hin', 'chemical/x-isostar': '.istr', 'chemical/x-jcamp-dx': '.jdx', 'chemical/x-kinemage': '.kin', 'chemical/x-macmolecule': '.mcm', 'chemical/x-macromodel-input': '.mmd', 'chemical/x-mdl-molfile': '.mol', 'chemical/x-mdl-rdfile': '.rd', 'chemical/x-mdl-rxnfile': '.rxn', 'chemical/x-mdl-sdfile': '.sdf', 'chemical/x-mdl-tgf': '.tgf', 'chemical/x-mmcif': '.mcif', 'chemical/x-mol2': '.mol2', 'chemical/x-molconn-Z': '.b', 'chemical/x-mopac-graph': '.gpt', 'chemical/x-mopac-input': '.mop', 'chemical/x-mopac-out': '.moo', 'chemical/x-mopac-vib': '.mvb', 'chemical/x-ncbi-asn1-ascii': '.prt', 'chemical/x-ncbi-asn1-binary': '.aso', 'chemical/x-ncbi-asn1-spec': '.asn', 'chemical/x-pdb': '.pdb', 'chemical/x-rosdal': '.ros', 'chemical/x-swissprot': '.sw', 'chemical/x-vamas-iso14976': '.vms', 'chemical/x-vmd': '.vmd', 'chemical/x-xtel': '.xtel', 'chemical/x-xyz': '.xyz', 'image/gif': '.gif', 'image/ief': '.ief', 'image/jpeg': '.jpg', 'image/jpg': '.jpg', 'image/pcx': '.pcx', 'image/pict': '.pic', 'image/png': '.png', 'image/svg+xml': '.svg', 'image/tiff': '.tiff', 'image/vnd.djvu': '.djv', 'image/vnd.wap.wbmp': '.wbmp', 'image/x-canon-cr2': '.cr2', 'image/x-canon-crw': '.crw', 'image/x-cmu-raster': '.ras', 'image/x-coreldraw': '.cdr', 'image/x-coreldrawpattern': '.pat', 'image/x-coreldrawtemplate': '.cdt', 'image/x-corelphotopaint': '.cpt', 'image/x-epson-erf': '.erf', 'image/x-icon': '.ico', 'image/x-jg': '.art', 'image/x-jng': '.jng', 'image/x-ms-bmp': '.bmp', 'image/x-nikon-nef': '.nef', 'image/x-olympus-orf': '.orf', 'image/x-photoshop': '.psd', 'image/x-portable-anymap': '.pnm', 'image/x-portable-bitmap': '.pbm', 'image/x-portable-graymap': '.pgm', 'image/x-portable-pixmap': '.ppm', 'image/x-rgb': '.rgb', 'image/x-xbitmap': '.xbm', 'image/x-xpixmap': '.xpm', 'image/x-xwindowdump': '.xwd', 'message/rfc822': '.eml', 'model/iges': '.igs', 'model/mesh': '.msh', 'model/x3d+binary': '.x3db', 'model/x3d+vrml': '.x3dv', 'model/x3d+xml': '.x3d', 'text/cache-manifest': '.manifest', 'text/calendar': '.ics', 'text/css': '.css', 'text/csv': '.csv', 'text/h323': '.323', 'text/html': '.htm', 'text/iuls': '.uls', 'text/mathml': '.mml', 'text/plain': '.txt', 'text/richtext': '.rtx', 'text/scriptlet': '.sct', 'text/tab-separated-values': '.tsv', 'text/texmacs': '.tm', 'text/vnd.sun.j2me.app-descriptor': '.jad', 'text/vnd.wap.wmlscript': '.wmls', 'text/vnd.wap.wml': '.wml', 'text/x-bibtex': '.bib', 'text/x-boo': '.boo', 'text/x-chdr': '.h', 'text/x-c++hdr': '.hpp', 'text/x-component': '.htc', 'text/x-csh': '.csh', 'text/x-csrc': '.c', 'text/x-c++src': '.cpp', 'text/x-diff': '.diff', 'text/x-dsrc': '.d', 'text/x-haskell': '.hs', 'text/x-java': '.java', 'text/x-literate-haskell': '.lhs', 'text/x-moc': '.moc', 'text/x-pascal': '.pas', 'text/x-pcs-gcd': '.gcd', 'text/x-perl': '.pl', 'text/x-python': '.py', 'text/x-scala': '.scala', 'text/x-setext': '.etx', 'text/x-sgml': '.sgml', 'text/x-sh': '.sh', 'text/x-tcl': '.tcl', 'text/x-tex': '.tex', 'text/xul': '.xul', 'text/x-vcalendar': '.vcs', 'text/x-vcard': '.vcf', 'video/3gpp': '.3gp', 'video/annodex': '.axv', 'video/dl': '.dl', 'video/dv': '.dv', 'video/fli': '.fli', 'video/gl': '.gl', 'video/mp4': '.mp4', 'video/mpeg': '.mpg', 'video/ogg': '.ogv', 'video/quicktime': '.mov', 'video/vnd.mpegurl': '.mxu', 'video/x-flv': '.flv', 'video/x-la-asf': '.lsf', 'video/x-matroska': '.mkv', 'video/x-mng': '.mng', 'video/x-ms-asf': '.asf', 'video/x-msvideo': '.avi', 'video/x-ms-wmv': '.wmv', 'video/x-ms-wm': '.wm', 'video/x-ms-wmx': '.wmx', 'video/x-ms-wvx': '.wvx', 'video/x-sgi-movie': '.movie', 'x-conference/x-cooltalk': '.ice', 'x-epoc/x-sisx-app': '.sisx', 'x-world/x-vrml': '.vrml' } forward_addr = { 'josch':'j.schauer@email.de' } class DisposableMailServer(SMTPServer): def process_message(self, peer, mailfrom, rcpttos, data): rcpttos = [x[:-17] for x in rcpttos if x.endswith('@mister-muffin.de') and len(x)>17] if not rcpttos: return None if "platinum" in rcpttos: return None print "new mail for", rcpttos msg = message_from_string(data) basepath = '/var/www/mister-muffin.de/mail/' counter = 1 now = datetime.now() header, _ = msg.as_string().split('\n\n', 1) for name in rcpttos: if name in forward_addr: server = smtplib.SMTP("mx-ha01.web.de") server.sendmail(mailfrom, [forward_addr[name]], data) server.quit() path = os.path.join(basepath, name, now.isoformat()) if not os.path.exists(path): os.makedirs(path) # not using the mailbox module because it creates mailboxes with # executable bit and messes up the From with open(os.path.join(path, "message.mbox"), "w") as f: f.write("From %s %s\r\n"%(mailfrom, now.strftime('%a %b %d %H:%M:%S %Y'))) f.write(data) with open(os.path.join(path, "header.txt"), "w") as f: f.write(header) for part in msg.walk(): if part.get_content_maintype() == 'multipart': continue filename = part.get_filename() if not filename: ext = exts.get(part.get_content_type()) if not ext: ext = '.bin' filename = 'part-%03d%s'%(counter,ext) else: filename = 'part-%03d-%s'%(counter,filename) filename = os.path.join(path, filename) if part.get_payload(decode=True): with open(filename, "w") as f: f.write(part.get_payload(decode=True)) counter += 1 if __name__ == '__main__': proxy = DisposableMailServer(("mister-muffin.de", 25), ("localhost", 25)) try: asyncore.loop() except KeyboardInterrupt: pass