2010-05-09 11 views
6

Python 3.1.2 Kullanarak ikili ek dosyaları gönderme konusunda sorun yaşıyorum (jpeg, pdf, vb) - MIMEText ekleri düzgün çalışıyor. aşağıdaki gibi, söz konusu kod yolu aşağı çağıran yığınında, İkili dosya e-posta eki sorunu

for file in self.attachments: 
    part = MIMEBase('application', "octet-stream") 
    part.set_payload(open(file,"rb").read()) 
    encoders.encode_base64(part) 
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % file) 
    msg.attach(part) # msg is an instance of MIMEMultipart() 

server = smtplib.SMTP(host, port) 
server.login(username, password) 
server.sendmail(from_addr, all_recipients, msg.as_string()) 

Ancak ... olduğu bir yük oluşturur eki almıştır) (msg.as_string sanki, görünüşe (aşağıdaki Traceback bakınız) string yerine 'bayt' tipi.

Soruna neden olabilecek herhangi bir fikri olan var mı? Herhangi bir yardım takdir edilecektir.

Alan


builtins.TypeError: string payload expected: <class 'bytes'> 
File "c:\Dev\CommonPY\Scripts\email_send.py", line 147, in send 
    server.sendmail(self.from_addr, all_recipients, msg.as_string()) 
File "c:\Program Files\Python31\Lib\email\message.py", line 136, in as_string 
    g.flatten(self, unixfrom=unixfrom) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 76, in flatten 
    self._write(msg) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 101, in _write 
    self._dispatch(msg) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 127, in _dispatch 
    meth(msg) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 181, in _handle_multipart 
    g.flatten(part, unixfrom=False) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 76, in flatten 
    self._write(msg) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 101, in _write 
    self._dispatch(msg) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 127, in _dispatch 
    meth(msg) 
File "c:\Program Files\Python31\Lib\email\generator.py", line 155, in _handle_text 
    raise TypeError('string payload expected: %s' % type(payload)) 
+0

dan çözeltisi (kuyu, olası bir geçici çözüm, Yardım edip edemeyeceğine dair bir fikrim yok. MIMEBase'in yerine “MIMEApplication” kullanmayı deneyebilirsiniz –

+0

Merhaba David Cevabınız için teşekkürler. MIMEApplication çalıştı, ancak hiçbir boşuna (yani. Msg.get_payload() hala dize yerine bytes döndürür). İkili dosyayı bir dizeye doğru şekilde dönüştürmemekle kodlamanın yapılmasıyla ilgili bir şey olduğunu sanıyorum, ama yanılıyor olabilirim. Aynı zamanda çeşitli web sitelerinden çok benzer örnekleri denediğim konusunda endişeliyim - hepsi benim için başarısız oluyor, ancak yazar için çalışmış olmalı. Saygılarımızla –

cevap

3

Tamam - çok hayal kırıklığı ve web arama yaptıktan sonra, sorun Python 3.x, encoders.py, fonksiyon encode_base64 için geçerlidir bilinen bir hata olduğunu bulduk hangi şöyle

def encode_base64(msg): 
    """Encode the message's payload in Base64. 

    Also, add an appropriate Content-Transfer-Encoding header. 
    """ 
    orig = msg.get_payload() 
    encdata = _bencode(orig) 

    # new line inserted to ensure all bytes characters are converted to ASCII 
    encdata = str(encdata, "ASCII") 

    msg.set_payload(encdata) 
    msg['Content-Transfer-Encoding'] = 'base64' 

böcek sorunu # 4768 olarak yükseltilmiştir ve 2010-05-10 tarihinde kritik durumunun için yükseltilmiş oldu ... okumalısınız. Umarım, sonraki sürümü (3.1.3?)

Saygılar Alan

giderilecektir
+0

Kullanabileceğiniz bir geçici çözüm var mı? –

3
for file in self.attachments: 
    fp = open(file,"rb")  
    part = MIMEApplication(fp.read())  
    fp.close()  
    encoders.encode_base64(part) 

    # the miracle 
    part.set_payload(part.get_payload().decode('ASCII')) 

    part.add_header('Content-Disposition', 'attachment; filename="%s"' % file)  
    msg.attach(part) 
+0

Bu umut verici görünüyor - Ben bir deneyin - teşekkürler. –

+0

"e-posta içe aktarma kodlayıcılarından" ekleyin – mastier

2

geçici bir çözüm yoluyla this SO answer

from base64 import encodebytes 
for file in self.attachments: 
    fp = open(file, 'rb') 
    part = MIMEBase('application', "octet-stream") 
    part.set_payload(encodebytes(fp.read()).decode()) 
    fp.close() 
    part.add_header('Content-Transfer-Encoding', 'base64') 
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % file) 
    msg.attach(part) # msg is an instance of MIMEMultipart() 

server = smtplib.SMTP(host, port) 
server.login(username, password) 
server.sendmail(from_addr, all_recipients, msg.as_string()) 
+0

@bstpierre, bu çözüm için teşekkürler. Mevcut çözümümün Python'un gelecekteki bir sürümünde düşmesi durumunda onu saklayacağım. –