def draft_update_api(public_id): data = request.get_json(force=True) original_draft = get_draft(public_id, data.get('version'), g.namespace.id, g.db_session) # TODO(emfree): what if you try to update a draft on a *thread* that's been # deleted? data = request.get_json(force=True) to = get_recipients(data.get('to'), 'to') cc = get_recipients(data.get('cc'), 'cc') bcc = get_recipients(data.get('bcc'), 'bcc') from_addr = get_recipients(data.get('from_addr'), 'from_addr') reply_to = get_recipients(data.get('reply_to'), 'reply_to') if from_addr and len(from_addr) > 1: raise InputError("from_addr field can have at most one item") if reply_to and len(reply_to) > 1: raise InputError("reply_to field can have at most one item") subject = data.get('subject') body = data.get('body') files = get_attachments(data.get('file_ids'), g.namespace.id, g.db_session) draft = update_draft(g.db_session, g.namespace.account, original_draft, to, subject, body, files, cc, bcc, from_addr, reply_to) return g.encoder.jsonify(draft)
def draft_update_api(public_id): data = request.get_json(force=True) original_draft = get_draft(public_id, data.get('version'), g.namespace.id, g.db_session) # TODO(emfree): what if you try to update a draft on a *thread* that's been # deleted? data = request.get_json(force=True) to = get_recipients(data.get('to'), 'to') cc = get_recipients(data.get('cc'), 'cc') bcc = get_recipients(data.get('bcc'), 'bcc') from_addr = get_recipients(data.get('from_addr'), 'from_addr') reply_to = get_recipients(data.get('reply_to'), 'reply_to') if from_addr and len(from_addr) > 1: raise InputError("from_addr field can have at most one item") if reply_to and len(reply_to) > 1: raise InputError("reply_to field can have at most one item") subject = data.get('subject') body = data.get('body') tags = get_tags(data.get('tags'), g.namespace.id, g.db_session) files = get_attachments(data.get('file_ids'), g.namespace.id, g.db_session) draft = update_draft(g.db_session, g.namespace.account, original_draft, to, subject, body, files, cc, bcc, from_addr, reply_to, tags) return g.encoder.jsonify(draft)
def draft_send_api(): data = request.get_json(force=True) draft_public_id = data.get('draft_id') if draft_public_id is not None: draft = get_draft(draft_public_id, data.get('version'), g.namespace.id, g.db_session) if not any((draft.to_addr, draft.cc_addr, draft.bcc_addr)): raise InputError('No recipients specified') validate_draft_recipients(draft) resp = send_draft(g.namespace.account, draft, g.db_session, schedule_remote_delete=True) else: to = get_recipients(data.get('to'), 'to', validate_emails=True) cc = get_recipients(data.get('cc'), 'cc', validate_emails=True) bcc = get_recipients(data.get('bcc'), 'bcc', validate_emails=True) if not any((to, cc, bcc)): raise InputError('No recipients specified') subject = data.get('subject') body = data.get('body') tags = get_tags(data.get('tags'), g.namespace.id, g.db_session) files = get_attachments(data.get('file_ids'), g.namespace.id, g.db_session) replyto_thread = get_thread(data.get('thread_id'), g.namespace.id, g.db_session) draft = sendmail.create_draft(g.db_session, g.namespace.account, to, subject, body, files, cc, bcc, tags, replyto_thread, syncback=False) resp = send_draft(g.namespace.account, draft, g.db_session, schedule_remote_delete=False) return resp
def draft_send_api(): if request.content_type == "message/rfc822": msg = create_draft_from_mime(g.namespace.account, request.data, g.db_session) validate_draft_recipients(msg) resp = send_raw_mime(g.namespace.account, g.db_session, msg) return resp data = request.get_json(force=True) draft_public_id = data.get('draft_id') if draft_public_id is not None: draft = get_draft(draft_public_id, data.get('version'), g.namespace.id, g.db_session) schedule_action('delete_draft', draft, draft.namespace.id, g.db_session, inbox_uid=draft.inbox_uid, message_id_header=draft.message_id_header) else: draft = create_draft(data, g.namespace, g.db_session, syncback=False) validate_draft_recipients(draft) resp = send_draft(g.namespace.account, draft, g.db_session) return resp
def draft_update_api(public_id): data = request.get_json(force=True) original_draft = get_draft(public_id, data.get('version'), g.namespace.id, g.db_session) # TODO(emfree): what if you try to update a draft on a *thread* that's been # deleted? data = request.get_json(force=True) to = get_recipients(data.get('to'), 'to') cc = get_recipients(data.get('cc'), 'cc') bcc = get_recipients(data.get('bcc'), 'bcc') subject = data.get('subject') body = data.get('body') tags = get_tags(data.get('tags'), g.namespace.id, g.db_session) files = get_attachments(data.get('file_ids'), g.namespace.id, g.db_session) try: draft = sendmail.update_draft(g.db_session, g.namespace.account, original_draft, to, subject, body, files, cc, bcc, tags) except ActionError as e: return err(e.error, str(e)) return g.encoder.jsonify(draft)
def draft_send_api(): data = request.get_json(force=True) draft_public_id = data.get('draft_id') if draft_public_id is not None: draft = get_draft(draft_public_id, data.get('version'), g.namespace.id, g.db_session) validate_draft_recipients(draft) resp = send_draft(g.namespace.account, draft, g.db_session, schedule_remote_delete=True) else: draft = create_draft(data, g.namespace, g.db_session, syncback=False) validate_draft_recipients(draft) resp = send_draft(g.namespace.account, draft, g.db_session, schedule_remote_delete=False) if resp.status_code == 200: # At this point, the message has been successfully sent. If there's # any sort of error in committing the updated state, don't allow it # to cause the request to fail. Otherwise a client may think their # message hasn't been sent, when it fact it has. try: g.db_session.add(draft) g.db_session.commit() except Exception as exc: g.log.critical('Error committing draft after successful send', exc_info=True, error=exc) return resp
def draft_delete_api(public_id): data = request.get_json(force=True) # Validate draft id, version, etc. draft = get_draft(public_id, data.get('version'), g.namespace.id, g.db_session) result = delete_draft(g.db_session, g.namespace.account, draft) return g.encoder.jsonify(result)
def draft_delete_api(public_id): data = request.get_json(force=True) # Validate draft id, version, etc. draft = get_draft(public_id, data.get('version'), g.namespace.id, g.db_session) try: result = delete_draft(g.db_session, g.namespace.account, draft) except ActionError as e: return err(e.error, str(e)) return g.encoder.jsonify(result)