Utilisation de Python 3.1.2 J'ai un problème d'envoi de fichiers de pièces jointes binaires (JPEG, PDF, etc.) - MIMETEXT Pièces jointes fonctionnent bien. Le code en question est le suivant ...
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))
3 Réponses :
OK - Après beaucoup de frustration et de recherche Web, j'ai constaté que le problème est un bug connu qui s'applique à Python 3.x, encoders.py, fonction Encode_base64, qui devrait se lire comme suit ...
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'
De quel module vient "_bencode"? Serait mieux si vous incluez des instructions d'importation que ce code utilise.
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)
solution de Cette réponse
@bstpierre, merci pour cette solution. Je vais le stocker au cas où ma solution actuelle tombe dans une future version de Python.
Au moyen d'une solution de contournement (bien, une solution de contournement éventuelle, je n'ai aucune idée si elle aidera), vous pouvez essayer d'utiliser
mimimplication code> au lieu de
mimebase code>
Salut David merci pour la réponse. J'ai essayé MIMIAPPLICATION, mais sans être disponible (c.-à-d. Msg.get_payload () renvoie toujours les octets au lieu de la chaîne). Je soupçonne que c'est quelque chose à voir avec le codage ne convertissant pas correctement le fichier binaire en une chaîne, mais je pourrais me tromper. Je suis également préoccupé par le fait que j'ai essayé de nombreux exemples similaires de divers sites Web - ils échouent tous pour moi, mais devraient avoir travaillé pour l'auteur. Salutations