메일을 잃지 않고 거대한 썬더버드 메일함 파일을 나누는 방법
썬더버드의 폴더는 mbox 파일 하나입니다. 15년이 지나면 처음 담겼던 디스크보다 무거워지죠. Mbox Viewer로, 그리고 오픈소스 터미널 도구 mboxShell로 이 파일을 더 작은 메일함으로 자르는 방법과, 무엇보다 단 한 통도 사라지지 않았음을 나중에 증명하는 방법을 정리했습니다.
썬더버드의 폴더는 폴더가 아닙니다. 지금까지 받은 모든 메시지가 도착한 순서대로 하나씩 이어 붙은, 단 하나의 파일입니다. 이 설계는 놀라울 만큼 잘 늙었습니다 — 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 형식입니다. (더 자세한 안내는 macOS와 Windows 가이드에 있습니다.)
무엇이든 건드리기 전에 세 가지 규칙이 있습니다.
썬더버드를 종료하세요. 썬더버드는 파일을 열어 둔 채 계속 씁니다. 지금도 메시지가 덧붙고 있는 메일함을 나누면 끝에 반쪽 메시지가 남기 마련입니다.
사본으로 작업하세요. 메일함 파일을 다른 곳으로 — 바탕화면이면 충분합니다 — 복사한 뒤 사본을 나누세요. 원본을 프로필 밖으로 옮기면 안 됩니다. 썬더버드는 그 폴더가 사라졌다고 판단합니다.
먼저 압축하거나, 무엇을 가져가는지 알고 계세요. 메시지를 지워도 썬더버드는 표시만 하고 파일 안에 남겨 둡니다. 바이트가 사라지는 건 폴더를 압축(정리)할 때입니다. 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)에서 나누기는 이미 알고 있는 내보내기 그 자체입니다.
- 복사한 메일함 파일을 엽니다 — 확장자 없는 그대로, 이름을 바꿀 필요 없습니다.
- 구간을 검색합니다:
after:2004-01-01 before:2010-01-01. - 메시지를 선택합니다: 첫 줄을 클릭하고 마지막 줄을 Shift+클릭하면 범위 전체가 잡힙니다.
- 파일 → 내보내기(⌘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 파일을 완전히 오프라인으로 스트리밍합니다.