2010-03-27 15 views
6

He logrado obtener archivos adjuntos de correo electrónico en Amazon S3 desde un correo electrónico entrante de GAE, pero ¿alguien sabe una técnica para obtener un archivo adjunto, como una imagen, en la librería de blob.¿Es posible obtener un archivo adjunto de correo electrónico en Blobstore de App Engine?

Cualquier ayuda sería muy apreciada.

Código hasta el momento (con la ayuda de 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

¿Hay algún motivo por el que no pueda simplemente almacenar el archivo cargado directamente en el almacén de datos? –

+0

El campo de carga en la página puede aceptar archivos de más de 1MB, quiero que todos los archivos ingresen al blobstore, incluso desde correos electrónicos, así que necesito que los archivos adjuntos de correo electrónico también entren allí. – Effisfor

Respuesta

11

para recibir el correo en su aplicación GAE, siga los documentos here: en particular, obtendrá una instancia de la clase InboundEmailMessage con un atributo attachments cuales , y cito:

es una lista de archivos adjuntos, posiblemente vacía. Cada valor en la lista es una tupla de dos elementos: el nombre de archivo y el contenido del archivo.

Entonces, por these GAE docs, que "crea una dirección URL de carga" y en el controlador de carga (por lo general una subclase de BlobstoreUploadHandler) utiliza get_upload para obtener BlobInfo casos y poner sus metadatos en alguna parte que más tarde le permitirá a traes de regreso como tu aplicación requiera.

Finalmente, usted POST los datos (que tiene desde attachments, arriba) a su propia "URL de carga" recientemente generada, p. usando urlfetch.fetch (con method-POST y una carga útil en la codificación estándar application/x-www-form-urlencoded para el "formulario" que el usuario estaría rellenando si cargaran los datos directamente, que es la manera "normal" de colocar datos en la librería de blobs, por ejemplo, use urllib.urlencode para preparar la carga útil).

Ese "auto-POST" utilizará otra instancia de su aplicación para "recibir" los datos en el almacén de blob (mientras que la instancia que recibió el correo electrónico espera, ya que fetch es síncrono).

+0

¿No necesitaría una solicitud de formulario codificada en varias partes (ya que allí hay un archivo adjunto)? He intentado codificar algo que se publicará en blobstore desde el código del servidor desde hace algún tiempo sin éxito ... –

+0

Sí, creo que necesita varias partes (y shd ha mencionado que el módulo 'email' puede ayudar preparando eso). –

+0

@ Tomás, no tengo código de trabajo porque no tengo blobstore en mi cuenta de GAE (ya que no he habilitado la facturación allí). Para la codificación, habiendo usado 'email', use' msg.flatten() '. Le sugiero que edite su Q para mostrar este código para que pueda formatearlo. –

Cuestiones relacionadas