imapsync는 PST 내보내기나 데스크톱 클라이언트, 주말 내내 이어지는 시행착오 없이 IMAP 메일을 옮길 때 쓰는 도구입니다. 문제는 그다음입니다. 잘못된 옵션이나 폴더 매핑, 인증에 대한 오해 하나만으로도 보낸 메일이 누락되고 폴더가 중복되거나 전환 시 새 메일이 삭제될 수 있습니다. 전체 절차부터 필요하다면 imapsync 운영 가이드를 읽으세요.
이 글은 의도적으로 범위를 좁혔습니다. 결과를 실제로 바꾸는 타임아웃, keepalive, 폴더 매핑, 속도 제한, 중복 제거, 활성 사서함을 손상시킬 수 있는 삭제 옵션을 설명합니다. 계정 하나를 옮길 때는 복잡한 재실행을 피하고, 계정 쉰 개를 옮길 때는 보낸편지함이 세 개로 갈라진 이유를 고객에게 설명하는 일을 피할 수 있습니다.
요약하면 imapsync 기본값은 마이그레이션 계획이 아니라 출발점입니다. 실제 이전에는 단계별 작업, 명시적인 폴더 규칙, MX 변경 전 검증이 필요합니다. 대상이 TrekMail이라면 유료 요금제의 내장 가져오기 마법사가 대시보드에서 수신 측을 처리하므로 사서함마다 셸 스크립트를 관리하는 것보다 간편할 수 있습니다. 가격 페이지에 따르면 TrekMail은 $3.50/month부터이며 사용자별 과금 대신 공유 스토리지를 사용하고 Gmail, Outlook, Yahoo, iCloud 및 일반 IMAP의 서버 측 가져오기를 지원합니다.
운영자가 기본값을 믿을 때 imapsync가 실패하는 이유
imapsync는 단순 파일이 아니라 실행 중인 IMAP 저장소 사이에서 메일을 복사합니다. 네트워크가 세션을 끊을 수 있는 동안 서로 다른 폴더 구조, 서버 특성, 메시지 식별자, 인증 모델을 처리해야 합니다. 그래서 안전한 명령은 포럼의 예제보다 명시적입니다.
일반적인 실패는 예측 가능하고 비용이 큽니다.
- 대용량 메시지 업로드가 타임아웃됩니다.
- 폴더 이름이 잘못 매핑되어 메일이 사라진 것처럼 보입니다.
- 공급업체가 작업을 제한하고 연결을 거부합니다.
- 최신 인증이 일반 비밀번호를 차단합니다.
- UID 상태 변경으로 이후 작업에 중복이 생깁니다.
- `--delete2`가 전환 후 대상의 새 메일을 삭제합니다.
“Sent Items만 빼고 거의 정상”이었던 이전은 우연이 아닙니다. 프로토콜이 그런 결과를 허용했고 기본값이 보호하지 못한 것입니다.
imapsync 연결을 유지하는 옵션
대형 사서함에서는 메시지 쓰기가 끝나기 전에 연결이 끊겨 실패하는 경우가 많습니다. 긴 APPEND, 느린 Exchange, 상태 저장 방화벽이 흔한 원인입니다. 타임아웃 허용치를 늘리고 keepalive를 보내며 상태를 캐시해 재실행이 처음부터 시작되지 않게 하세요.
첫 번째 본 작업에 다음 옵션을 사용합니다.
imapsync \
--host1 imap.source.tld --user1 user@source.tld --passfile1 ./pass1 \
--host2 imap.dest.tld --user2 user@dest.tld --passfile2 ./pass2 \
--timeout 120 \
--keepalive1 --keepalive2 \
--usecache
각 옵션의 역할은 다음과 같습니다.
| 옵션 | 중요한 이유 | 없을 때의 문제 |
|---|---|---|
--timeout 120 | 느린 업로드와 큰 첨부 파일에 완료 시간을 줍니다. | 소켓 타임아웃 후 메시지가 건너뛰어집니다. |
--keepalive1 --keepalive2 | 긴 유휴 시간에도 두 IMAP 세션을 유지합니다. | 방화벽이나 로드 밸런서가 세션을 끊습니다. |
--usecache | 비교 상태를 로컬에 저장해 재실행을 단축합니다. | 재개가 느려지고 모든 항목을 다시 확인합니다. |
캐시는 생각보다 중요합니다. 좋은 이전은 증분 방식입니다. 대량 작업 후 인증이나 매핑을 고치고 한두 번 보완합니다. `--usecache`가 있으면 양쪽을 다시 읽는 시간이 줄지만, 없으면 매번 불필요하게 무거워집니다.
주의할 점도 있습니다. 공식 문서는 `--usecache`가 크기 및 기간 필터 조합과 일부 상황에서 안전하지 않다고 경고합니다. 효율적으로 보인다는 이유로 임의의 필터를 쌓지 마세요. 첫 작업은 단순하게 유지합니다.
“폴더 누락” 혼란을 막는 매핑 옵션
imapsync가 폴더를 잃었다고 해도 메일은 남아 있는 경우가 많습니다. 대상이 경로를 다르게 해석했거나 현지화된 특수 폴더가 활성 보낸편지함에 매핑되지 않은 것입니다. 공급업체의 방식이 다르면 명시적 변환이 필요합니다.
큰 함정은 계층 구분자와 특수 폴더입니다.
어떤 서버는 점을, 다른 서버는 슬래시를 사용합니다. 원본이 INBOX.Clients.ProjectA이고 대상이 INBOX/Clients/ProjectA를 요구하면 복사 중 경로를 변환해야 합니다.
imapsync \
--host1 old.example.com --user1 user@old.example.com --passfile1 ./pass1 \
--host2 imap.trekmail.net --user2 user@example.com --passfile2 ./pass2 \
--regextrans2 's/\./\//g'
보낸편지함도 문제입니다. 공급업체마다 이름은 다르지만 사용자는 활성 보낸편지함에서 메일을 보길 원합니다.
| 원본 폴더 | 대상 폴더 | 유용한 옵션 |
|---|---|---|
[Gmail]/Sent Mail | Sent Items | --regextrans2 's/^\[Gmail\]\/Sent Mail/Sent Items/' |
Sent | Sent Items | --regextrans2 's/^Sent/Sent Items/' |
Gesendete Elemente | Sent Items | --regextrans2 's/^Gesendete Elemente/Sent Items/' |
표준 특수 폴더에는 먼저 --automap을 시도하세요. 오래되고 현지화되었거나 복잡한 cPanel 사서함에는 명시적 regex 변환이 더 안전합니다. TrekMail 문서에는 대시보드에서 가져오기 시작과 도메인 추가도 설명되어 있습니다.
개념적 예: 폴더가 사라진 것이 아니라 사용자가 기대한 보낸편지함에서 클라이언트가 “보낸편지함”으로 취급하지 않는 원시 보관 폴더로 이동했습니다. 같은 데이터가 잘못된 곳에 있고 지원 요청은 그대로 생깁니다.
Google이나 Microsoft가 제한하기 전에 imapsync 속도 제한하기
호스팅 공급업체는 imapsync를 악성 트래픽처럼 볼 수 있습니다. 여러 사서함의 APPEND와 FETCH 요청이 몰리면 속도 제어, 임시 중지, 인증 오류처럼 보이는 용량 제한이 발생합니다. 차단되는 것보다 일정하게 천천히 처리하는 편이 빠를 수 있습니다.
Google Workspace나 Microsoft 365에서는 속도를 제어하세요.
imapsync \
--host1 imap.gmail.com --user1 user@source.tld --passfile1 ./pass1 \
--host2 imap.trekmail.net --user2 user@dest.tld --passfile2 ./pass2 \
--maxbytespersecond 500000 \
--maxmessagespersecond 2
공급업체 방어를 일으키는 처리량 급증을 줄이고 작은 메시지 폭주가 공유 환경을 과부하시키는 일을 막습니다. 오래된 cPanel과 바쁜 Office 365 환경에서 중요합니다.
숫자를 절대 기준으로 보지 말고 시작값으로 사용하세요. 적절한 한도는 크기, 동시 실행 수, 공급업체 정책에 달려 있습니다. 처음엔 정상이다가 간헐적 실패가 생기면 비밀번호를 의심하기 전에 속도를 낮추세요.
여기서 기존 방식과 새 방식의 차이도 드러납니다.
기존 방식: 사서함마다 스크립트를 만들고 시행착오로 속도를 조정하며 새벽 2시에 실패를 지켜봅니다.
새 방식: 수신 측에 TrekMail 유료 요금제의 서버 가져오기를 사용하고 대상을 표준화하며 사용자별 요금을 피합니다. 여러 도메인을 다루는 대행사는 사서함 하나를 십 분 일찍 끝내는 것보다 재시도를 사흘 동안 분석하지 않는 것을 중시합니다. 다중 도메인 이메일 호스팅 가이드를 참고하세요.
2025-2026 인증 옵션: 비밀번호 대신 OAuth
Google Workspace와 Microsoft 365에서는 일반 사용자 이름과 비밀번호가 IMAP에서 작동한다고 가정할 수 없습니다. Google은 May 1, 2025부터 Workspace 계정에서 사용자 이름과 비밀번호만 쓰는 “보안 수준이 낮은 앱”을 지원하지 않는다고 안내합니다. Exchange Online도 IMAP 클라이언트에 OAuth를 안내합니다.
따라서 XOAUTH2를 지원하는 원본에는 일반 비밀번호 대신 액세스 토큰이 필요합니다.
imapsync \
--host1 outlook.office365.com \
--user1 user@source.tld \
--authmech1 XOAUTH2 \
--oauthaccesstoken1 "ACCESS_TOKEN" \
--host2 imap.trekmail.net \
--user2 user@dest.tld --passfile2 ./pass2
Google Workspace에서는 2-Step Verification이 켜진 일회성 이전에 앱 비밀번호를 사용할 수 있습니다. Microsoft 365에서는 문서화된 기존 프로토콜용 OAuth를 사용하세요. “비밀번호가 맞으면 인증도 된다”는 전제는 현실과 맞지 않습니다.
공식 자료: Google의 보안 수준이 낮은 앱 지침, Microsoft의 IMAP OAuth 지침.
손상된 메일 누락을 줄이는 무결성 옵션
오래된 서버에는 손상된 메시지가 있습니다. 누락된 Message-ID, 잘못된 MIME, 대형 첨부 파일, 빈 본문이 실제 이전에서 나타납니다. imapsync는 설정에 따라 일부를 처리할 수 있습니다.
--addheader는 메시지에 헤더가 없을 때 생성한 Message-Id를 추가합니다. 메시지 식별 정보는 기존 항목 판단에 중요합니다.
--maxsize는 대상이 거부하는 대형 메시지 하나가 전체 작업을 막지 않게 합니다.
imapsync \
--host1 old.example.com --user1 user@old.example.com --passfile1 ./pass1 \
--host2 imap.trekmail.net --user2 user@example.com --passfile2 ./pass2 \
--addheader \
--maxsize 35000000
대형 메시지를 무시하려는 것이 아니라 99%를 먼저 옮긴 뒤 예외 목록을 통해 나머지를 수동 처리하는 것입니다.
여러 사서함을 동시에 이전한다면 일관된 계정 생성 절차도 필요합니다. 생성, 비밀번호 전달, DNS 변경이 서로 다른 스프레드시트에서 진행되면 문제가 커지므로 이메일 계정 일괄 생성 가이드를 참고하세요.
가장 큰 데이터 손실을 일으키는 옵션: --delete2
`--delete2`는 원본에 없는 메시지를 대상에서 지웁니다. 정확한 미러링에는 유용해 보이지만, 잘못된 시점에 실행하면 MX 전환 후 도착한 정상 메일을 삭제할 수 있습니다.
실패 순서는 다음과 같습니다.
- 기존 메일을 대상에 미리 복사합니다.
- 새 공급업체로 MX를 바꿉니다.
- 새 메일이 대상에 도착합니다.
--delete2로 imapsync를 다시 실행합니다.- 원본에 없던 대상 전용 메일을 삭제합니다.
버그가 아니라 지시한 대로 작동한 것입니다.
`--delete2`는 전환 전의 통제된 미러링에서만 사용하세요. MX 변경 후에는 명령에서 빼고, 메일을 받는 대상을 새 메일의 기준으로 취급합니다.
UID가 신뢰할 수 없을 때 헤더 기반 비교 사용
IMAP UID는 해당 서버 상태 안에서만 신뢰할 수 있습니다. RFC 3501이 UIDVALIDITY를 정의하는 이유도 상태 변경 시 UID 전제가 깨질 수 있기 때문입니다. 폴더가 재구축되거나 재인덱싱되면 imapsync가 모든 메시지를 새 것으로 보고 중복시킬 수 있습니다.
이때 헤더 기반 비교가 도움이 됩니다.
imapsync \
--host1 old.example.com --user1 user@old.example.com --passfile1 ./pass1 \
--host2 imap.trekmail.net --user2 user@example.com --passfile2 ./pass2 \
--useheader 'Message-Id'
서버 UID를 믿는 것보다 느리지만 불안정하거나 재구축된 원본에는 더 안전합니다. 공식 문서는 중복 문제에 --useheader "Message-Id"가 도움이 될 수 있다고 설명합니다.
최종 검증에는 DNS 전환 전 보수적인 시험 실행과 사용자가 기존 시스템 변경을 멈춘 뒤의 짧은 증분 실행이 적합합니다.
안전한 imapsync 명령 예시
안전한 명령은 연결, 매핑, 제외, 시험 모드를 명시합니다. 시험 실행으로 폴더 동작을 확인한 뒤 실제로 실행하세요. 초안 명령을 운영 메일에 적용하지 마세요.
imapsync \
--host1 imap.gmail.com --user1 user@source.com --passfile1 ./pass1 \
--host2 imap.trekmail.net --user2 user@dest.com --passfile2 ./pass2 \
--timeout 120 --keepalive1 --keepalive2 \
--usecache \
--automap \
--regextrans2 's/^\[Gmail\]\/Sent Mail/Sent Items/' \
--exclude '^\[Gmail\]/All Mail' \
--maxbytespersecond 500000 \
--maxmessagespersecond 2 \
--dry
실용적인 참고 사항 세 가지:
- 항상
--dry부터 사용합니다. - 첫 작업에서는 필요 없는 대형 보관 폴더를 제외합니다.
- 로그를 보관하고 이전 묶음별 명령을 버전 관리합니다.
TrekMail로 이전된 뒤에는 imap.trekmail.net의 포트 993에서 표준 IMAP으로 연결합니다. TrekMail은 POP3가 아닌 IMAP을 사용해 기기 간 상태 동기화에 적합합니다.
결론: imapsync를 마이그레이션 도구처럼 운영하면 잘 작동한다
imapsync는 상태를 다루는 이전 소프트웨어로 취급할 때 여러 이메일 이전에 적합합니다. 타임아웃과 keepalive를 설정하고, 폴더를 의도대로 매핑하고, 제한 시 속도를 낮추고, 최신 인증을 사용하세요. 전환 후에는 `--delete2`를 피하고 UID 상태가 불확실하면 헤더로 비교합니다.
수신 측 관리를 간소화하려면 TrekMail의 다중 도메인 대상, 고정 요금, 공유 스토리지, 유료 요금제의 서버 가져오기를 활용할 수 있습니다. 사서함 추가마다 사용자별 비용이 늘지 않습니다. 이전 후 운영 기준으로 비즈니스 이메일 글도 읽어 보세요.