We're back after a server migration that caused effbot.org to fall over a bit harder than expected. Expect some glitches.

The rfc822 module

This module contains a parser for mail and news messages (and any other message that conforms to the RFC 822 standard, such as HTTP headers).

Basically, an RFC 822 style message consists of a number of header fields, followed by at least one blank line, and the message body itself.

For example, here’s a short mail message. The first five lines make up the message header, and the actual messages (a single line, in this case) follows after an empty line:

Message-Id: <20001114144603.00abb310@oreilly.com>
Date: Tue, 14 Nov 2000 14:55:07 -0500
To: "Fredrik Lundh" <fredrik@effbot.org>
From: Frank
Subject: Re: python library book!

Where is it?

The message parser reads the headers, and returns a dictionary-like object, with the message headers as keys.

Example: Using the rfc822 module
# File: rfc822-example-1.py

import rfc822

file = open("samples/sample.eml")

message = rfc822.Message(file)

for k, v in message.items():
    print k, "=", v

print len(file.read()), "bytes in body"

$ python rfc822-example-1.py
subject = Re: python library book!
from = "Frank" <your@editor>
message-id = <20001114144603.00abb310@oreilly.com>
to = "Fredrik Lundh" <fredrik@effbot.org>
date = Tue, 14 Nov 2000 14:55:07 -0500
25 bytes in body

The message object also provides a couple of convenience methods, which parses address fields and dates for you:

Example: Parsing header fields using the rfc822 module
# File: rfc822-example-2.py

import rfc822

file = open("samples/sample.eml")

message = rfc822.Message(file)

print message.getdate("date")
print message.getaddr("from")
print message.getaddrlist("to")
$ python rfc822-example-2.py
(2000, 11, 14, 14, 55, 7, 0, 0, 0)
('Frank', 'your@editor')
[('Fredrik Lundh', 'fredrik@effbot.org')]

The address fields are parsed into (mail, real name)-tuples. The date field is parsed into a 9-element time tuple, ready for use with the time module.