Two email module questions
Andrew Dalke
adalke at mindspring.com
Thu Jan 9 05:32:52 EST 2003
Paul Mackinney wrote:
> 1. There are two obvious ways to use email.message_from_file. Am I
> correct in assuming that method a. is prefered, because method b. leaves
> an open file with no convenient way to close it?
>
> a. fn = file('foo','r')
> msg = email.message_from_file(fn)
> fn.close()
>
> b. msg = email.message_from_file(file('foo','r'))
There was a thread about this a week or two back. It comes down to,
do you trust garbage collection or not? If not, you'll probably want
to do
fn = file('foo', 'r')
try:
msg = email.message_from_file(fn)
finally:
fn.close()
I personally don't worry about it and go for b.
> 2. After importing a message, I get a bogus extra line at the top when I
> print it:
...
> >>> msg = message_from_file('foo')
> >>> print msg
> From nobody Thu Jan 9 01:16:54 2003
...
> What's going on here? The 'From nobody...' line doesn't show in
> msg.keys(), I couldn't find this behavior in the docs.
That's the "unixfrom" option. Look at email.Message.__str__ and
you'll see
def __str__(self):
"""Return the entire formatted message as a string.
This includes the headers, body, and envelope header.
"""
return self.as_string(unixfrom=True)
def as_string(self, unixfrom=False):
"""Return the entire formatted message as a string.
Optional `unixfrom' when True, means include the Unix From_ envelope
header.
"""
from email.Generator import Generator
fp = StringIO()
g = Generator(fp)
g.flatten(self, unixfrom=unixfrom)
return fp.getvalue()
So try 'print msg.tostring()'
(Erm, this is Python 2.3. Python 2.2's 'email' uses 0 and 1 instead
of False and True.)
Andrew
dalke at dalkescientific.com
More information about the Python-list
mailing list