Skip to content

Instantly share code, notes, and snippets.

@akiyoshi83
Last active February 19, 2020 20:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akiyoshi83/08a2975ca9f44957a42e892a3dd29d4d to your computer and use it in GitHub Desktop.
Save akiyoshi83/08a2975ca9f44957a42e892a3dd29d4d to your computer and use it in GitHub Desktop.
Export senders from Gmail by label
"""
Find and export senders from gmail by label to senders.csv
USAGE: python export_sender_by_label.py LABEL_NAME
"""
from __future__ import print_function
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import sys
import csv
# Setup the Gmail API
SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
service = build('gmail', 'v1', http=creds.authorize(Http()))
# Call the Gmail API
def list_labels():
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
if not labels:
print('No labels found.')
else:
print('Labels:')
for label in labels:
print(label['name'], "\t", label['id'])
def get_label_by_name(name):
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
if not labels:
print('No labels found.')
return None
else:
for label in labels:
if label['name'] == name:
return label['id']
return None
def list_messages_by_label(label_ids):
try:
response = service.users().messages().list(userId='me', labelIds=label_ids).execute()
#response = service.users().messages().list(userId='me', labelIds=label_ids, maxResults=10).execute()
messages = []
if 'messages' in response:
messages.extend(response['messages'])
while 'nextPageToken' in response:
page_token = response['nextPageToken']
response = service.users().messages().list(userId='me',
labelIds=label_ids,
pageToken=page_token).execute()
messages.extend(response['messages'])
return messages
except (errors.HttpError, error):
print('An error occurred: %s' % error)
def list_sender(messages):
senders = []
for m in messages:
mb = service.users().messages().get(userId='me', id=m['id']).execute()
if 'payload' not in mb:
continue
headers = mb['payload']['headers']
for header in headers:
if (header['name'] == 'From'):
sender = header['value']
if sender not in senders:
senders.append(sender)
break
senders.sort()
return senders
def split_senders(senders):
ret = []
for sender in senders:
ret.append(split_sender(sender))
return ret
def split_sender(sender):
idx = sender.find(" <")
if idx < 0:
return ['', sender]
name = sender[0:idx-1].strip('"')
email = sender[idx+2:-1]
return [name, email]
argv = sys.argv
if (len(argv) < 2):
print("USAGE: %s LABEL_NAME" % argv[0])
sys.exit(1)
label_name = argv[1]
label_id = get_label_by_name(label_name)
print("LABEL: ", label_name, label_id)
msgs = list_messages_by_label([label_id])
print("Messages: ", len(msgs))
senders = list_sender(msgs)
print("Senders: ", len(senders))
senders = split_senders(senders)
with open('senders.csv', 'w') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerows(senders)
google-api-python-client==1.6.7
httplib2==0.11.3
oauth2client==4.1.2
pyasn1==0.4.2
pyasn1-modules==0.2.1
rsa==3.4.2
six==1.11.0
uritemplate==3.0.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment