Uso de Python 3.1.2 Tengo problemas para enviar archivos adjuntos binarios (jpeg, pdf, etc.) - Los archivos adjuntos MIMEText funcionan bien. El código en cuestión es la siguiente ...Problema de archivo adjunto de correo electrónico de archivo binario
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())
Sin embargo, hasta abajo en la pila de llamadas-(ver rastreo más adelante), parece que msg.as_string() ha recibido un archivo adjunto que crea una carga útil de 'bytes' tipo en lugar de cadena.
¿Alguien tiene alguna idea de lo que podría estar causando el problema? Cualquier ayuda sería apreciada.
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))
A modo de solución (así, una posible solución, De hecho, no tengo idea si esto ayudará), puede intentar usar 'MIMEApplication' en lugar de' MIMEBase' –
Hola David, gracias por la respuesta. Probé la aplicación MIMEA, pero fue en vano (es decir, msg.get_payload() aún devuelve bytes en lugar de cadena). Sospecho que tiene algo que ver con la codificación que no convierte correctamente el archivo binario a una cadena, pero podría estar equivocado. También me preocupa que haya intentado muchos ejemplos similares de varios sitios web: todos fallan, pero deben haber funcionado para el autor. Saludos –