2010-03-27 4 views
6

Sono riuscito a ottenere allegati di posta elettronica su Amazon S3 da una email in arrivo GAE, ma qualcuno conosce una tecnica per ottenere un allegato, come un'immagine, nel blobstore.È possibile ottenere un allegato di posta elettronica in Blobstore di App Engine?

Qualsiasi aiuto sarebbe molto apprezzato.

Codice finora (con l'aiuto di Alex)

upload_url = blobstore.create_upload_url('/upload') 
msg = MIMEMultipart() 
msg.set_type('multipart/form-data') 
msg.set_payload({'file': content}) 
result = urlfetch.fetch(upload_url, payload=urllib.urlencode(msg), method=urlfetch.POST, headers={'Content-Type': 'multipart/form-data'}) 
+0

C'è un motivo per cui non è possibile archiviare il file caricato direttamente nel datastore? –

+0

Il campo di caricamento nella pagina può accettare file di dimensioni superiori a 1 MB, voglio che tutti i file vadano nel blobstore, anche dalle e-mail, quindi ho bisogno anche degli allegati di posta elettronica. – Effisfor

risposta

11

Per ricevere la posta nel vostro GAE app, seguire la documentazione here: in particolare, si otterrà un'istanza della classe InboundEmailMessage con un attributo che attachments , e cito:

è un elenco di file allegati, forse vuoto. Ogni valore nell'elenco è una tupla di due elementi: il nome file e il contenuto del file.

Poi, per these GAE docs, è "creare un URL Upload" e nel vostro gestore di upload (tipicamente una sottoclasse di BlobstoreUploadHandler) si utilizza get_upload per ottenere BlobInfo istanze e mettere la loro metadati da qualche parte che poi permetterà di prenderli indietro come potrebbe richiedere la tua app.

Infine, si POST i dati (che si hanno da attachments, sopra) al proprio "URL di caricamento" appena creato, ad es. utilizzando urlfetch.fetch (con method-POST e un carico utile nella codifica standard application/x-www-form-urlencoded per il "modulo" che l'utente compilerebbe se stessero caricando i dati direttamente, che è il modo "normale" per inserire i dati nel blobstore - ad esempio è possibile utilizzare urllib.urlencode per preparare il payload).

Quel "self-POST" utilizzerà un'altra istanza della tua app per "ricevere" i dati nel blobstore (mentre l'istanza che ha ricevuto l'e-mail attende, poiché fetch è sincrono).

+0

Non avresti bisogno di una richiesta di modulo codificata multipart (visto che c'è un allegato di file lì)? Ho cercato di codificare qualcosa che pubblicheremo su blobstore dal codice server per qualche tempo senza successo .... –

+0

Sì, credo che sia necessario multipart (e shd hanno menzionato che il modulo 'email' può aiutare preparandolo). –

+0

@ Tomás, non ho codice funzionante perché non ho blobstore nel mio account GAE (dato che non ho abilitato la fatturazione lì). Per la codifica, dopo aver usato 'email', usa' msg.flatten() '. Ti suggerisco di modificare la tua Q per mostrare questo codice in modo da poterlo formattare. –