Archivos
`files.list`, `list_all`, `iterate`, `get`, `download`, `list_links`, `list_all_links`, `iterate_links`, `create_link`, `revoke_link`, `stats`, `upload`, `delete` y `delete_many`.
Todos los métodos
from pathlib import Path from openemail import openemail page = openemail.files.list(kind='pdf', sort='largest')file = page['items'][0] Path(file['filename']).write_bytes(openemail.files.download(file['id'])) links = openemail.files.list_all_links(file['id'])print([(link['url'], link['downloads']) for link in links]) stats = openemail.files.stats()print(stats['totals']['files'], stats['uploaded']['bytes'])Cada archivo que guarda el buzón, adjuntos enviados y recibidos y los archivos subidos a él, la página Archivos de la aplicación. download devuelve el archivo entero como bytes, los enlaces son los enlaces de descarga con los que salió un archivo, con cuántas veces se descargó cada uno, y stats es la pestaña Analíticas.
list, list_all e iterate admiten q, kind y sort, y también direction (inbound, outbound o uploaded), address, los archivos de una dirección comparada sin distinguir mayúsculas y minúsculas, y since y until, un datetime o una cadena ISO 8601. since incluye su momento y until se detiene antes.
Leer necesita files:read, y subir, eliminar y publicar o revocar enlaces necesitan files:write, que incluye files:read. Una clave creada antes de que los archivos tuvieran scopes propios recibió los correspondientes. Una clave limitada a direcciones o dominios concretos solo ve los archivos de ellos.
Enlaces públicos
from openemail import openemail uploads = openemail.files.list_all(direction='uploaded', since='2026-09-01') file = uploads[0] link = openemail.files.create_link(file['id'], domain='acme.com')print(link['url']) openemail.files.revoke_link(file['id'], link['id'])create_link publica un archivo en un enlace de descarga público que se abre sin iniciar sesión y lo devuelve. El enlace vive en el host de archivos de domain cuando ese dominio tiene uno, como files.acme.com, si no en el host de archivos de la dirección a la que pertenece el archivo, y si no en la dirección de la API. Un archivo que llegó o salió en un mensaje se copia primero a un almacenamiento público, y un programa o un script se rechaza con 422 file_unshareable.
Cada create_link crea un enlace nuevo, así que nunca se reintenta tras perder la respuesta: busca antes el enlace con list_links. revoke_link detiene un enlace para siempre, también en el correo que ya salió, y lo devuelve con revokedAt establecido. Revocar uno dos veces es seguro, y un enlace desconocido es un 404.
Subir y eliminar
from pathlib import Path from openemail import openemail upload = openemail.files.upload( Path('price-list.pdf').read_bytes(), filename='price-list.pdf', content_type='application/pdf',) if upload['deletable']: openemail.files.delete(upload['id']) result = openemail.files.delete_many([ 'file_0c4e7a91d2b84f63a5e19b7d', 'file_6bb640f5b99e47deb758f1f5',])for kept in result['kept']: print(kept['filename'], kept['reason'])upload guarda los bytes tal cual, hasta 100 MB, con el nombre filename, y devuelve el archivo, cuyo id un envío adjunta como {'fileId': upload['id']}. Pasa content_type, o los bytes se guardarán como application/octet-stream. Nunca se reintenta, porque un segundo intento guardaría una segunda copia.
Solo se puede eliminar un archivo subido del que nada depende, y deletable y usage en cada archivo lo indican de antemano. delete rechaza cualquier otro archivo con un 409 file_in_use. delete_many admite hasta 100 ids, elimina lo que puede e informa del resto en kept, cada uno con su motivo, y en missing.
upload acepta bytes, bytearray o memoryview. Espera al menos 600 segundos una respuesta, por corto que sea el timeout del cliente, salvo que pases timeout= a la llamada, y un filename en blanco lanza ValueError antes de enviar nada.
Referencia
files.list()Referencia completafiles.list_all()Referencia completafiles.iterate()Referencia completafiles.get()Referencia completafiles.download()Referencia completafiles.list_links()Referencia completafiles.list_all_links()Referencia completafiles.iterate_links()Referencia completafiles.create_link()Referencia completafiles.revoke_link()Referencia completafiles.stats()Referencia completafiles.upload()Referencia completafiles.delete()Referencia completafiles.delete_many()Referencia completa