使用python 3.3生成和保存.eml文件

时间:2014-05-23 19:59:10

标签: python email generator

我正在尝试使用标准电子邮件库生成电子邮件,并将其另存为.eml文件。 我不能理解email.generator是如何工作的,因为我一直收到错误' AttributeError:' str'对象没有属性'写。'

from email import generator
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
active_dir = 'c:\\'

class Gen_Emails(object):
    def __init__(self):
        self.EmailGen()

    def EmailGen(self):
        sender = 'sender'
        recepiant = 'recipiant'
        subject = 'subject'

        msg = MIMEMultipart('alternative')
        msg['Subject'] = subject
        msg['From'] = sender
        msg['To'] = recepiant


        html = """\
        <html>
            <head></head>
            <body>
                <p> hello world </p>
            </body>
        </html>
        """
        part = MIMEText(html, 'html')

        msg.attach(part)

        self.SaveToFile(msg)

    def SaveToFile(self,msg):
        out_file = active_dir
        gen = generator.Generator(out_file)
        gen.flatten(msg)

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

您应该将打开的文件(处于写入模式)传递给Generator()。目前你只传递一个字符串,这就是它试图在字符串上调用.write()时失败的原因。

所以做这样的事情:

import os
cwd = os.getcwd()
outfile_name = os.path.join(cwd, 'message.eml')

class Gen_Emails(object):    

    # ...

    def SaveToFile(self,msg):
        with open(outfile_name, 'w') as outfile:
            gen = generator.Generator(outfile)
            gen.flatten(msg)

注意with open(outfile_name, 'w') as outfile在写入模式下以路径outfile_name打开文件,并将文件指针指向打开的文件outfile。退出with块后,上下文管理器还会为您关闭文件。

os.path.join()将以跨平台方式连接路径,这就是为什么您应该优先选择手工连接路径。

os.getcwd()将返回您当前的工作目录。如果您希望将文件保存在其他地方,只需相应地更改即可。

答案 1 :(得分:4)

这是一个修改后的解决方案,也适用于额外的标头。 (这是用Python 2.6测试的)

import os
from email import generator
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

html_data = ...

msg = MIMEMultipart('alternative')
msg['Subject'] = ...
msg['From'] = ...
msg['To'] = ...
msg['Cc'] = ...
msg['Bcc'] = ...
headers = ... dict of header key / value pairs ...
for key in headers:
    value = headers[key]
    if value and not isinstance(value, basestring):
        value = str(value)
    msg[key] = value

part = MIMEText(html_data, 'html')
msg.attach(part)

outfile_name = os.path.join("/", "temp", "email_sample.eml")
with open(outfile_name, 'w') as outfile:
    gen = generator.Generator(outfile)
    gen.flatten(msg)

print "=========== DONE ============"