Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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
Пример #5
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)
Пример #6
0
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
Пример #7
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)