파일
`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 MB까지, filename 이름으로 저장하고 파일을 돌려주며, 발송은 그 id를 {'fileId': upload['id']}로 첨부합니다. content_type을 넘기세요. 넘기지 않으면 바이트는 application/octet-stream으로 저장됩니다. 두 번째 시도는 두 번째 사본을 저장하게 되므로 절대 재시도하지 않습니다.
아무것도 의존하지 않는 업로드된 파일만 삭제할 수 있으며, 파일마다 deletable과 usage가 이를 미리 알려 줍니다. delete는 다른 파일을 409 file_in_use로 거부합니다. delete_many는 id를 최대 100개 받아 삭제할 수 있는 것을 삭제하고, 나머지는 kept에 각각의 이유와 함께, 그리고 missing에 알려 줍니다.
upload는 bytes, bytearray, memoryview를 받습니다. 호출에 timeout=을 넘기지 않는 한, 클라이언트의 timeout이 아무리 짧아도 응답을 최소 600초 기다리며, 빈 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()전체 레퍼런스