Created
March 3, 2014 22:35
-
-
Save zed/9336086 to your computer and use it in GitHub Desktop.
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
#!/usr/bin/env python3 | |
"""Print emails from a given date interval. | |
Usage: | |
$ %(prog)s <since_date> <before_date> | |
since_date < before_date | |
Date format: DD-Mon-YYYY e.g., 3-Mar-2014 | |
Based on http://pymotw.com/2/imaplib/ | |
Context: http://stackoverflow.com/q/22092568/ | |
""" | |
import email | |
import sys | |
from datetime import datetime | |
from imaplib import IMAP4_SSL | |
from netrc import netrc | |
import imaplib; imaplib.Debug = True | |
def decode_header(header_string): | |
try: | |
decoded_seq = email.header.decode_header(header_string) | |
return str(email.header.make_header(decoded_seq)) | |
except Exception: # fallback: return as is | |
return header_string | |
def get_text(msg, fallback_encoding='utf-8', errors='replace'): | |
"""Extract plain text from email.""" | |
text = [] | |
for part in msg.walk(): | |
if part.get_content_type() == 'text/plain': | |
p = part.get_payload(decode=True) | |
if p is not None: | |
text.append(p.decode(part.get_charset() or fallback_encoding, | |
errors)) | |
return "\n".join(text) | |
# define since/before dates | |
date_format = "%d-%b-%Y" # DD-Mon-YYYY e.g., 3-Mar-2014 | |
since_date = datetime.strptime(sys.argv[1], date_format) | |
before_date = datetime.strptime(sys.argv[2], date_format) | |
imap_host, imap_port = "imap.gmail.com", 993 | |
login, _, password = netrc().authenticators(imap_host) | |
# connect to the imap server | |
mail = IMAP4_SSL(imap_host, imap_port) | |
mail.login(login, password) | |
try: | |
mail.select('INBOX', readonly=True) | |
# get all messages since since_date and before before_date | |
typ, [msg_ids] = mail.search(None, | |
'(since "%s" before "%s")' % (since_date.strftime(date_format), | |
before_date.strftime(date_format))) | |
# get complete email messages in RFC822 format | |
for num in msg_ids.split(): | |
typ, msg_data = mail.fetch(num, '(RFC822)') | |
for response_part in msg_data: | |
if isinstance(response_part, tuple): | |
msg = email.message_from_bytes(response_part[1]) | |
for header in [ 'subject', 'to', 'from', 'date' ]: | |
print('%-8s: %s' % ( | |
header.upper(), decode_header(msg[header]))) | |
print(get_text(msg)) | |
finally: | |
try: | |
mail.close() | |
finally: | |
mail.logout() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment