Пример #1
0
    def __call__(self, resource_id: str):
        emails = client_datastore.unpack_emails(resource_id)

        domain = ''
        num_stored = 0
        for email in emails:
            email_id = email['_uid']
            server_datastore.store_email(email_id, email)

            QUEUE.enqueue({
                '_version': '0.1',
                '_type': 'email_to_send',
                'resource_id': email_id,
                'container_name': server_datastore.STORAGE.container,
            })
            num_stored += 1
            domain = get_domain(email.get('from', ''))

        client_datastore.delete(resource_id)

        self.log_event(events.EMAIL_STORED_FROM_CLIENT, {
            'domain': domain,
            'num_emails': num_stored
        })  # noqa: E501
        return 'OK', 200
Пример #2
0
    def __call__(self, resource_id: str) -> Response:
        email = self._email_storage.fetch_object(resource_id)

        success = self._send_email(email)
        if not success:
            return 'error', 500

        self.log_event(events.EMAIL_DELIVERED_FROM_CLIENT, {'domain': get_domain(email.get('from', ''))})  # noqa: E501
        return 'OK', 200
Пример #3
0
    def _action(self, resource_id):  # type: ignore
        email = self._email_storage.fetch_object(resource_id)

        success = self._send_email(email)
        if not success:
            return 'error', 500

        self.log_event(events.EMAIL_DELIVERED_FROM_CLIENT, {'domain': get_domain(email.get('from', ''))})  # noqa: E501  # yapf: disable
        return 'OK', 200
    def __call__(self, resource_id: str):
        email = server_datastore.fetch_email(resource_id)

        email_sender.send(email)

        self.log_event(
            events.EMAIL_DELIVERED_FROM_CLIENT,
            {'domain': get_domain(email.get('from', ''))})  # noqa: E501
        return 'OK', 200
Пример #5
0
    def __call__(self, resource_id: str) -> Response:
        mime_email = self._raw_email_storage.fetch_text(resource_id)

        email = self._email_parser(mime_email)
        self._store_inbound_email(resource_id, email)

        self._raw_email_storage.delete(resource_id)

        self.log_event(events.EMAIL_STORED_FOR_CLIENT, {'domain': get_domain(email.get('from') or '')})  # noqa: E501
        return 'OK', 200
Пример #6
0
    def _action(self, resource_id):  # type: ignore
        email = self._email_storage.fetch_object(resource_id)

        for email_address in self._get_pivot(email):
            domain = get_domain(email_address)
            desc_prefix = descending_timestamp(email['sent_at'])
            if domain.endswith(mailbox.MAILBOX_DOMAIN):
                index = f"{domain}/{email_address}/{self._folder}/{desc_prefix}/{resource_id}"
                self._mailbox_storage.store_text(index, 'indexed')

        self.log_event(events.MAILBOX_EMAIL_INDEXED, {'folder': self._folder})  # noqa: E501  # yapf: disable
        return 'OK', 200
Пример #7
0
    def _store_users(self, resource_id):
        users = self._client_storage.fetch_objects(resource_id, (sync.USERS_FILE, from_jsonl_bytes))

        domain = ''
        num_stored = 0
        for user in users:
            email = user['email']
            domain = get_domain(email)
            self._user_storage.store_object(f'{domain}/{email}', user)

            num_stored += 1

        self.log_event(events.USER_STORED_FROM_CLIENT, {'domain': domain, 'num_users': num_stored})  # noqa: E501  # yapf: disable
    def __call__(self, resource_id: str):
        mime_email = email_receive.STORAGE.fetch_text(resource_id)

        email = parse_mime_email(mime_email)
        email = format_attachments(email)
        email = format_inline_images(email)
        server_datastore.store_email(resource_id, email)

        email_receive.STORAGE.delete(resource_id)

        self.log_event(
            events.EMAIL_STORED_FOR_CLIENT,
            {'domain': get_domain(email.get('from', ''))})  # noqa: E501
        return 'OK', 200
Пример #9
0
    def _action(self, resource_id):  # type: ignore
        try:
            mime_email = self._raw_email_storage.fetch_text(resource_id)
        except ObjectDoesNotExistError:
            self.log_warning('Inbound email %s does not exist', resource_id)
            return 'skipped', 202

        email = self._email_parser(mime_email)
        self._store_inbound_email(email)

        self._raw_email_storage.delete(resource_id)

        self.log_event(events.EMAIL_STORED_FOR_CLIENT, {'domain': get_domain(email.get('from') or '')})  # noqa: E501  # yapf: disable
        return 'OK', 200
Пример #10
0
 def _iter_mailbox(self, email_address: str, page: int,
                   folder: str) -> Iterable[dict]:
     domain = get_domain(email_address)
     emails = self._mailbox_storage.iter(
         f'{domain}/{email_address}/{folder}')
     for i, resource_ids in enumerate(chunks(emails,
                                             AppConfig.EMAILS_PER_PAGE),
                                      start=1):
         if i != page:
             continue
         for resource_id in resource_ids:
             email_id = resource_id.split('/')[-1]
             email = self.get(email_id)
             if email:
                 yield email
Пример #11
0
    def _create(self, emails_or_attachments: Iterable[dict]):
        for email in emails_or_attachments:
            if email.get('_type') == 'attachment':
                raise NotImplementedError

            domain = get_domain(email.get('from', ''))
            if not domain.endswith(mailbox.MAILBOX_DOMAIN):
                continue

            ensure_has_sent_at(email)
            email.pop('csrf_token', None)
            email_id = email['_uid']
            self._email_storage.store_object(email_id, email)
            self._pending_storage.store_text(f'{domain}/{email_id}', 'pending')
            self._send_email(email_id)
Пример #12
0
    def _store_emails(self, resource_id):
        emails = self._client_storage.fetch_objects(resource_id, (sync.EMAILS_FILE, from_jsonl_bytes))

        domain = ''
        num_stored = 0
        for email in emails:
            email_id = email['_uid']
            email = self._decode_attachments(email)
            self._email_storage.store_object(email_id, email)

            self._next_task(email_id)

            num_stored += 1
            domain = get_domain(email.get('from', ''))

        self.log_event(events.EMAIL_STORED_FROM_CLIENT, {'domain': domain, 'num_emails': num_stored})  # noqa: E501  # yapf: disable
Пример #13
0
    def _delete(self, email_address: str, uids: Iterable[str]):
        domain = get_domain(email_address)

        for uid in uids:
            email = self.get(uid)
            if not email:
                continue

            if email_address == email.get('from'):
                folder = mailbox.SENT_FOLDER
            elif email_address in get_recipients(email):
                folder = mailbox.RECEIVED_FOLDER
            else:
                continue

            desc_prefix = descending_timestamp(email['sent_at'])

            self._mailbox_storage.delete(
                f"{domain}/{email_address}/{folder}/{desc_prefix}/{uid}")
Пример #14
0
    def __call__(self, resource_id: str) -> Response:
        emails = self._client_storage.fetch_objects(
            resource_id, sync.EMAILS_FILE)

        domain = ''
        num_stored = 0
        for email in emails:
            email_id = email['_uid']
            self._email_storage.store_object(email_id, email)

            self._next_task(email_id)

            num_stored += 1
            domain = get_domain(email.get('from', ''))

        self._client_storage.delete(resource_id)

        self.log_event(events.EMAIL_STORED_FROM_CLIENT, {'domain': domain, 'num_emails': num_stored})  # noqa: E501
        return 'OK', 200
Пример #15
0
 def _get_pivot(self, email: dict) -> Iterable[str]:
     for email_address in get_recipients(email):
         domain = get_domain(email_address)
         if domain.endswith(mailbox.MAILBOX_DOMAIN):
             yield email_address