Exemplo n.º 1
0
def print_error(e):
    try:
        # sys.stderr.write('Exception: %s' % e)
        if WLog.log_file:
            WLog.error("Exception: %s" % e)
            traceback.print_exc(file=WLog.log_file)
            WLog.close()
    except:
        # File silently, as we can't log or print the error
        pass
Exemplo n.º 2
0
    def parse(self):
        # Split the data into headers and body
        split = data.find("\n\n")
        self.header_data = "%s\n\n" % data[:split]
        self.body_data = data[split + 2 :]

        # parse the e-mail header
        WLog.debug("Parsing e-mail")
        message = email.message_from_string(self.header_data)
        try:
            self.mail_to = sys.argv[sys.argv.index("-d") + 1]
        except (IndexError, ValueError):
            WLog.error("no recipient found")
            sys.stderr.write("no recipient found")
            sys.exit(2)
        try:
            self.mail_from = sys.argv[sys.argv.index("-f") + 1]
        except (IndexError, ValueError):
            self.mail_from = "unknown"
        if not self.mail_from:
            self.mail_from = message.get("From")
        if not self.mail_to:
            self.mail_to = message.get("Delivered-To")
        WLog.debug("e-mail from %s to %s" % (self.mail_from, self.mail_to))

        try:
            (self.user, self.domain) = self.mail_to.split("@")
        except:
            WLog.error("no valid destination mail address %s" % self.mail_to)
            sys.stderr.write("no valid destination mail address %s" % self.mail_to)
            sys.exit(3)

        try:
            self.extensions = sys.argv[sys.argv.index("-e") + 1]
        except (IndexError, ValueError):
            self.extensions = ""

        if self.extensions:
            (self.user, extensions) = self.user.split(DELIMITER)
            if self.extensions != extensions:
                WLog.error("self.extensions=%s extensions=%s" % (self.extensions, extensions))

        # set maildrop as default deliver
        self.deliver_application = [
            MAILDROP_DELIVER,
            "-d",
            "vmail",
            self.extensions,
            self.mail_to,
            self.user,
            self.domain,
            self.mail_from,
            "-w",
            "90",
        ]

        # replace Return-Path: <MAILER-DAEMON>
        try:
            if message.get("Return-Path") == "<MAILER-DAEMON>":
                WLog.notice("replace Return-Path: <MAILER-DAEMON> to %s" % MAILER_DAEMON)
                status, result = run([REFORMAIL, "-I", "Return-Path:%s" % MAILER_DAEMON], self.header_data)
                if status == 0:
                    self.header_data = result
        except Exception, e:
            WLog.error("%s" % e)
Exemplo n.º 3
0
 def deliver(self):
     WLog.debug("User %s Group %s" % (os.getuid(), os.getgid()))
     WLog.debug("Deliver with: %s" % self.deliver_application)
     p = subprocess.Popen(self.deliver_application, stdin=subprocess.PIPE)
     p.stdin.write(self.data)
     p.stdin.close()
Exemplo n.º 4
0
                check_spam_bool = result[0][1]
                self.required_spam_score = float(result[0][2])
            except Exception, e:  # any errors
                pass

        try:
            result = self.sql.execute("SELECT uid, gid FROM mail_users WHERE email=%s", self.mail_to, True)
            self.uid = int(result[0][0])
            self.gid = int(result[0][1])
        except Exception:  # any errors
            pass

        try:
            setuid(self.uid, self.gid)
        except OSError, e:
            WLog.warning("Can not set uid/gid %s" % e)
            pass

        if check_virus_bool:
            # Check for viruses
            self.is_virus, virus_headers = self.check_virus()
        else:
            virus_headers = []

        # Only check for spam if there's no virus, check_spam_bool=True and if the mail is smaller than MAX_SPAM_SIZE
        if not self.is_virus and len(data) <= MAX_SPAM_SIZE and check_spam_bool:
            self.is_spam, spam_headers = self.check_spam()
        else:
            spam_headers = []

        try: