2014-05-23 115 views
4

我試圖使用標準的電子郵件庫生成電子郵件並將它們保存爲.eml文件。 我不能理解email.generator是如何工作的,因爲我總是收到錯誤'AttributeError:'str'對象沒有屬性'寫'。使用python生成和保存.eml文件3.3

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

回答

4

你應該通過一個打開的文件(在寫模式下)到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()將在跨plattform的方式,這就是爲什麼你應該更喜歡它了手工拼接路徑加入路徑。

os.getcwd()將返回您當前的工作目錄。如果你想把你的文件保存到其他地方,只需將其相應地更改。

+0

很酷的工作,謝謝。 – user3434523

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 ============"