Skip to content
Mbox Viewer
thunderbirdmboxarchives

메일을 잃지 않고 거대한 썬더버드 메일함 파일을 나누는 방법

썬더버드의 폴더는 mbox 파일 하나입니다. 15년이 지나면 처음 담겼던 디스크보다 무거워지죠. Mbox Viewer로, 그리고 오픈소스 터미널 도구 mboxShell로 이 파일을 더 작은 메일함으로 자르는 방법과, 무엇보다 단 한 통도 사라지지 않았음을 나중에 증명하는 방법을 정리했습니다.

David Carrero ·

썬더버드의 폴더는 폴더가 아닙니다. 지금까지 받은 모든 메시지가 도착한 순서대로 하나씩 이어 붙은, 단 하나의 파일입니다. 이 설계는 놀라울 만큼 잘 늙었습니다 — 2004년에 쓰인 메일함이 오늘도 열리는 이유죠 — 하지만 뒤늦게 깨닫게 되는 결과가 하나 있습니다. 15년이 지나면 받은 편지함은 14 GB짜리 단일 덩어리가 되고, 그중 일부로 무언가를 하려 할 때마다 전체를 움직여야 한다는 것입니다.

언젠가는 쪼갤 이유가 생깁니다. 변호사가 1년치 서신을 요구합니다. 회사를 떠나는데 내 것은 프로젝트 메일뿐입니다. 2008~2015년 구간은 외장 디스크에 두고 나머지만 일상적으로 쓰고 싶습니다. 아니면 그저 폴더가 감당하기 어려워져서, 따로따로 백업할 수 있는 조각으로 나누고 싶을 뿐일 수도 있습니다.

포럼에서 흔히 보는 조언은 split으로 자르라거나, 텍스트 편집기로 자르라거나, /^From / 패턴에 csplit을 쓰라는 것입니다. 그러지 마세요. 이유와, 대신 할 일을 정리합니다.

mbox를 손으로 자르면 어긋나는 이유

mbox 파일은 그냥 이어 붙인 것입니다. 각 메시지는 From 으로 시작하는 줄 — From: 헤더가 아니라 엔벨로프 줄 — 에서 시작해 다음 엔벨로프 줄까지 이어집니다. 형식이라고 할 만한 건 그게 전부입니다.

이 파일을 임의의 바이트나 줄에서 자르면 거의 언제나 메시지 한가운데에 떨어집니다. 앞부분은 헤더의 절반에서 끝나고, 뒷부분은 헤더가 하나도 없는 본문에서 시작합니다 — 더는 메시지가 아니라 그냥 텍스트죠. 두 파일 모두 멀쩡해 보입니다. 열리고, 크기도 그럴듯합니다. 그리고 피해는 몇 년 뒤, 하필 그 한 통을 찾는 날에야 드러납니다.

From 패턴으로 자르는 건 더 영리하지만 여전히 안전하지 않습니다. mbox 계열은 본문에서 From 으로 시작하는 줄을 >From 으로 바꿔 이스케이프하지만, 당신의 메일함에 글을 써 온 모든 프로그램이 그렇게 했다는 보장은 없습니다. 게다가 인용된 답장에는 “From “으로 시작하는 줄이 얼마든지 들어 있을 수 있죠. 패턴으로 나누면 바로 그 메시지가 둘로 찢어집니다. 메일 한 통이 반쪽짜리 두 통이 되고, 아무도 알려주지 않습니다.

이것이 모든 수작업 방식의 진짜 문제입니다. 어떤 방식도 개수를 알려주지 않습니다. 몇 통이 들어갔는지, 몇 통이 나왔는지, 둘이 맞는지 알 수 없습니다. 메일함을 안전하게 나누는 방법은 그것을 텍스트가 아니라 메일로 다루는 것 — 파싱하고, 메시지 단위로 고르고, 다시 써내는 것 — 그리고 마지막에 산수를 확인하는 것입니다.

자르기 전에: 썬더버드 파일에 대한 세 가지

메일함 하나하나는 프로필 안에 확장자 없는 파일로 들어 있습니다.

  • Windows: %APPDATA%\Thunderbird\Profiles\<프로필>\Mail\Local Folders\
  • macOS: ~/Library/Thunderbird/Profiles/<프로필>/Mail/Local Folders/
  • Linux: ~/.thunderbird/<프로필>/Mail/Local Folders/

그 안에는 INBOX, Sent, Archives와 직접 만든 폴더 이름들이 있고, 각각 옆에 같은 이름의 .msf 파일이 있습니다. .msf는 썬더버드의 색인일 뿐이라 무시해도 됩니다 — 필요하면 다시 만들어집니다. 확장자 없는 파일이 바로 메일 본체이고, 표준 mbox 형식입니다. (더 자세한 안내는 macOSWindows 가이드에 있습니다.)

무엇이든 건드리기 전에 세 가지 규칙이 있습니다.

썬더버드를 종료하세요. 썬더버드는 파일을 열어 둔 채 계속 씁니다. 지금도 메시지가 덧붙고 있는 메일함을 나누면 끝에 반쪽 메시지가 남기 마련입니다.

사본으로 작업하세요. 메일함 파일을 다른 곳으로 — 바탕화면이면 충분합니다 — 복사한 뒤 사본을 나누세요. 원본을 프로필 밖으로 옮기면 안 됩니다. 썬더버드는 그 폴더가 사라졌다고 판단합니다.

먼저 압축하거나, 무엇을 가져가는지 알고 계세요. 메시지를 지워도 썬더버드는 표시만 하고 파일 안에 남겨 둡니다. 바이트가 사라지는 건 폴더를 압축(정리)할 때입니다. 4,000통이라고 표시되는 폴더가 9 GB일 수 있는 이유죠. 압축하지 않고 나누면 그 지워진 메시지들이 조각에 그대로 따라옵니다 — 완벽하게 읽히는 메일로요. 원하지 않는다면 폴더를 오른쪽 클릭 → 압축, 원한다면 이 단계를 의도적으로 건너뛰세요.

1단계 — 자르기 전에 재기

어디서 자를지 정하기 전에, 파일 안에 실제로 무엇이 있는지 보세요. 오픈소스(MIT) 터미널 도구 mboxShell은 썬더버드의 확장자 없는 파일을 그대로 읽고, 크기 제한이 없으며, 자신이 연 파일에는 절대 쓰지 않습니다.

$ mboxshell stats INBOX

  File                 INBOX
  File size            9.41 GiB
  Messages             128,455
  Date range           2004-02-11 — 2026-08-19
  Index size           14.2 MiB
  Indexing time        48.31s
  With attachments     19,880 (15.5%)
  Duplicates           312 (128,143 Unique IDs)

이 두 숫자 — 메시지 수날짜 범위 — 를 적어 두세요. 마지막에 대조할 대상입니다.

이제 아무것도 만들지 않은 채로 자를 지점을 설계합니다. search가 구간의 개수를 세어 주므로, 조각이 원하는 크기가 될 때까지 경계를 바꿔 볼 수 있습니다.

$ mboxshell search INBOX "after:2004-01-01 before:2010-01-01" --json | head -3
{
  "result_count": 31204,

after:는 그날을 포함하고 before:는 그날을 제외합니다. 그래서 이렇게 쓴 연속 구간들은 빈틈도 겹침도 없이 정확히 맞닿습니다. 마지막 검증이 성립하는 것도 바로 이 성질 덕분입니다. 전체 검색 문법을 쓰면 날짜 대신 보낸 사람, 크기, 첨부로 자를 수도 있습니다. 사실 그쪽이 목적이라면 그편이 빠릅니다.

2단계 — 메일함 자르기

Mbox Viewer(Mac과 Windows)에서 나누기는 이미 알고 있는 내보내기 그 자체입니다.

  1. 복사한 메일함 파일을 엽니다 — 확장자 없는 그대로, 이름을 바꿀 필요 없습니다.
  2. 구간을 검색합니다: after:2004-01-01 before:2010-01-01.
  3. 메시지를 선택합니다: 첫 줄을 클릭하고 마지막 줄을 Shift+클릭하면 범위 전체가 잡힙니다.
  4. 파일 → 내보내기(⌘E) → MBOX. Windows에서는 내보내기 → MBOX로… 이고, 거기서는 3단계를 건너뛸 수 있습니다. 선택이 없으면 검색 결과로 화면에 남아 있는 전부를 내보냅니다.

INBOX-selection.mbox라는 이름이 제안되고, 딱 그 메시지들만 담긴 새 메일함 하나가 생깁니다. 바이트 단위로 그대로 복사되므로 결과물은 어떤 메일 프로그램에서도 열리는 올바른 메일함이고, 열었던 파일은 전혀 건드리지 않습니다 — 앱은 철저히 읽기 전용입니다. 구간마다 반복하세요. MBOX로 내보내기는 무료 등급에 포함됩니다. 무료 등급이 제한하는 것은 여는 메일함의 크기이고, 그 값은 1 GB입니다.

mboxShell만으로 하려면 경로가 다릅니다. 분명히 말해 두자면, mboxShell은 EML·CSV·텍스트·HTML로 내보내며 부분 mbox는 쓰지 않습니다. 그래서 순수 터미널 경로는 각 구간을 EML 파일 폴더로 내보낸 뒤, 가져오기 시점에 썬더버드가 메일함을 다시 짜도록 맡기는 방식입니다.

$ mboxshell export INBOX --format eml --query "after:2004-01-01 before:2010-01-01" --output ./2004-2009/
  Exporting 31204 message(s) as eml to ./2004-2009/
  Exported 31204 .eml files

돌아가는 길이지만 무료이고, 크기 제한이 없으며, 스크립트로 만들 수 있습니다. 일의 나머지 절반 — 메일함을 합치는 쪽 — 은 mboxShell이 mbox로 써냅니다: mboxshell merge a.mbox b.mbox -o merged.mbox.

3단계 — 아무것도 잃지 않았음을 증명하기

나누기와 도박을 가르는 단계이고, 거의 아무도 하지 않는 단계입니다.

조각마다 세어 보세요. 각 구간에 stats를 돌리고 메시지 수를 더합니다. 합계는 원본이 보고한 수와 같아야 합니다. 모자라면 경계가 잘못 잡힌 것이고, 넘치면 두 구간이 겹친 것입니다.

날짜 범위를 확인하세요. 각 조각의 범위는 요청한 경계 안에 들어야 하고, 조각들은 사이에 구멍 없이 머리와 꼬리가 맞물려야 합니다.

원본을 다시 만들어 비교하세요. 이것이 결정적인 검사입니다. 조각들을 합치고 — Message-ID 기준 중복 제거는 기본으로 켜져 있습니다 — 요약을 읽습니다.

$ mboxshell merge 2004-2009.mbox 2010-2017.mbox 2018-2026.mbox -o rebuilt.mbox

  Merge complete:
  Input files               3
  Total messages            128,455
  Duplicates removed        0
  Output size               9.41 GiB
  Output file               rebuilt.mbox

Total messages가 원본 개수와 같고 Duplicates removed가 0이면, 두 사실이 합쳐져 당신의 구간들이 빠짐없고 동시에 서로 겹치지 않았음을 말해 줍니다. 즉 모든 메시지가 정확히 한 조각에만 들어 있다는 뜻이죠. 중복이 나오면 범위가 겹친 것이고, 합계가 적으면 무언가가 두 절단 사이로 떨어진 것입니다. 어느 쪽이든 무엇을 지우기 전에 알게 됩니다 — 그게 이 단계의 전부입니다.

거기까지 와서야 원본을 치워도 되겠다는 판단이 섭니다. 그래도 버리지는 마세요. 디스크는 되찾을 수 없는 메일보다 쌉니다.

4단계 — 조각을 썬더버드에 되돌리기

조각들을 썬더버드 안에 별도 폴더로 남기려면, 무료 부가 기능 ImportExportTools NG가 mbox 파일을 로컬 폴더에 새 폴더로 바로 가져옵니다. EML 파일이 담긴 디렉터리도 가져올 수 있어서 mboxShell 경로를 마무리해 줍니다. 파일을 손으로 프로필에 떨어뜨리지 말고, 썬더버드를 켠 채 부가 기능으로 하세요. 그래야 썬더버드가 자기 .msf 색인을 만들고 무엇을 갖고 있는지 알게 됩니다.

조각이 돌아갈 필요가 없다면 — 변호사에게 보낼 1년치, 외장 디스크에 둘 보관본 — 굳이 돌려놓지 않아도 됩니다. 전부 표준 mbox 파일이니까요. Mbox Viewer가 열고, mboxShell이 열고, 20년 뒤에 메일을 읽는 무언가도 열 겁니다. 그 뒤에 등장한 형식 대부분에 대해서는 할 수 없는 말이죠.

하지 말아야 할 것

  • 3단계의 산수가 맞아떨어지기 전에는 원본을 지우지 마세요.
  • split, dd, 텍스트 편집기로 바이트나 줄 단위로 나누지 마세요. 수 기가바이트짜리 메일함은 편집기로 여는 것 자체를 피하세요.
  • 프로필 안에서 원본의 이름을 바꾸거나 옮기지 마세요. 썬더버드는 폴더를 파일 이름으로 식별합니다.
  • 세어 보지 않은 조각을 믿지 마세요. 열리는 파일과 온전한 파일은 같지 않습니다.

Mbox Viewer로 아카이브 열기

네이티브 Mac과 Windows 앱. 크기에 상관없이 MBOX 및 EML 파일을 완전히 오프라인으로 스트리밍합니다.