def get_message(self, msg, smtp, header, nmesg): msg_list = [] iter = 0 total = 0 first = 1 # Some alias to optimize the loop readline = self.objpop.file.readline #takefrom = general.takefrom (optv, optquiet, optsmtp, stderr_write, msg_size, server_bytes_left, optsyslog, optnotlog, optcolors) = self.optimize(msg) self.objpop._shortcmd('RETR %d' % msg['number']) while 1: iter += 1 #if ((iter % 200) == 0) and optsmtp: #smtp.smtpobj.noop() buffer = readline() if buffer[-2:] == '\r\n': if buffer[-3:] == '.\r\n': pass else: buffer = buffer[:-2] + '\n' if first: #fromm = takefrom(buffer) try: rfcObj = rfc822.Message(StringIO.StringIO(buffer)) fromm = rfcObj.getheader('Return-Path').replace("<","").replace(">","") except AttributeError: # Return-Path is not the first line,well... fromm = 'Unknown' first = 0 if not optsyslog: print general.colorize(_("From: %s") % fromm, general.YELLOW) #end if not optsyslog #end if first if not optv: lenb = len(buffer) total += lenb self.totalserv += lenb # De aquí para abajo podría ir en el padre pero se pierde mucho rendimiento (quiero # macros en Python YA!) if not optsyslog and not optquiet: stderr_write('\r') if iter % 5 == 0: strtmp = general.colorize(_("Downloaded: "),general.YELLOW) strtmp2 = general.colorize("%3.0f%%" % (total / ( (msg_size + 0.001) * 1.0) * 100.0), general.WHITE) stderr_write(strtmp + strtmp2) #end if iter % 5 == 0 #end if not optsyslog and not optquiet #end if not optv if buffer == '.\r\n': return ''.join(msg_list), fromm, '' else: msg_list.append(buffer)
def get_messages(self, logAgent, indice_log, is_retry, smtp): nmesg = len(self.lmsg) general.cursor_off() header = '' fromwho = '' if self.delivery == 'mta': deliver = self.deliver_smtp elif self.delivery == 'mbox': deliver = self.deliver_mbox elif self.delivery == 'maildir': deliver = self.deliver_maildir elif self.delivery == 'pipe': deliver = self.deliver_pipe elif self.delivery == 'global': if self.config.optsmtp: deliver = self.deliver_smtp elif self.config.optmbox: deliver = self.deliver_mbox elif self.config.optmaildir: deliver = self.deliver_maildir elif self.config.optsendmail: deliver = self.deliver_pipe num_trans = 0 retcode = 'pass' for msg in self.lmsg[:]: must_deliver = True num_trans += 1 (size, unit) = general.compute(msg['size']) if not self.config.optsyslog: aprint('-'* 21, general.GREEN) if self.config.optexpresion: (retcode, header, fromwho) = self.look_message(msg,logAgent,indice_log,nmesg - num_trans,smtp) if retcode == 'delete': #Deleted if self.config.optsmtp: smtp.smtpobj.noop() continue # end if self.config.optexpresion aprint(_("Downloading message %d (%.2f %s), Left: %d") % (msg['orignumber'], size, unit, nmesg - num_trans),general.VIOLET) (msgbody, fromm, tmpheader) = self.get_message(msg, smtp, header, nmesg) if fromm != '' and fromwho == '': fromwho = fromm if tmpheader != '': header = tmpheader if not self.config.optsyslog and not self.config.optquiet: sys.stderr.write(general.colorize(_("\rDownloaded: "),general.YELLOW)) sys.stderr.write(general.colorize("100%\n",general.WHITE)) # If self.config.optexpression we've already looked for the IMAP # DONTDELETETHISMESSAGE messages in the look_header method if not self.config.optexpresion: if msg['orignumber'] == 1: resultWUIMAP = re_wuimap.search(msgbody) resultWUIMAP2 = re_wuimap.search(header) if (resultWUIMAP is not None) or (resultWUIMAP2 is not None): aprint(_("Ignoring message %d: DONTDELETETHISMESSAGE type message") % (msg['orignumber']), general.RED) retcode = 'wuimap' if retcode == 'wuimap': must_deliver = False try: if retcode == 'postergate': #Message delayed animailBoxPath = self.config.homedir + '/.animail/animailDelayed' if not os.path.exists(animailBoxPath): os.mkdir(animailBoxPath, 0700) (foo,emailaddress) = rfc822.parseaddr(fromwho) tmpbox = open(animailBoxPath + '/' + emailaddress, 'a+') self.write_mbox(tmpbox, header, msgbody, fromm) else: if retcode != 'wuimap': must_deliver = True if (self.config.lpostfilters != []) and (retcode != 'wuimap'): msgstr = self.create_msgstr(header,msgbody) tmpfile = open(tempfile.mktemp(), 'w+') os.chmod(tmpfile.name, 600) tmpfile.write(msgstr) for pfilter in self.config.lpostfilters: output = '' aprint(_("Executing postfilter %s on message...") % pfilter.filtername, general.YELLOW) (pretcode, output) = pfilter.filter_mail(msgstr,tmpfile.name) if pretcode == 1: must_deliver = False if not self.config.optnotlog: logAgent.append_filtered(indice_log,_("%s (Postfiltered by'%s')")%(fromm,pfilter.filtername),msg['size']) if pfilter.savepostfilteredmails != 0: pfilter.log_filtered_mail(msgstr,fromm, output) tmpfile.close() os.unlink(tmpfile.name) if must_deliver: deliver(header, msgbody, fromm, smtp) if self.optdelete and retcode != 'wuimap': aprint(_("Deleting message"), general.YELLOW) self.delmesg(msg) except SMTPException, x: print print _("The local SMTP rejected this message so it won't be deleted from the mail server:"), str(x) smtp.quit() smtp.connect() if not self.config.optnotlog: logAgent.incident(indice_log, str(x)) except socket.error, x: print print _("Socket error sending to the local SMTP, it won't be deleted from the mail server:"), str(x) try: smtp.quit() smtp.connect() except AttributeError: pass if not self.config.optnotlog: logAgent.incident(indice_log, str(x)) continue
def get_message(self, msg, smtp, header, nmesg): #Some alias to optimize the loop readline = self.objimap._get_line (optv, optquiet, optsmtp, stderr_write, msg_size, server_bytes_left,\ optsyslog, optnotlog, optcolors) = self.optimize(msg) #if optsmtp: #smtp_noop = smtp.smtpobj.noop total = 0 msg_list = [] fromm = self.takefrom(msg['number']) if not optsyslog: print colorize(_("From: %s") % fromm, YELLOW) strg = '999 FETCH ' + str(msg['number']) + ' BODY[TEXT]\n' if self.ssl: self.objimap.ssl.write(strg) else: self.objimap.sock.send(strg) linea = readline() tokens = linea.split('{') try: msg_size = int(tokens[len(tokens) - 1].split('}')[0]) except ValueError: msg_size = 0 iter = 0 first = True #This condition is just another kludge, but works and is easier (and more realiable) than #the bytes-counting alternative, if you know of some server giving a different fetch #completed message please tell me lowline = linea.lower() while (lowline[0:22] != '999 ok fetch completed') and (lowline[0:16] != '999 ok completed'): iter += 1 #if ((iter % 200) == 0) and optsmtp: #smtp_noop() if first: self.server_bytes_left -= len(header) first = False #end if first linea = readline() + '\n' msg_list.append(linea) lenb = len(linea) - 1 total += lenb self.totalserv += lenb if not optv: self.totalserv += len(linea) # De aquà para abajo podrÃa ir en el padre, pero serÃa caro en rendimiento # (para cuando macros para Python?) if not optsyslog and not optquiet: stderr_write('\r') if iter % 5 == 0: strtmp = colorize(_("Downloaded: "), YELLOW) strtmp2 = colorize("%3.0f%%" % (total / ( (msg_size + 0.001) * 1.0) * 100.0), WHITE) stderr_write(strtmp + strtmp2) lowline = linea.lower() #end while if not self.config.optexpresion: header = self.get_header(msg, 0) else: header = '' #Already given in look_messages return ''.join(msg_list[:-2]), fromm, header
def show(self): str = '' tmpstr = colorize(_("\n####### Operation summary #######\n\n"), VIOLET) str = ''.join(tmpstr) #FIXME: This should be on local time format (including weekday names) date = time.strftime( ('%a %b %d %H:%M:%S %Y\n'), time.localtime(time.time())) str = ''.join( (str, colorize(date, GREEN)) ) for serv in self.lserv.values(): tmpstr = colorize(_("\n--- Server: "), CYAN) tmpstr2 = colorize("%s\n\n" % serv['name'], RED) str = ''.join( (str, tmpstr, tmpstr2) ) tmpstr = colorize(_("* Total messages: "), CYAN) tmpstr2 = colorize("%s\n" % serv['numtotal'], GREEN) str = ''.join( (str, tmpstr, tmpstr2) ) tmpstr = colorize(_("* Total volume on server: "), CYAN) tmpstr2 = colorize("%.2f %s\n" % (compute(serv['tamtotal'])), GREEN) str = ''.join( (str, tmpstr, tmpstr2) ) tmpstr = colorize(_("* Filtered messages: "), CYAN) tmpstr2 = colorize("%d\n" % serv['numfilt'], GREEN) str = ''.join( (str, tmpstr, tmpstr2) ) if serv['numfilt'] > 0: tmpstr = colorize(_("\tTotal filtered volume: "), CYAN) tmpstr2 = colorize("%.2f %s\n" % compute(serv['filtered_vol']), RED) str = ''.join( (str, tmpstr, tmpstr2) ) tmpstr = colorize(_("* Downloaded messages: "), CYAN) tmpstr2 = colorize("%d\n" % serv['numdesc'], GREEN) str = ''.join( (str, tmpstr, tmpstr2) ) if serv['numdesc'] > 0: tmpstr = colorize(_("\tDownloaded Volume: "), CYAN) tmpstr2 = colorize("%.2f %s\n" % compute(serv['downloaded_vol']), GREEN) str = ''.join( (str, tmpstr, tmpstr2) ) tmpstr = colorize(_("* Postergated messages: "), CYAN) tmpstr2 = colorize("%d\n" % serv['numpost'], GREEN) str = ''.join( (str, tmpstr, tmpstr2) ) if serv['numpost'] > 0: tmpstr = colorize(_("\tPostergated Volume: "), CYAN) tmpstr2 = colorize("%.2f %s\n" % compute(serv['post_vol']),GREEN) str = ''.join( (str,tmpstr,tmpstr2) ) if serv['numfilt'] > 0: tmpstr = colorize(_("\n* Patterns of filtered messages:\n"), CYAN) str = ''.join( (str, tmpstr) ) for pattern in serv['dfilt'].keys(): str = ''.join( (str, colorize("\t%d" % serv['dfilt'][pattern][NUMBER],RED)) ) str = ''.join( (str, colorize(" %s " % pattern, RED))) str = ''.join( (str, colorize("\t\t%.2f %s\n" % compute(serv['dfilt'][pattern][VOLUME]), RED)) ) if serv['numdesc'] > 0: tmpstr = colorize(_("* Origin of downloaded messages:\n"), CYAN) str = ''.join( (str, tmpstr) ) for origin in serv['ddesc'].keys(): str = ''.join( (str, colorize("\t%d" % serv['ddesc'][origin][NUMBER], GREEN))) str = ''.join( (str, colorize(" %s " % origin, GREEN))) str = ''.join( (str, colorize("%.2f %s\n" % compute(serv['ddesc'][origin][VOLUME]), GREEN))) if serv['numpost'] > 0: tmpstr = colorize(_("* Origin of postergated messages:\n"),CYAN) str = ''.join( (str, tmpstr) ) for origin in serv['dpost'].keys(): str = ''.join( (str,colorize("\t%d" % serv['dpost'][origin][NUMBER], GREEN))) str = ''.join( (str, colorize(" %s " % origin, GREEN))) str = ''.join( (str, colorize("%.2f %s\n" % compute(serv['dpost'][origin][VOLUME]),GREEN))) if serv['incidents'] != []: tmpstr = colorize(_("* Incidents:\n"), CYAN) str = ''.join( (str, tmpstr) ) for inc in serv['incidents']: str = ''.join( (str, colorize("\t-%s\n" % inc, RED)) ) print str
def get_messages(self, logAgent, indice_log, is_retry, smtp): nmesg = len(self.lmsg) general.cursor_off() header = '' fromwho = '' if self.delivery == 'mta': deliver = self.deliver_smtp elif self.delivery == 'mbox': deliver = self.deliver_mbox elif self.delivery == 'maildir': deliver = self.deliver_maildir elif self.delivery == 'pipe': deliver = self.deliver_pipe elif self.delivery == 'global': if self.config.optsmtp: deliver = self.deliver_smtp elif self.config.optmbox: deliver = self.deliver_mbox elif self.config.optmaildir: deliver = self.deliver_maildir elif self.config.optsendmail: deliver = self.deliver_pipe num_trans = 0 retcode = 'pass' for msg in self.lmsg[:]: must_deliver = True num_trans += 1 (size, unit) = general.compute(msg['size']) if not self.config.optsyslog: aprint('-'* 21, general.GREEN) if self.config.optexpresion: (retcode, header, fromwho) = self.look_message(msg,logAgent,indice_log,nmesg - num_trans,smtp) if retcode == 'delete': #Deleted if self.config.optsmtp: smtp.smtpobj.noop() continue # end if self.config.optexpresion aprint(_("Downloading message %d (%.2f %s), Left: %d (%s)") % (msg['orignumber'], size, unit, nmesg - num_trans, self.alias),general.VIOLET) (msgbody, fromm, tmpheader) = self.get_message(msg, smtp, header, nmesg) if fromm != '' and fromwho == '': fromwho = fromm if tmpheader != '': header = tmpheader if not self.config.optsyslog and not self.config.optquiet: sys.stderr.write(general.colorize(_("\rDownloaded: "),general.YELLOW)) sys.stderr.write(general.colorize("100%\n",general.WHITE)) # If self.config.optexpression we've already looked for the IMAP # DONTDELETETHISMESSAGE messages in the look_header method if not self.config.optexpresion: if msg['orignumber'] == 1: resultWUIMAP = re_wuimap.search(msgbody) resultWUIMAP2 = re_wuimap.search(header) if (resultWUIMAP is not None) or (resultWUIMAP2 is not None): aprint(_("Ignoring message %d: DONTDELETETHISMESSAGE type message") % (msg['orignumber']), general.RED) retcode = 'wuimap' if retcode == 'wuimap': must_deliver = False try: if retcode == 'postergate': #Message delayed animailBoxPath = self.config.homedir + '/.animail/animailDelayed' if not os.path.exists(animailBoxPath): os.mkdir(animailBoxPath, 0700) (foo,emailaddress) = rfc822.parseaddr(fromwho) tmpbox = open(animailBoxPath + '/' + emailaddress, 'a+') self.write_mbox(tmpbox, header, msgbody, fromm) else: if retcode != 'wuimap': must_deliver = True if (self.config.lpostfilters != []) and (retcode != 'wuimap'): #FIXME SESSION: En realidad sólo sería necesario pasarle al #postfiltro el msgstr; después este, en su método #filter_mail ya se encargaría de crear el archivo temporal, #y sólo de ser necesario (si el filtro tiene opciones y #si estas opciones contienen un %M). #el create_msgstr también podría ir en el postfiltro pero #depende de la subclase de mailserver (pop3 o imap4). Eso #habría que arreglarlo definitivamente para que en la clase #base no se depende del tipo, quizás añadiendo un método a #las clases derivadas header_and_body o algo así. msgstr = self.create_msgstr(header,msgbody) tmpfile = open(tempfile.mktemp(), 'w+') os.chmod(tmpfile.name, 0600) tmpfile.write(msgstr) # Number of filters that have matched this message: npositives = 0 # Have we copied this email to the spambox yet? alreadycopied = 0 for pfilter in self.config.lpostfilters: output = '' aprint(_("Executing postfilter %s on message...") % pfilter.filtername, general.YELLOW) (pretcode, output) = pfilter.filter_mail(msgstr,tmpfile.name) if pretcode == 1: # Matched! npositives += 1 if self.config.allpostfilters and ( npositives != len( self.config.lpostfilters) ): # allpostfilters needs all the postfilters to match a # message for having it filtered: continue must_deliver = False if not self.config.optnotlog: logAgent.append_filtered(indice_log,_("%s (Postfiltered by'%s')")%(fromm,pfilter.filtername),msg['size']) if pfilter.savepostfilteredmails != 0 and not alreadycopied: pfilter.log_filtered_mail(msgstr,fromm, output) alreadycopied = 1 if npositives >= self.config.minpostfilters: break tmpfile.close() os.unlink(tmpfile.name) if must_deliver: deliver(header, msgbody, fromm, smtp) if self.optdelete and retcode != 'wuimap': aprint(_("Deleting message"), general.YELLOW) self.delmesg(msg) except SMTPException, x: print print _("The local SMTP rejected this message so it won't be deleted from the mail server:"), str(x) smtp.quit() smtp.connect() if not self.config.optnotlog: logAgent.incident(indice_log, str(x)) except socket.error, x: print print _("Socket error sending to the local SMTP, it won't be deleted from the mail server:"), str(x) try: smtp.quit() smtp.connect() except AttributeError: pass if not self.config.optnotlog: logAgent.incident(indice_log, str(x)) continue
def get_messages(self, logAgent, indice_log, is_retry, smtp): nmesg = len(self.lmsg) general.cursor_off() header = '' fromwho = '' if self.delivery == 'mta': deliver = self.deliver_smtp elif self.delivery == 'mbox': deliver = self.deliver_mbox elif self.delivery == 'maildir': deliver = self.deliver_maildir elif self.delivery == 'pipe': deliver = self.deliver_pipe elif self.delivery == 'global': if self.config.optsmtp: deliver = self.deliver_smtp elif self.config.optmbox: deliver = self.deliver_mbox elif self.config.optmaildir: deliver = self.deliver_maildir elif self.config.optsendmail: deliver = self.deliver_pipe num_trans = 0 retcode = 'pass' for msg in self.lmsg[:]: must_deliver = 1 num_trans += 1 (size, unit) = general.compute(msg['size']) if not self.config.optsyslog: aprint('-'* 21, general.GREEN) if self.config.optexpresion: (retcode, header, fromwho) = self.look_message(msg,logAgent,indice_log,nmesg - num_trans,smtp) if retcode == 'delete': #Deleted if self.config.optsmtp: smtp.smtpobj.noop() continue # end if self.config.optexpresion aprint(_("Downloading message %d (%.2f %s), Left: %d") % (msg['number'], size, unit, nmesg - num_trans),general.VIOLET) (msgbody, fromm, tmpheader) = self.get_message(msg, smtp, header, nmesg) if fromm != '' and fromwho == '': fromwho = fromm if tmpheader != '': header = tmpheader if not self.config.optsyslog and not self.config.optquiet: sys.stderr.write(general.colorize(_("\rDownloaded: "),general.YELLOW)) sys.stderr.write(general.colorize("100%\n",general.WHITE)) # If self.config.optexpression we've already looked for the IMAP # DONTDELETETHISMESSAGE messages in the look_header method if not self.config.optexpresion: if msg['number'] == 1: resultWUIMAP = re_wuimap.search(msgbody) resultWUIMAP2 = re_wuimap.search(header) if (resultWUIMAP is not None) or (resultWUIMAP2 is not None): aprint(_("Ignoring message %d: DONTDELETETHISMESSAGE type message") % (msg['number']), general.RED) retcode = 'wuimap' if retcode == 'wuimap': must_deliver = 0 try: if retcode == 'postergate': #Message delayed animailBoxPath = self.config.homedir + '/.animail/animailDelayed' if not os.path.exists(animailBoxPath): os.mkdir(animailBoxPath, 0700) (foo,emailaddress) = rfc822.parseaddr(fromwho) tmpbox = open(animailBoxPath + '/' + emailaddress, 'a+') self.write_mbox(tmpbox, header, msgbody, fromm) else: if retcode != 'wuimap': must_deliver = 1 if (self.config.lpostfilters != []) and (retcode != 'wuimap'): msgstr = self.create_msgstr(header,msgbody) tmpfile = open(tempfile.mktemp(), 'w+') os.chmod(tmpfile.name, 600) tmpfile.write(msgstr) for pfilter in self.config.lpostfilters: output = '' aprint(_("Executing postfilter %s on message...") % pfilter.filtername, general.YELLOW) (pretcode, output) = pfilter.filter_mail(msgstr,tmpfile.name) if pretcode == 1: must_deliver = 0 if not self.config.optnotlog: logAgent.append_filtered(indice_log,_("%s (Postfiltered by'%s')")%(fromm,pfilter.filtername),msg['size']) if pfilter.savepostfilteredmails != 0: pfilter.log_filtered_mail(msgstr,fromm, output) tmpfile.close() os.unlink(tmpfile.name) if must_deliver: deliver(header, msgbody, fromm, smtp) if self.optdelete and retcode != 'wuimap': aprint(_("Deleting message"), general.YELLOW) self.delmesg(msg) except SMTPException, x: print print _("The local SMTP rejected this message so it won't be deleted from the mail server:"), str(x) smtp.quit() smtp.connect() if not self.config.optnotlog: logAgent.incident(indice_log, str(x)) except socket.error, x: print print _("Socket error sending to the local SMTP, it won't be deleted from the mail server:"), str(x) try: smtp.quit() smtp.connect() except AttributeError: pass if not self.config.optnotlog: logAgent.incident(indice_log, str(x)) continue