diff options
-rwxr-xr-x | bin/rename-email.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/bin/rename-email.py b/bin/rename-email.py new file mode 100755 index 0000000..95ba3b2 --- /dev/null +++ b/bin/rename-email.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2017 Aaron LI +# MIT license +# +# 2017-04-17 +# + +""" +Rename email filename according to the given pattern. +""" + +import os +import sys +import email +import argparse + + +class Email: + def __init__(self, filename): + self.filename = filename + self.message = email.message_from_file(open(filename)) + self.date_ = email.utils.parsedate_to_datetime(self.message["Date"]) + self.from_ = email.utils.parseaddr(self.message["From"])[-1] + + @property + def headers(self): + return { + "date": self.date_.isoformat(), + "from": self.from_ + } + + def rename(self, pattern, dryrun=False): + newname = pattern.format(**self.headers) + newfp = os.path.join(os.path.dirname(self.filename), newname) + print("Rename: '%s' -> '%s'" % (self.filename, newfp), file=sys.stderr) + if not dryrun: + os.renames(self.filename, newfp) + + +def main(): + # format: <filename>:2,<flags> + default_pattern = "{date}_{from}:2,S" + + parser = argparse.ArgumentParser( + description="Rename email filename according the given pattern") + parser.add_argument("-p", "--pattern", dest="pattern", + default=default_pattern, + help="New filename pattern (default: '%s')" % + default_pattern) + parser.add_argument("-n", "--dry-run", dest="dryrun", + action="store_true", help="Dry run") + parser.add_argument("emails", nargs="+", + help="List of email files to be renamed") + args = parser.parse_args() + + for fn in args.emails: + eml = Email(fn) + eml.rename(pattern=args.pattern, dryrun=args.dryrun) + + +if __name__ == "__main__": + main() |