0

J'utilise httplib2 avec l'API Mailgun pour envoyer une pièce jointe que j'ai téléchargée en utilisant Google Drive, l'e-mail est envoyé mais sans pièces jointes .. ci-dessous est mon code ..Comment envoyer des pièces jointes en utilisant python httplib2 avec Mailgun

DRIVE = discovery.build('drive', 'v3', http=http_auth) 

     request = DRIVE.files().export_media(fileId=file_id, mimeType='application/pdf') 

     fh = io.BytesIO() 
     downloader = MediaIoBaseDownload(fh, request) 

     done = False 
     while done is False: 
      status, done = downloader.next_chunk() 
      logging.info("Download %d%%." % int(status.progress() * 100)) 

     messages = { 
      "from": sender, 
      "to": recipient, 
      "subject": 'Attachment Mail from Mailgun', 
      "text": 'Testing', 
      "attachment": fh.getvalue() 
     } 

     url = URL 

     data = { 
      "from": messages['from'], 
      "to": messages['to'], 
      "subject": messages['subject'], 
      "text": messages['text'], 
      "attachment": messages['attachment'] 
     } 

     pl = urllib.urlencode(data) 

     http = httplib2.Http() 
     http.add_credentials('api', API) 

     resp, content = http.request(
      url, 'POST', pl, 
      headers={"Content-Type": "application/x-www-form-urlencoded"}) 

Répondre

0

Nous utilisons l'API mailgun pour envoyer des courriels en utilisant Appengine et lecture de cloud storage, les mêmes principes seront appliqués à google drive:

la première chose que je suggère est à la recherche en StringIO. Il vous permet de simuler le travail avec des fichiers dans le sandbox appengine d'une manière plus simple que BytesIO, mais les deux produisent ce que python appelle file objects qui supporte .read() donc cela devrait fonctionner avec les deux.

Une fois que vous avez votre fichier en tant que file like object, il vous suffit de le transmettre correctement à l'API. L'exemple suivant utilise la bibliothèque requests car il est très facile de POST avec des fichiers et est compatible avec appengine.

Notez que dans ce cas open(FILE_PATH_1, 'rb') est un file like object, il vous suffit de le remplacer par votre objet fichier:

def send_complex_message(): 
    return requests.post("https://api.mailgun.net/v2/DOMAIN/messages", 
      auth=("api", "key-SECRET"), 
      files={ 
       "attachment[0]": ("FileName1.ext", open(FILE_PATH_1, 'rb')), 
       "attachment[1]": ("FileName2.ext", open(FILE_PATH_2, 'rb')) 
      }, 
      data={"from": "FROM_EMAIL", 
       "to": [TO_EMAIL], 
       "subject": SUBJECT, 
       "html": HTML_CONTENT 
      })