Example #1
0
def _shouldProcess(path, msg):
    """
    @todo: rate, interval configuration
    """
    world = goneutil.RealWorld()

    err = blacklist.isBlacklist(msg)
    if err:
        return err

    seen = sets.Set()
    for deliveredTo in msg.get_all("Delivered-To", []):
        if deliveredTo in seen:
            # duplicate Delivered-To -- loop detected
            return "Message has duplicated Delivered-To line: %s" % deliveredTo
        seen.add(deliveredTo)

    rate = ratedir.RateDir(world, path)
    sender = goneutil.getSender(msg)
    try:
        rate.tick(sender)
    except igone.RateExceededError:
        return "Sender has sent too many messages"

    return False
Example #2
0
def isBlacklist(msg):
    """
    Should we never autorespond to this message?

    @param msg: the message
    @type msg: email.Message

    @return: An object that is true if message was
    blacklisted. Otherwise, it is non-true. If it is true, it can be
    stringified for an explanation.
    """
    sender = util.getSender(msg)
    r = isBadSender(sender)
    if r:
        return r

    r = isMailingList(msg)
    if r:
        return r

    for s in msg.get_all('Precedence', []):
        precedence = s.split(None, 1)[0]
        if precedence.lower() in ['junk', 'bulk', 'list']:
            return "Message has a junk, bulk, or list precedence header"

    return False
Example #3
0
 def _cb(r, msg):
     if r:
         return r
     d = defer.maybeDeferred(
         prepare,
         msg,
         reply=goneInfo.message,
         recipient=recipient,
         recipientName=recipientName,
         subjectPrefix=goneInfo.settings.get("Subject", None),
     )
     d.addCallback(_send, smtpHost=smtpHost, sender=sender, recipient=goneutil.getSender(msg))
     return d
Example #4
0
def prepare(msg, reply, recipient=None, recipientName=None, subjectPrefix=None):
    sender = goneutil.getSender(msg)

    if "From" not in reply and recipient is not None:
        if "@" in recipient:
            local, host = recipient.split("@", 1)
            box, domain = util.host_split(host)
            if domain is not None:
                host = domain
            recipient = str(smtp.Address(local, host))
        reply["From"] = email.Utils.formataddr((recipientName, recipient))

    to = msg.get_all("Sender", None)
    if to is None:
        to = msg.get_all("From", None)
    if to is None:
        to = [sender]
    for addr in to:
        reply["To"] = addr

    if "Subject" not in reply:
        subject = msg["Subject"]
        if subject is None:
            # echo foo | mail testaccount has no subject, if vacation
            # message has no subject either, sees this.. ugly due to
            # lack of l10n
            subject = "Your mail"
        if subjectPrefix is not None:
            subject = subjectPrefix + subject
        reply["Subject"] = subject

    msgid = msg.get("Message-ID", None)
    if msgid is not None:
        msgid = msgid.strip()
        reply["In-Reply-To"] = msgid

    if reply.is_multipart():
        reply.attach(MIMEMessage(msg))
    return reply