Файлы
`files.list`, `list_all`, `iterate`, `get`, `download`, `list_links`, `list_all_links`, `iterate_links`, `create_link`, `revoke_link`, `stats`, `upload`, `delete` и `delete_many`.
Все методы
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'])Каждый файл, который хранит ящик: отправленные и полученные вложения и загруженные в него файлы, то есть страница «Файлы» в приложении. download возвращает весь файл как bytes, ссылки являются ссылками для скачивания, с которыми ушёл файл, с числом скачиваний по каждой, а stats соответствует вкладке «Аналитика».
list, list_all и iterate принимают q, kind и sort, а также direction (inbound, outbound или uploaded), address, то есть файлы одного адреса, сравниваемого без учёта регистра, и since и until, datetime или строку ISO 8601. since включает свой момент, а until останавливается перед ним.
Для чтения нужен files:read, а для загрузки, удаления, публикации и отзыва ссылок files:write, который включает files:read. Ключ, созданный до того, как у файлов появились собственные права, получил соответствующие. Ключ, ограниченный определёнными адресами или доменами, видит только файлы на них.
Публичные ссылки
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 публикует файл по публичной ссылке для скачивания, которая открывается без входа, и возвращает её. Ссылка размещается на файловом хосте domain, если у этого домена он есть, например files.acme.com, иначе на файловом хосте адреса, которому принадлежит файл, иначе на адресе API. Файл, пришедший или ушедший с письмом, сначала копируется в публичное хранилище, а программа или скрипт отклоняются с 422 file_unshareable.
Каждый create_link создаёт новую ссылку, поэтому после потерянного ответа он никогда не повторяется: сначала поищите ссылку через list_links. revoke_link навсегда отключает ссылку, в том числе в уже ушедших письмах, и возвращает её с заполненным revokedAt. Отозвать ссылку дважды безопасно, а неизвестная ссылка даёт 404.
Загрузка и удаление
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 сохраняет байты как есть, до 100 МБ, под именем filename и возвращает файл, id которого отправка прикрепляет как {'fileId': upload['id']}. Передайте content_type, иначе байты сохраняются как application/octet-stream. Вызов никогда не повторяется, потому что вторая попытка сохранила бы вторую копию.
Удалить можно только загруженный файл, от которого ничего не зависит, и deletable и usage у каждого файла заранее говорят об этом. delete отклоняет любой другой файл с 409 file_in_use. delete_many принимает до 100 id, удаляет что может и сообщает об остальном в kept, каждый с причиной, и в missing.
upload принимает bytes, bytearray или memoryview. Он ждёт ответа не меньше 600 секунд, каким бы коротким ни был timeout клиента, если только вы не передадите timeout= в вызов, а пустой filename выбрасывает ValueError до какой-либо отправки.
Справочник
files.list()Полный справочникfiles.list_all()Полный справочникfiles.iterate()Полный справочникfiles.get()Полный справочникfiles.download()Полный справочникfiles.list_links()Полный справочникfiles.list_all_links()Полный справочникfiles.iterate_links()Полный справочникfiles.create_link()Полный справочникfiles.revoke_link()Полный справочникfiles.stats()Полный справочникfiles.upload()Полный справочникfiles.delete()Полный справочникfiles.delete_many()Полный справочник