def get_header_content(name='', str_encoded=''): message = Parser().parse(open(sys.argv[1])) for line in NEWLINE.split(message.get(name)): decoded_headers = decode_header(line) for parts in decoded_headers: str_encoded = str_encoded + parts[0] return re.sub('(\r\n|\s|\t){2,}', ' ', str_encoded)
def get_message_date(content, header='Date'): """Parses mail and returns resulting timestamp. :param header: the header to extract date from; :returns: timestamp or `None` in the case of failure. """ message = MailParser().parsestr(content, True) dateheader = message.get(header) # parsedate_tz returns a 10-tuple that can be passed to mktime_tz # Will be None if missing or not in a valid format. Note that # indexes 6, 7, and 8 of the result tuple are not usable. datetuple = email.utils.parsedate_tz(dateheader) if datetuple is None: return None return email.utils.mktime_tz(datetuple)
def get_message_date(content, header='Date'): """Parses mail and returns resulting timestamp. :param header: the header to extract date from; :returns: timestamp or `None` in the case of failure. """ message = MailParser().parsestr(content, True) dateheader = message.get(header) # parsedate_tz returns a 10-tuple that can be passed to mktime_tz # Will be None if missing or not in a valid format. Note that # indexes 6, 7, and 8 of the result tuple are not usable. datetuple = email.utils.parsedate_tz(dateheader) if datetuple is None: return None return email.utils.mktime_tz(datetuple)
def accept(game, locale, stream, extend=None): global rootdir, orderbase, gamedir, gamename, sender if extend is not None: orderbase = orderbase + ".pre-" + extend savedir = os.path.join(gamedir, orderbase) # check if it's one of the pre-sent orders. # create the save-directories if they don't exist if not os.path.exists(gamedir): os.mkdir(gamedir) if not os.path.exists(savedir): os.mkdir(savedir) # parse message message = Parser().parse(stream) email = get_sender(message) logger = logging.getLogger(email) # write syslog if email is None or valid_email(email) == 0: logger.warning("invalid email address: " + str(email)) return -1 logger.info("received orders from " + email) # get an available filename maxdate, filename = available_file(savedir, prefix + email) if filename is None: logger.warning("more than " + str(maxfiles) + " orders from " + email) return -1 # copy the orders to the file turndate = None maildate = message.get("Date") if maildate is None: turndate = time.time() else: turndate = rfc822.mktime_tz(rfc822.parsedate_tz(maildate)) text_ok = copy_orders(message, filename, email, turndate) warning, msg, fail = None, "", False if not maildate is None: os.utime(filename, (turndate, turndate)) logger.debug("mail date is '%s' (%d)" % (maildate, turndate)) if False and turndate < maxdate: logger.warning("inconsistent message date " + email) warning = " (" + messages["warning-" + locale] + ")" msg = msg + formatpar( messages["maildate-" + locale] % (time.ctime(maxdate), time.ctime(turndate)), 76, 2) + "\n" else: logger.warning("missing message date " + email) warning = " (" + messages["warning-" + locale] + ")" msg = msg + formatpar(messages["nodate-" + locale], 76, 2) + "\n" print('ACCEPT_MAIL=' + email) print('ACCEPT_FILE="' + filename + '"') if not text_ok: warning = " (" + messages["error-" + locale] + ")" msg = msg + formatpar(messages["multipart-" + locale], 76, 2) + "\n" logger.warning("rejected - no text/plain in orders from " + email) os.unlink(filename) savedir = savedir + "/rejected" if not os.path.exists(savedir): os.mkdir(savedir) maxdate, filename = available_file(savedir, prefix + email) store_message(message, filename) fail = True if sendmail and warning is not None: subject = gamename + " " + messages["subject-" + locale] + warning print("mail " + subject) ps = subprocess.Popen(['mutt', '-s', subject, email], stdin=subprocess.PIPE) ps.communicate(msg) if not sendmail: print text_ok, fail, email print filename if not fail: queue = open(gamedir + "/orders.queue", "a") queue.write("email=%s file=%s locale=%s game=%s\n" % (email, filename, locale, game)) queue.close() logger.info("done - accepted orders from " + email) return 0
line = fo.readline() return int(line) # the main body of the script: logging.basicConfig(filename=LOG_FILENAME, level=logging.INFO) logger = logging infile = sys.stdin if len(sys.argv)>1: logger.info('reading message from %s' % sys.argv[1]) infile = open(sys.argv[1], "r") else: logger.info('reading message from stdin') message = Parser().parse(infile) replyto = message.get('Reply-To') or message.get('From') sender = None if (replyto is None) else email.utils.parseaddr(replyto)[1] if sender is None or valid_email(sender)==0: logger.error("invalid email address: " + str(sender)) sys.exit(-1) else: logger = logging.getLogger(sender) logger.info("received orders from " + sender) subject = message.get('Subject') m = re.match(r'.*ATLA\S*\s*ORDER\S*\s*GAME\s*(\d+)', subject, re.IGNORECASE) if m is None: logger.error("invalid subject line: " + str(subject)) sys.exit(-2) game = m.expand(r'game-\1') if not os.path.exists(game): logger.error('invalid game %s' % game)
def accept(game, locale, stream, extend=None): global rootdir, orderbase, gamedir, gamename, sender if extend is not None: orderbase = orderbase + ".pre-" + extend savedir = os.path.join(gamedir, orderbase) # check if it's one of the pre-sent orders. # create the save-directories if they don't exist if not os.path.exists(gamedir): os.mkdir(gamedir) if not os.path.exists(savedir): os.mkdir(savedir) # parse message message = Parser().parse(stream) email = get_sender(message) logger = logging.getLogger(email) # write syslog if email is None or valid_email(email)==0: logger.warning("invalid email address: " + str(email)) return -1 logger.info("received orders from " + email) # get an available filename maxdate, filename = available_file(savedir, prefix + email) if filename is None: logger.warning("more than " + str(maxfiles) + " orders from " + email) return -1 # copy the orders to the file turndate = None maildate = message.get("Date") if maildate is None: turndate = time.time() else: turndate = rfc822.mktime_tz(rfc822.parsedate_tz(maildate)) text_ok = copy_orders(message, filename, email, turndate) warning, msg, fail = None, "", False if not maildate is None: os.utime(filename, (turndate, turndate)) logger.debug("mail date is '%s' (%d)" % (maildate, turndate)) if False and turndate < maxdate: logger.warning("inconsistent message date " + email) warning = " (" + messages["warning-" + locale] + ")" msg = msg + formatpar(messages["maildate-" + locale] % (time.ctime(maxdate), time.ctime(turndate)), 76, 2) + "\n" else: logger.warning("missing message date " + email) warning = " (" + messages["warning-" + locale] + ")" msg = msg + formatpar(messages["nodate-" + locale], 76, 2) + "\n" print('ACCEPT_MAIL=' + email) print('ACCEPT_FILE="' + filename + '"') if not text_ok: warning = " (" + messages["error-" + locale] + ")" msg = msg + formatpar(messages["multipart-" + locale], 76, 2) + "\n" logger.warning("rejected - no text/plain in orders from " + email) os.unlink(filename) savedir = savedir + "/rejected" if not os.path.exists(savedir): os.mkdir(savedir) maxdate, filename = available_file(savedir, prefix + email) store_message(message, filename) fail = True if sendmail and warning is not None: subject = gamename + " " + messages["subject-"+locale] + warning print("mail " + subject) ps = subprocess.Popen(['mutt', '-s', subject, email], stdin=subprocess.PIPE) ps.communicate(msg) if not sendmail: print text_ok, fail, email print filename if not fail: queue = open(gamedir + "/orders.queue", "a") queue.write("email=%s file=%s locale=%s game=%s\n" % (email, filename, locale, game)) queue.close() logger.info("done - accepted orders from " + email) return 0
return int(line) # the main body of the script: logging.basicConfig(filename=LOG_FILENAME, level=logging.INFO) logger = logging infile = sys.stdin if len(sys.argv) > 1: logger.info('reading message from %s' % sys.argv[1]) infile = open(sys.argv[1], "r") else: logger.info('reading message from stdin') message = Parser().parse(infile) replyto = message.get('Reply-To') or message.get('From') sender = None if (replyto is None) else email.utils.parseaddr(replyto)[1] if sender is None or valid_email(sender) == 0: logger.error("invalid email address: " + str(sender)) sys.exit(-1) else: logger = logging.getLogger(sender) logger.info("received orders from " + sender) subject = message.get('Subject') m = re.match(r'.*ATLA\S*\s*ORDER\S*\s*GAME\s*(\d+)', subject, re.IGNORECASE) if m is None: logger.error("invalid subject line: " + str(subject)) sys.exit(-2) game = m.expand(r'game-\1') if not os.path.exists(game): logger.error('invalid game %s' % game)