#!/usr/bin/python # -*- coding: utf-8 -*- import sys, os, tempfile, string # библиотека для работы с SMTP import smtplib # библиотеки для разбора email import email.Message from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email.Header import make_header from email.Utils import formatdate # адрес и порт SMTP-сервера для отправки server = '192.168.1.1' port = 25 # кодировка обратного письма icharset = 'koi8-r' # кодировка для имен файлов encodeto = 'koi8_r' # путь к LibreOffice soffice = "/opt/libreoffice3.5/program/soffice" # форматы и фильтры для конвертации # ограничимся вордом и экселем convfilters = {'doc':'doc:"MS Word 97"','xls':'xls:"MS Excel 97"'} # функция для отправки сообщения def sendmail(to, subject, message, files): from_address = 'conv' msg = MIMEMultipart() hdr = make_header([(subject, icharset)]) msg['From'] = from_address msg['To'] = to msg['Date'] = formatdate(localtime=True) msg['Subject'] = hdr msg.attach(MIMEText(message, _charset=icharset)) for filename in files: path = filename if os.path.isfile(path.encode(encodeto)): filename = os.path.basename(path) ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) fp = open(path.encode(encodeto), 'rb') fmsg = MIMEBase(maintype, subtype) fmsg.set_payload(fp.read()) fp.close() email.Encoders.encode_base64(fmsg) # hd_fname = make_header([(filename,icharset)]) fname = filename.encode(encodeto) fmsg.add_header('Content-Disposition', 'attachment', filename=fname) msg.attach(fmsg) srv = smtplib.SMTP(server, port) srv.ehlo() srv.sendmail(from_address, to, msg.as_string()) srv.close() # основной код скрипта tempfile.tempdir = "/tmp" tempname=tempfile.mktemp(".conv.tmp") # тут запомним все временные файлы, чтобы потом их удалить allfiles = [] # тут запомним сконвертированные файлы, чтобы потом их отправить convfiles = [] # сохраним исходное письмо во временный файл f = open(tempname, "w+b") f.write(sys.stdin.read()) f.close() allfiles.append(tempname) f = open(tempname) # читаем сообщение из файла message=email.message_from_file(f) f.close() to = message['From'] subject = message['Subject'] # разбираем части сообщения for part in message.walk(): if part.is_multipart(): continue #если часть сообщения — прикрепленный файл if part.get_filename() != None: (filename, fileext) = os.path.splitext(part.get_filename()) if (fileext == '.docx') or (fileext == '.xlsx'): doctype = fileext[1:4] cfilter = convfilters[doctype] docfile = '/tmp/'+filename+fileext # сохраним вложенный файл f = open(docfile.encode(encodeto), "wb") f.write(part.get_payload(decode=True)) f.close() allfiles.append(docfile) # строка запуска LibreOffice command = soffice+" --headless --convert-to "+cfilter+" --outdir /tmp \""+docfile+"\"" os.system(command.encode(encodeto)) newdocfile="/tmp/"+filename+"."+doctype allfiles.append(newdocfile) convfiles.append(newdocfile) # если есть что отправлять, отправляем if len(convfiles): sendmail(to,'Re:'+subject,'',convfiles) # прибираем за собой for filename in allfiles: os.remove(filename.encode(encodeto))