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
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)
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()
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: