diff options
Diffstat (limited to 'python/download_emails.py')
| -rw-r--r-- | python/download_emails.py | 124 |
1 files changed, 1 insertions, 123 deletions
diff --git a/python/download_emails.py b/python/download_emails.py index 1ab7c0a5..2a124d2e 100644 --- a/python/download_emails.py +++ b/python/download_emails.py @@ -8,131 +8,9 @@ import sys from apiclient import errors from pathlib import Path from pytz import timezone -from send_email import get_gmail_service -from email.message import EmailMessage +from gmail_helpers import GmailMessage from email.utils import parsedate_to_datetime - -def ListMessagesWithLabels(service, user_id, label_ids=[]): - """List all Messages of the user's mailbox with label_ids applied. - - Args: - service: Authorized Gmail API service instance. - user_id: User's email address. The special value "me" - can be used to indicate the authenticated user. - label_ids: Only return Messages with these labelIds applied. - - Returns: - List of Messages that have all required Labels applied. Note that the - returned list contains Message IDs, you must use get with the - appropriate id to get the details of a Message. - """ - try: - response = service.users().messages().list(userId=user_id, - labelIds=label_ids).execute() - if 'messages' in response: - yield from response['messages'] - while 'nextPageToken' in response: - page_token = response['nextPageToken'] - response = service.users().messages().list(userId=user_id, - labelIds=label_ids, - pageToken=page_token).execute() - yield from response['messages'] - - except errors.HttpError as error: - print(json.loads(error.content.decode('utf-8'))['error']['message']) - - -def ListHistory(service, user_id, label_id=None, start_history_id=10000): - """List History of all changes to the user's mailbox. - - Args: - service: Authorized Gmail API service instance. - user_id: User's email address. The special value "me" - can be used to indicate the authenticated user. - start_history_id: Only return Histories at or after start_history_id. - - Returns: - A list of mailbox changes that occurred after the start_history_id. - """ - history = (service.users().history().list(userId=user_id, - startHistoryId=start_history_id, - historyTypes="messageAdded", - labelId=label_id) - .execute()) - changes = history['history'] if 'history' in history else [] - for change in changes: - if 'messagesAdded' in change: - for c in change['messagesAdded']: - yield c['message'] - - while 'nextPageToken' in history: - page_token = history['nextPageToken'] - history = (service.users().history().list(userId=user_id, - startHistoryId=start_history_id, - pageToken=page_token).execute()) - for change in history['history']: - if 'messagesAdded' in change: - for c in change['messagesAdded']: - yield c['message'] - -def labels_dict(service, user_id): - """Returns a dictionary mapping labels to labelids. - - Args: - service: Authorized Gmail API service instance. - user_id: User's email address. The special value "me" - - Returns: - dictionary mapping labels to labelids. - """ - try: - response = service.users().labels().list(userId=user_id).execute() - labels = response['labels'] - return {label['name']: label['id'] for label in labels} - except errors.HttpError as error: - print(json.loads(error.content.decode('utf-8'))['error']['message']) - -class GmailMessage(EmailMessage): - _labels = labels_dict(EmailMessage._service, 'me') - - def msgdict(self): - return {'raw': base64.urlsafe_b64encode(self.as_bytes()).decode()} - - def send(self): - try: - message = (self._service.users().messages(). - send(userId='me',body=self.msgdict()) - .execute()) - print('Message Id: %s' % message['id']) - except errors.HttpError as error: - print('An error occurred: %s' % error) - - @staticmethod - def list_msg_ids(label, start_history_id=None): - if start_history_id is not None: - return ListHistory(EmailMessage._service, - 'me', - label_id=GmailMessage._labels[label], - start_history_id=start_history_id) - else: - return ListMessagesWithLabels(EmailMessage._service, - 'me', - label_ids=[GmailMessage._labels[label]]) - - @classmethod - def from_id(cls, msg_id, user_id='me'): - try: - message = (cls._service.users().messages(). - get(userId=user_id, id=msg_id, format='raw').execute()) - instance = email.message_from_bytes( - base64.urlsafe_b64decode(message['raw']), - policy=email.policy.EmailPolicy()) - instance.history_id = message['historyId'] - return instance - except errors.HttpError as error: - print(json.loads(error.content.decode('utf-8'))['error']['message']) - def save_emails(update=True): """Download new emails that were labeled swaptions.""" DATA_DIR = Path(os.getenv("DATA_DIR")) |
