def generate_message(sender, schedule_id, group_id, mailbox_id): ''' Generate (or update) message for specifed group and mailbox ''' log = current_task.get_logger() current_time = now() try: schedule = Schedule.objects.get(id=schedule_id) group = Group.objects.get(id=group_id) mailbox = Mailbox.objects.get(id=mailbox_id) context = schedule.get_context(group, mailbox.user) msg = None try: msg = Message.objects.get(schedule=schedule, mailbox=mailbox) except Exception, e: msg = Message(schedule=schedule, mailbox=mailbox) msg.text = Template(schedule.text).render(Context(context)) msg.save() if current_time >= schedule.dt_start: #:TODO : 1 minutes #: sendmail right now send_message(message_obj=msg) else: #: sendmail later send_message.apply_async([msg.id], eta=msg.dt_start)
def send_message(message_id=None, message_obj=None): ''' send actual message .. todo:: - Message status is required ''' log = current_task.get_logger() try: msg = message_obj if message_obj != None else Messsage.objects.get( id=message_id) #:TODO: check message status. If already "SENDING" or "CANCELD", don't send # check schedue status. If already "CANCELD", don't send send_mail( msg.schedule.subject, #:TODO: Message should have rendered subject msg.text, "info@" + msg.schedule.owner. domain, #:TODO: Owner "symbol" to be defined and compose from address [msg.mailbox.address], return_path=msg.get_return_path(), message_id=msg.mail_message_id, ) #:TODO: change the status except Message.DoesNotExist, e: log.error("send_message():No Message record for id=%s" % message_id)
def generate_message(sender,schedule_id,group_id, mailbox_id ): ''' Generate (or update) message for specifed group and mailbox ''' log = current_task.get_logger() current_time = now() try: schedule = Schedule.objects.get(id=schedule_id ) group = Group.objects.get(id=group_id) mailbox= Mailbox.objects.get(id=mailbox_id) context = schedule.get_context(group,mailbox.user) msg=None try: msg = Message.objects.get(schedule=schedule,mailbox=mailbox ) except Exception,e: msg = Message(schedule=schedule,mailbox=mailbox ) msg.text = Template(schedule.text).render(Context(context)) msg.save() if current_time >= schedule.dt_start: #:TODO : 1 minutes #: sendmail right now send_message(message_obj=msg) else : #: sendmail later send_message.apply_async([msg.id],eta=msg.dt_start )
def smtp_status(sender, msg, **extended): log = current_task.get_logger() log.debug( 'tasks.smtp_status:{0}:{1}:{2}'.format( sender, msg, str(extended))) # model_class = get_model( # *(extended.get('model_class','')+'.').split('.')[:2]) model_class = get_model(extended.get('model_class', '')) model_class and getattr( model_class, 'update_status', lambda *x, **y: None)(msg, **extended)
def generate_messages_for_schedule(sender, schedule_id): ''' Generate messages for speicifed Schedule ''' log = current_task.get_logger() try: schedule = Schedule.objects.get(id=schedule_id) for g in schedule.groups.all(): for m in g.mailbox_set.exclude(user=None): #: TODO: Exclude user == None or is_active ==False or forward == None generate_message.delay(sender, schedule.id, g.id, m.id) except Exception, e: log.error("generate_messages_for_schedule():" + str(e))
def generate_messages_for_schedule(sender,schedule_id): ''' Generate messages for speicifed Schedule ''' log = current_task.get_logger() try: schedule = Schedule.objects.get(id = schedule_id ) for g in schedule.groups.all(): for m in g.mailbox_set.exclude(user=None): #: TODO: Exclude user == None or is_active ==False or forward == None generate_message.delay(sender,schedule.id,g.id,m.id ) except Exception,e: log.error( "generate_messages_for_schedule():" + str(e) )
def enqueue_schedule(sender,id=None): ''' enqueue specifid mail schedule , or all schedules ''' log = current_task.get_logger() args={'id':id} if id else {} log.debug("specified Schedule id = %s" % str(args)) for s in Schedule.objects.filter(**args): if s.status== "scheduled": generate_messages_for_schedule.delay(sender,s.id ) #: Asynchronized Call s.status = "active" s.save()
def enqueue_schedule(sender, id=None): ''' enqueue specifid mail schedule , or all schedules ''' log = current_task.get_logger() args = {'id': id} if id else {} log.debug("specified Schedule id = %s" % str(args)) for s in Schedule.objects.filter(**args): if s.status == "scheduled": generate_messages_for_schedule.delay(sender, s.id) #: Asynchronized Call s.status = "active" s.save()
def send_email(message, **kwargs): ''' message : django EmailMessage ''' logger = current_task.get_logger() try: conn = get_connection(backend=BACKEND) result = conn.send_messages([message]) logger.debug("tasks.send_email:Successfully sent email message to %r.", message.to) return result except Exception, e: # catching all exceptions b/c it could be any number of things # depending on the backend # send_email.retry(exc=e) logger.debug(str(e) + traceback.format_exc().replace('\n', '/')) logger.warning( "tasks.send_email:Failed to send email message to %r, retrying.", message.to)
def send_message(message_id=None,message_obj=None): ''' send actual message .. todo:: - Message status is required ''' log = current_task.get_logger() try: msg = message_obj if message_obj != None else Messsage.objects.get(id=message_id) #:TODO: check message status. If already "SENDING" or "CANCELD", don't send # check schedue status. If already "CANCELD", don't send send_mail(msg.schedule.subject, #:TODO: Message should have rendered subject msg.text, "info@"+msg.schedule.owner.domain, #:TODO: Owner "symbol" to be defined and compose from address [msg.mailbox.address], return_path = msg.get_return_path(), message_id = msg.mail_message_id, ) #:TODO: change the status except Message.DoesNotExist ,e: log.error("send_message():No Message record for id=%s" % message_id)
def send_email_in_string(return_path, recipients, message_string, **extended): ''' message_stiring : string expression of Python email.message.Message object ''' logger = current_task.get_logger() try: conn = get_connection(backend=BACKEND) conn.open() result = conn.send_message_string( return_path, recipients, message_string, **extended) logger.debug( "send_email_in_string:Successfully sent email message to %r.", recipients) return result except: # catching all exceptions b/c it could be any number of things # depending on the backend logger.debug(traceback.format_exc()) logger.warning( "{0}:Failed to send email message to {1}, retrying.".format( 'send_email_instring', recipients))
def enqueue_publish(sender, publish_id=None, publish=None, member_filter={}, member_exclude={}): ''' enqueue specifid mail publish, or all publish - id : Publish identfier ''' log = current_task.get_logger() q = [publish] if publish is None: args = {'status': "scheduled", } if publish_id: args['id'] = publish_id log.debug("specified Publish is = %s" % str(args)) q = Publish.objects.filter(**args) for publish in q: t = enqueue_mails_for_publish.delay( sender, publish.id, member_filter, member_exclude) # Asynchronized Call publish.status = "active" publish.activated_at = now() publish.task_id = t.task_id publish.save()
@task def enqueue_mails_for_publish( sender, publish_id, member_filter={}, member_exclude={}, signature="pub", async=True ): ''' Enqueu mails for speicifed Publish :param member_query: dict for query .. todo:: - Custum QuerSet fiilter to targetting user. - If called asynchronosly, enqueue_mail should be called synchronosly. ''' log = current_task.get_logger() # Never use: member_exclude.update({'user': None, }) member_filter.update({'is_active': True}) # only for Active Address default_ban = Q(address__endswith='@localhost') | Q(user__isnull=True) try: publish = Publish.objects.get(id=publish_id) for circle in publish.circles.all(): for member in circle.member_set.filter( **member_filter).exclude(default_ban): time.sleep(20.0 / 1000.0) pub = Publication.objects.publish( publish, circle, member, signature) assert pub.message is not None t = enqueue_mail.apply_async(