使用Python 3.3生成并保存.eml文件

10
我正在尝试使用标准的电子邮件库生成电子邮件,并将它们保存为 .eml 文件。 我可能没有理解电子邮件生成器如何工作,因为我一直收到错误信息:“AttributeError: 'str' object has no attribute 'write.'”

我想用标准的电子邮件库生成邮件并将它们另存为 EML 文件。我可能没有正确理解电子邮件生成器的工作原理,因为我一直收到“AttributeError: 'str' object has no attribute 'write.'”错误。

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)

有任何想法吗?


1
你能包含堆栈跟踪吗? - woot
2个回答

9
你需要传递一个开着写入模式的文件给 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() 将返回当前工作目录。如果您想要将文件保存在其他位置,只需相应地更改即可。

8

这里是一种经过修改的解决方案,可以使用额外的头部信息工作。(此方案已在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 ============"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接