파일
`files.list`, `list_all`, `iterate`, `get`, `download`, `list_links`, `list_all_links`, `iterate_links`, `create_link`, `revoke_link`, `stats`, `upload`, `delete`, `delete_many`.
모든 메서드
page = client.files.list(kind: "pdf", sort: "largest")file = page.items.first links = client.files.list_all_links(file[:id])p links.map { |link| [link[:url], link[:downloads]] } stats = client.files.statsputs stats.dig(:totals, :files), stats.dig(:uploaded, :bytes) File.binwrite(file[:filename], client.files.download(file[:id]))메일함이 보관하는 모든 파일로, 보내고 받은 첨부 파일과 업로드한 파일을 포함합니다: 앱의 파일 페이지에 해당합니다. download는 바이트를 바이너리 String으로 돌려주며, File.binwrite로 그대로 저장할 수 있습니다. 링크는 파일이 나간 다운로드 링크와 각 링크를 받아 간 횟수이며, stats는 분석 탭입니다.
list, list_all, iterate는 q:, kind:, sort:와 함께 direction:(inbound, outbound, uploaded), address:(대소문자를 구분하지 않고 비교하는 한 주소의 파일), 그리고 since:와 until:(Time, DateTime, 또는 ISO 8601 String)을 받습니다. since:는 그 시점을 포함하고 until:은 그 직전에서 멈춥니다. Ruby의 Date는 날짜만 있는 값으로 전송되며, 이 목록은 이를 UTC 자정으로 읽습니다.
q:는 파일 이름과 그 유형을 검색합니다. kind:는 image, pdf, audio, video, text 중 하나이고, sort:는 newest(기본값), oldest, largest, name 중 하나입니다. OpenEmail::FILE_KINDS, OpenEmail::FILE_SORTS, OpenEmail::FILE_DIRECTIONS가 선택지를 정의합니다. list는 OpenEmail::Page 하나를 반환하고, list_all은 모든 파일을 하나의 Array로 반환합니다. iterate는 각 파일을 블록에 yield하며, 루프가 필요로 할 때만 다음 페이지를 가져옵니다. 블록이 없으면 Enumerator를 반환합니다.
읽으려면 files:read, 업로드, 삭제, 링크 게시와 취소에는 files:write가 필요하며, 이는 files:read를 포함합니다. 파일에 자체 스코프가 생기기 전에 만든 키에는 그에 맞는 스코프가 부여되었습니다. 스코프가 없는 키는 403 insufficient_scope로 거부되며, 그 오류에서 scope_missing?이 true입니다. 특정 주소나 도메인으로 제한된 키는 그곳에 도착한 파일만 보므로, 워크스페이스 전체를 위해 업로드된 파일은 보지 못합니다.
download는 파일 전체를 메모리에 담으므로, 아주 큰 파일은 하나씩 가져오세요.
공개 링크
uploads = client.files.list_all(direction: "uploaded", since: Time.utc(2026, 9, 1))file = uploads.first link = client.files.create_link(file[:id], domain: "acme.com")puts link[:url] client.files.revoke_link(file[:id], link[:id])create_link는 로그인 없이 열리는 공개 다운로드 링크로 파일을 게시하고 그 링크를 돌려줍니다. 링크는 domain:에 파일 호스트가 있으면 그곳(예: files.acme.com)에, 없으면 파일이 속한 주소의 파일 호스트에, 그것도 없으면 API 주소에 놓입니다. 메시지로 들어오거나 나간 파일은 먼저 공개 저장소로 복사되며, 프로그램이나 스크립트는 OpenEmail::ValidationError로 발생하는 422 file_unshareable로 거부됩니다.
create_link는 호출할 때마다 새 링크를 만들므로 응답을 놓쳐도 재시도되지 않습니다: 먼저 list_links로 링크를 찾으세요. revoke_link는 이미 보낸 메일에 있는 것까지 포함해 링크를 영구히 멈추고, revokedAt이 설정된 링크를 돌려줍니다. 같은 링크를 두 번 취소해도 안전하므로 gem은 읽기처럼 재시도합니다. 알 수 없는 링크는 OpenEmail::NotFoundError로 발생하는 404입니다.
업로드와 삭제
upload = client.files.upload(File.binread("report.pdf"), filename: "report.pdf", content_type: "application/pdf")client.files.delete(upload[:id]) if upload[:deletable] invoice = client.files.upload(Pathname("invoice.pdf"))puts invoice[:filename], invoice[:mimeType] result = client.files.delete_many(["file_0c4e7a91d2b84f63a5e19b7d", "file_6bb640f5b99e47deb758f1f5"])result[:kept].each { |kept| puts "#{kept[:filename]} #{kept[:reason]}" }upload는 바이트를 그대로, 100 MB까지, filename:의 이름으로 저장하고 파일을 돌려줍니다. 발송은 이를 emails.send의 attachments에 {fileId: upload[:id]}로 첨부합니다. content_type:을 전달하거나 자체 유형을 가진 바이트를 전달하세요. 그 밖의 것은 application/octet-stream으로 저장됩니다. 두 번째 시도는 두 번째 사본을 저장하게 되므로 절대 재시도되지 않습니다.
바이트는 바이너리 String, IO, Pathname 중 하나입니다. Pathname이나 File에는 두 키워드 모두 필요 없습니다: 이름은 파일 자신의 것이고, 유형은 gem이 아는 확장자(.pdf나 .png 등)에서 가져옵니다. Rails 업로드는 자신의 original_filename과 content_type을 가지고 옵니다. 일반 바이트에는 이름이 없으므로, filename: 없는 String이나 StringIO는 무엇이든 보내기 전에 ArgumentError를 발생시킵니다.
업로드는 600초, 또는 클라이언트의 timeout이 더 길면 그 시간까지 실행될 수 있으며, timeout:으로 호출 하나에 다른 상한을 정할 수 있습니다. timeout: 0으로 만든 클라이언트는 업로드가 걸리는 만큼 기다립니다.
아무것도 의존하지 않는 업로드된 파일만 삭제할 수 있으며, 파일마다 deletable과 usage가 이를 미리 알려 줍니다. delete는 다른 파일을 409 file_in_use로 거부하며, 이는 OpenEmail::ConflictError로 발생합니다. delete_many는 id를 최대 100개 받아 삭제할 수 있는 것을 삭제하고, 나머지는 kept에 각각의 이유와 함께, 그리고 missing에 알려 줍니다. 둘 다 재시도되지 않습니다. 응답을 잃은 뒤 두 번째 delete에서 404가 나오면 첫 번째가 성공했다는 뜻이며, 두 번째 delete_many는 그 파일들을 missing에 알려 줍니다.