Mailbox summary script

I keep my email organized by project, and sometimes I need a list of all the messages in a project’s mailbox. I don’t necessarily need to print all the messages in the mailbox, just a summary of each: date, to, from, and subject. This is basically what I have showing in the top right pane of Apple Mail, but since there doesn’t seem to be a builtin way of printing that pane, I wrote a script to do it.

I decided to make the output of my script an HTML file with a tabular summary of the messages, like this:

(This is a Safari screenshot, but without a toolbar.)

HTML is portable, easy to write, easy to print from a browser, and—on a Mac—easy to convert to PDF. Detailed formatting is somewhat limited, even with CSS, but I didn’t need elaborate styling. Writing HTML means slinging text, so I decided to write the script in Python using Appscript because it’s better at handling text than AppleScript is. Here it is:

 1  #!/usr/bin/python
 2  
 3  from appscript import *
 4  import datetime
 5  
 6  # The name of the mailbox of interest. If the mailbox is in a folder,
 7  # the format is "Folder name/Mailbox name"
 8  mailboxname = "Active projects/Project X"
 9  
10  # The template for the HTML file is a table with the message date,
11  # the first recipient, the sender, and the subject of each message.
12  tmpl = """<html>
13  <head>
14    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
15    <title>Email Summary</title>
16    <style type="text/css">
17        table {
18          border-collapse: collapse; 
19        }
20  
21        table th {
22          padding: .5em 1em .25em 1em;
23          background-color: #ddd;
24          border: 1px solid black;
25          border-bottom: 2px solid black;
26        }
27  
28        table td {
29          padding: .25em 1em .25em 1em;
30          border: 1px solid black;
31        }
32    </style>
33  </head>
34  <body>
35    <table>
36      <tr><th>Date</th><th>To</th><th>From</th><th>Subject</td></tr>
37  %s
38    </table>
39  </body>
40  </html>
41  """
42  
43  # Get the mail box of interest and sort the messages in ascending order by date sent.
44  box = app('Mail.app').mailboxes[mailboxname].messages.get()
45  box.sort( lambda x,y: cmp( x.date_sent.get(), y.date_sent.get() ) )
46  
47  # Collect the summary information from each message in the box.
48  summaries = []
49  for msg in box:
50      info = []
51      info.append(msg.date_sent.get().strftime("%Y-%m-%d"))
52      # Use the recipient's name if possible, otherwise the address.
53      if msg.to_recipients.get()[0].name.get():
54          info.append(msg.to_recipients.get()[0].name.get().encode('utf-8'))
55      else:
56          info.append(msg.to_recipients.get()[0].address.get().encode('utf-8'))
57      info.append(msg.sender.get().encode('utf-8'))
58      info.append(msg.subject.get().encode('utf-8'))
59      row = "    <tr><td>" + "</td><td>".join(info) + "</td></tr>"
60      summaries.append(row)
61  
62  # Print out the resulting HTML file.
63  print tmpl % "\n".join(summaries)

I call it “email-summary,” and I’ve made it executable and put it in my $PATH so I can run it directly from the command line.

email-summary > project-x-summary.html

The comments in the source tell most of the story, but a little extra explanation may help.

Having a list like this printed out on several pages often gives me a good sense of the development of a project.

Tags: