Skip to content

Instantly share code, notes, and snippets.

@batzner
Created August 13, 2019 15:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save batzner/a301df8a31e4862be0fe85f9d6e2a7e2 to your computer and use it in GitHub Desktop.
Save batzner/a301df8a31e4862be0fe85f9d6e2a7e2 to your computer and use it in GitHub Desktop.
"""Lists all e-mails for a given IMAP account, largest first. Can be useful when freeing up space.
Requires imapclient==2.1.0 and python3.6 or higher.
"""
from collections import namedtuple
from email.header import decode_header
from imapclient import IMAPClient
HOST = 'imap.example.com'
USER = 'username'
PASSWORD = 'password1234'
Message = namedtuple('Message', ['id', 'subject', 'date', 'size', 'folder'])
def main():
messages = []
with IMAPClient(HOST) as client:
client.login(USER, PASSWORD)
for _, _, folder in client.list_folders():
print('Scanning folder %s' % folder)
client.select_folder(folder)
message_ids = client.search()
response = client.fetch(message_ids, ['ENVELOPE', 'RFC822.SIZE'])
for message_id, data in response.items():
envelope = data[b'ENVELOPE']
size = data[b'RFC822.SIZE']
subject = get_subject(envelope)
message = Message(id=message_id, subject=subject, date=envelope.date, size=size,
folder=folder)
messages.append(message)
messages = sorted(messages, key=lambda m: m.size, reverse=True)
for message in messages:
print(message)
def get_subject(envelope):
subject = None
if envelope.subject:
subject_data = envelope.subject.decode()
subject_encoded, subject_encoding = decode_header(subject_data)[0]
if subject_encoding is not None:
try:
subject = subject_encoded.decode(subject_encoding)
except LookupError:
# Subject cannot be decoded
subject = subject_encoded
else:
# Subject is already decoded
subject = subject_encoded
return subject
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment