Skip to content

Repository files navigation

Gmail Wrapper

CircleCI

Because scrapping Gmail data doesn't have to be a pain.

Installing

pip install gmail-wrapper

Developing

Create your venv

virtualenv .venv
source .venv/bin/activate

Then you can install the dependencies

pip install -e .

Testing

Simply run

make test

Basic Usage

  • Setup the client
fromgmail_wrapperimportGmailClientemail_account="john.doe@gmail.com"credentials_string="{...}"# You must generate this on your Google accountscopes= [GmailClient.SCOPE_READONLY]
client=GmailClient(email_account, secrets_json_string=credentials_string, scopes=scopes)
  • Fetch messages
importsysquery="filename:pdf label:friends"# Check Gmail query docs: https://support.google.com/mail/answer/7190messages=client.get_messages(query=query, limit=10)
formessageinmessages:
print("-- MESSAGE {} --".format(message.id))
print("SUBJECT: {}".format(message.subject))
print("DATE: {}".format(message.date))
forattachmentinmessage.attachments:
print("\t-- ATTACHMENT {} --".format(attachment.id))
print("\t\tFILENAME: {}".format(attachment.filename))
print("\t\tDECODED SIZE: {}".format(sys.getsizeof(attachment.content)))
  • Modify message labels

If a single message:

message_id="..."message=client.get_message(message_id)
print(message.labels) # ["foo", "bar"]message.modify(add_labels=["processed"], remove_labels=["foo"]) # Beware that you'll need proper scopesprint(message.labels) # ["bar", "processed"]

If multiple messages:

message_ids= ["...", "..."]
message=client.modify_multiple_messages(message_ids, ["processed"], remove_labels=["foo"])
  • Archive a message
message.archive() # Beware that you'll need proper scopes
  • Send message
content='''<html> <h1>Hey there</h1> <p>I am using gmail-wrapper lib!</p></html>'''message=client.send(
subject="You will like it",
html_content=content,
to="thanos@loadsmart.com",
cc=["iron.man@loadsmart.com", "spider.man@loadsmart.com"],
bcc=["wolverine@loadsmart.com"]
) # Beware that you'll need proper scopesprint(message) # Gmail message: ABC123
  • Reply message
message_id="..."message=client.get_message(message_id)
reply='''I am out for vacation, will return <strong>Jan 14</strong>.If it is really important, you can call me, but think twice.'''response=message.reply(reply)
  • Handle exceptions

Exceptions are part of every developer day-to-day. You may want to handle exceptions as follows:

fromgmail_wrapper.exceptionsimport (
MessageNotFoundError,
AttachmentNotFoundError,
GmailError,
)
try:
do_something()
exceptMessageNotFoundErrorase:
print(f"There is no message! {e}")
exceptAttachmentNotFoundErrorase:
print(f"There is no attachment! {e}")
exceptGmailErrorase:
print(f"Google servers are burning! {e}")

Disclaimer

Gmail is a trademark of Google. This open-source project is not an official library nor has any endorsement of Google.

About

📧 Because scrapping Gmail data doesn't have to be a pain

Resources

Security policy

Stars

33 stars

Watchers

49 watching

Forks

Releases

Packages

Used by

Contributors

Languages