Last active
February 19, 2020 20:37
-
-
Save akiyoshi83/08a2975ca9f44957a42e892a3dd29d4d to your computer and use it in GitHub Desktop.
Export senders from Gmail by label
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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