How to get key values when iterating a mailbox?

Chris Rebert clp2 at rebertia.com
Mon Oct 18 12:57:19 EDT 2010


On Mon, Oct 18, 2010 at 8:42 AM,  <tinnews at isbd.co.uk> wrote:
> I'm trying to delete some messages from a mailbox when they are older
> than a certain number of days.
>
> If I iterate through the mailbox and find a message that needs
> deleting how do I get its key so I can do "remove(key)"?
>
> The trouble is that, as the documentation says: "The default Mailbox
> iterator iterates over message representations, not keys as the
> default dictionary iterator does." So if you try something like:-
>
>    for f in os.listdir(junkdir):
>        mbxPath = os.path.join(junkdir, f)
>        mbx = mailbox.mbox(mbxPath, factory=None)
>        mbx.lock()
>        for k, msg in mbx:
>            if <something is true>
>                msg.remove(k)
>        mbx.flush()
>        mbx.unlock()
>
> Then you get an exception on "for k, msg in mbx" which is an attribute
> error, presumably because a mailbox isn't a 'real' iterator.

No, it's probably because iterating over a Mailbox yields Message-s
rather than (key, Message) pairs; Python thus tries to unpack each
Message into a (k, msg) pair (since that's how you wrote your
for-loop), but this fails since (I would assume) Messages aren't
iterable.

> So how,
> do I get that key value?

If you want to iterate over key-value pairs (aka "items"), then ask
Mailbox for items in the first place:

for k, msg in mbx.iteritems():
    # rest of code

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list