def send_email(email_log_id): email = EmailLog[email_log_id] rv = mailext.send_email(email.to, email.subject, email.body) email_id = rv['id'] EmailLog.set_by_id( email_log_id, { 'email_id': email_id, 'status': EmailLog.SEND_MAILGUN, 'updated_at': datetime.datetime.now() })
def schedule_emails(): now = datetime.datetime.now() limit_time = now + datetime.timedelta(minutes=10) email_objs = EmailLog.select().where(EmailLog.status == EmailLog.SCHEDULED, EmailLog.send_at <= limit_time) for i in email_objs: EmailLog.set_by_id(i.id, { 'status': EmailLog.IN_QUEUE, 'updated_at': datetime.datetime.now() }) send_email.apply_async(args=(i.id, ), eta=i.send_at)
def post(self): data = request.get_json() event_data = data['event-data'] if event_data['event'] != 'opened' or not mailext.verify( **data['signature']): return Response(status=406) email_id = event_data['id'] email = EmailLog.select().where(EmailLog.email_id == email_id).first() if email is None or email.status != EmailLog.SEND_SUCCESSFULLY: return Response(status=406) EmailLog.set_by_id(email.id, { 'status': EmailLog.OPENED, 'updated_at': datetime.datetime.now() }) return Response(status=200)
def test_email_track_open_successfully(client, mocker, faker, email_logs_called_mailgun): from app.api.views import mailext verify_mock = mocker.patch.object(mailext, 'verify', return_val=True) email = EmailLog.select().first() EmailLog.set_by_id(email.id, { 'status': EmailLog.SEND_SUCCESSFULLY, }) resp = client.post('/email/open-track', json={ 'event-data': { 'event': 'opened', 'id': email.email_id, }, 'signature': {} }) assert resp.status_code == 200 assert EmailLog[email.id].status == EmailLog.OPENED assert verify_mock.called
def post(self): data = request.get_json() event_data = data['event-data'] if event_data['event'] not in ( 'delivered', 'failed', ) or not mailext.verify(**data['signature']): return Response(status=406) email_id = event_data['id'] email = EmailLog.select().where(EmailLog.email_id == email_id).first() if email is None or email.status != EmailLog.SEND_MAILGUN: return Response(status=406) if event_data['event'] == 'failed': EmailLog.set_by_id(email.id, {'status': EmailLog.SEND_FAILED}) else: EmailLog.set_by_id( email.id, { 'status': EmailLog.SEND_SUCCESSFULLY, 'updated_at': datetime.datetime.now() }) return Response(status=200)