8
votes

Problème de joignement de courrier électronique binaire

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))


2 commentaires

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 au lieu de mimebase


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


3 Réponses :


3
votes

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'


1 commentaires

De quel module vient "_bencode"? Serait mieux si vous incluez des instructions d'importation que ce code utilise.



3
votes
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 commentaires

5
votes

solution de Cette réponse xxx


1 commentaires

@bstpierre, merci pour cette solution. Je vais le stocker au cas où ma solution actuelle tombe dans une future version de Python.