【问题标题】:Generating and saving an .eml file with python 3.3使用 python 3.3 生成和保存 .eml 文件
【发布时间】:2014-07-13 07:14:08
【问题描述】:

我正在尝试使用标准电子邮件库生成电子邮件并将它们保存为 .eml 文件。 我一定不明白 email.generator 是如何工作的,因为我不断收到错误 '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)

有什么想法吗?

【问题讨论】:

  • 你能包含堆栈跟踪吗?

标签: python email generator


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是一个修改后的解决方案,它也适用于额外的标题。 (这是用 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 ============"
    

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2011-02-23
      • 2013-01-06
      • 2011-07-28
      • 2022-01-04
      • 2019-11-26
      • 2012-02-05
      相关资源
      最近更新 更多