def send_emails(msgs, method, server, auth, auth_user, auth_pass, procmail, reverse): # disable the defaulttimeout to avoid a bug with starttls() # the defaulttimeout will be restored at the end of the method backup_timeout = socket.getdefaulttimeout () socket.setdefaulttimeout (None) try: original_msgs = msgs[:] splited_msgs = [] # split the message list in groups of 10 messages aux = [] for each in original_msgs: if len(aux) == 10: splited_msgs.append(aux) aux = [] aux.append(each) if aux: splited_msgs.append(aux) for msgs in splited_msgs: if reverse: msgs.reverse() if method.lower() in ('smtp', 'both'): smtp = smtplib.SMTP(server) smtp.set_debuglevel(DEBUG) respuesta = smtp.ehlo() mylog.debug(repr(respuesta)) # initiate TLS if necesary if len(respuesta) == 2: if 'starttls' in respuesta[1].lower(): mylog.debug('Initiating TLS conection') smtp.starttls() smtp.ehlo() mylog.debug(repr(respuesta)) # authenticate with SMTP server when there's need to if auth: smtp.login(auth_user,auth_pass); count = 0; for msg in msgs: if msg == None: continue fromaddr = msg['From'] r = re.compile('<(.+?)>') toaddr = r.findall(msg['To']) try: # build envelope and send message smtp.sendmail(fromaddr, toaddr, msg.as_string(unixfrom=False)) count = count + 1 mylog.debug('mail sent to %s from %s ' % (toaddr, fromaddr)) except: mylog.exception("Error sending mail") mylog.error(str(msg)) raise try: smtp.quit() except socket.sslerror: pass # connecting to smtp.gmail.com gives this false error if count != len(msgs): note = " (" + str(len(msgs)-count) +" failed)" else: note="" mylog.info ('%d emails sent successfully%s via SMTP' % (count,note,)) if method.lower() in ('procmail', 'both'): count = 0 for msg in msgs: try: fp = os.popen(procmail, 'w') fp.write(msg.as_string(unixfrom=True)) status = fp.close() except: mylog.exception ('IOError executing '+procmail) status = 1 raise if status is None: count += 1 if count != len(msgs): note = " (" + str(len(msgs)-count) +" failed)" else: note="" mylog.info ('%d emails sent successfully%s via PROCMAIL' % (count,note,)) finally: socket.setdefaulttimeout (backup_timeout)
def run(self): config = self.config _email_destino = self.email_destino movil_destino = self.movil_destino semaforo = self.semaforo while True: gc.collect() feed = self.feeds_queue.get() if feed is None: break url = feed['xmlUrl'] try: time = feed.get('check_time', None) if time: parsed_time = parseTimeRange(time) if parsed_time: if not checkTime (parsed_time): mylog.debug ('Ignoring the feed '+url) continue else: mylog.error ('Error parsing the time range "%s" in the feed %s' % (time, url)) items = [] semaforo.acquire() if not feed_history.has_key(url): feed_history[url] = {} feed_history[url]['ultimo_check'] = None feed_history[url]['proximo_check'] = None feed_history[url]['ultima_actualizacion'] = None feed_history[url]['delay'] = None feed_history['modified'] = True semaforo.release() ultimo_check = feed_history[url]['ultimo_check'] proximo_check = feed_history[url]['proximo_check'] ultima_actualizacion = feed_history[url].get('ultima_actualizacion', None) delay = feed_history[url].get('delay', None) ahora = datetime.now() if proximo_check and ahora < proximo_check: continue title = feed.get('title', feed.get('text', url)) mylog.debug ('Processing '+title) email = feed.get('ownerEmail', None) if email: #mylog.debug ('email[0]=' + _email_destino[0] + ', email[1]=' + _email_destino[1]) #mylog.debug ('Overriding email: ' +email) email_destino = _email_destino[0], email else: email_destino = _email_destino auth = feed.get('auth', None) if auth: if ':' in auth: username, password = auth.split(':') else: mylog.error ('The "auth" parameter for the feed '+title+' is invalid') continue else: username, password = None, None xml = None try: xml = cache.feed_parse(url, config['can_pipe'] == '1', username, password) except cache.SocketTimeoutError: mylog.info ('Timeout error downloading %s' % url) mylog.debug ('Will retry in the the next pass') continue except cache.HTTPError, e: mylog.info ('HTTP Error %d downloading %s' % (e.code, url,)) except cache.URLError, e: mylog.info ('URLError (%s) downloading %s' % (e.reason, url,)) except cache.OfflineError: mylog.info ('Resource unavailable when offline (%s)' % url)
else: continue item.is_modified = 'True' else: item.is_modified = 'False' items.append(item) if items: mylog.info ('%d new items in %s' % (items.__len__(),title)) else: mylog.debug ('No change in %s' % (title,)) items_sin_agrupar = items[:] if (len(items) >= 1) and (feed['digest'] == '1'): lista_vieja = items[:] items = [group_items(lista_vieja, feed['titles'] == '1', config['encoding'], config['reverse'] == '1')] email_ok = True envio = config.get( 'sender', email_destino[1] ) if(config['multipart'] == 'off'): format = "html"