# Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc)

**URL:** https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773
**Category:** Migrating to Discourse
**Tags:** how-to
**Created:** [2월 4, 2018, 9:08오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773 "2018-02-04T21:08:05Z")
**Posts on this page:** 20
**Page:** 5

<div class="post-metadata">

### Author: ![saulshanabrook](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/saulshanabrook/32/292864_2.png) [@saulshanabrook](https://meta.discourse.org/u/saulshanabrook)
#### Post date: [12월 29, 2022, 3:03오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/220 "2022-12-29T03:03:40Z")

</div>

이 가이드와 가져오기 스크립트를 제공해 주셔서 감사합니다! Google Takeout을 사용해 Google 그룹에서 성공적으로 적용했습니다. 단순히 `.mbox` 파일을 올바른 디렉터리에 넣고 스크립트를 실행하기만 하면 됩니다.

`.mbox`에 존재하지 않는 상위 메일이 있는 메일을 가져오는 것에 대해 질문이 있습니다. 예를 들어, 우리 그룹에는 그룹으로 전송되지 않은 메일의 FWD(전달)로 시작되거나, 대화 중간에 그룹을 회신 목록에 추가하여 참여시킨 스레드가 많습니다.

현재 가져오기를 수행하면 이러한 이전 메일들이 존재하지 않는 것처럼 보입니다. 메일 아이콘을 클릭하여 HTML을 확인하면 찾을 수 있습니다. 다른 분들도 동일한 상황을 겪으셨는지, 그리고 해결책이 있는지 궁금합니다. 게시글에 이전 메일 체인을 포함하거나, 이를 파싱하여 특정 수의 메시지를 추출해 모두 추가하는 방식이 가능할 것 같습니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 29, 2022, 11:19오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/221 "2022-12-29T11:19:05Z")

</div>

인용된 텍스트에서 해당 메시지를 생성하는 방법을 찾아 mbox 파일에 추가해야 합니다(대부분 Id 헤더를 포함하여). 그런 다음 가져오기 스크립트를 실행하세요.

---

<div class="post-metadata">

### Author: ![Andro](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/andro/32/173721_2.png) [@Andro](https://meta.discourse.org/u/Andro)
#### Post date: [3월 1, 2023, 5:27오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/222 "2023-03-01T05:27:07Z")

</div>

정말 훌륭합니다. 하지만 디스코스에 이메일이 들어올 때, 첫 번째 이메일은 정상적으로 표시되지만 같은 게시글 안에 mbox 형식의 답글이 형식 없이 함께 표시되는 문제가 있습니다. 원인이 무엇인지 정확히 알 수 없습니다.

질문은, 대상 디스코스 인스턴스를 삭제하고 다시 생성하지 않고 20년치로 쌓인 모든 가져온 이메일을 삭제하는 방법이 무엇인지입니다.

---

<div class="post-metadata">

### Author: ![Andro](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/andro/32/173721_2.png) [@Andro](https://meta.discourse.org/u/Andro)
#### Post date: [3월 1, 2023, 8:27오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/223 "2023-03-01T08:27:58Z")

</div>

권장 RAM 용량이 8GB라는 점은 알고 있습니다. 2GB 가상 머신에서 20년치 게시글을 가져오기를 시도해 봤는데, 잠시 동안은 작동하다가 'killed’라는 메시지와 함께 크래시 났습니다. DigitalOcean 같은 호스팅 제공업체의 8GB 머신은 (제게는) 비싸거든요. 메모리를 더 적게 쓰면서 이 작업을 수행할 수 있는 방법이 있을까요? 더 작은 배치로 가져오기를 하는 것도 방법일까요?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [3월 2, 2023, 1:38오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/224 "2023-03-02T01:38:02Z")

</div>

> [@Andro](#):
>
> 대상 디스코urs 인스턴스를 삭제하고 다시 생성하지 않고, 가져온 모든 메일(20년치)을 삭제하는 방법은 무엇인가요?

아마도 해당 카테고리를 삭제한 후 관련 주제 커스텀 필드를 삭제하면 될 것입니다.

아니요, 저는 소형 머신에서 상당한 규모의 임포트를 수행하기는 어렵다고 생각합니다. 데스크톱에서 시도해 볼 수는 있지만, 그러면 데이터베이스를 인터넷으로 되돌리기 위한 대역폭 문제가 생깁니다.

---

<div class="post-metadata">

### Author: ![Andro](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/andro/32/173721_2.png) [@Andro](https://meta.discourse.org/u/Andro)
#### Post date: [3월 10, 2023, 12:22오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/225 "2023-03-10T12:22:51Z")

</div>

이 스레드에 활동이 많지 않다는 걸 알고 있지만, 제대로 작동하게 만드는 데 실패하고 있습니다. 가져온 mbox 형식의 이메일 중 많은 부분이 올바르게 분리되지 않습니다. From 줄은 다음과 같이 보입니다:

From MAILER-DAEMON Tue Nov 01 05:57:09 2022

하지만 일부 메시지는 올바르게 가져오진 한 후, 본문 내에 전형적인 From 줄로 시작하는 원시 mbox 형식 항목들이 포함되어 있습니다. 즉, 메시지가 분리되지 않는 것입니다. 분리를 담당하는 정규식(regex)을 수정해야 한다고 생각하지도 않고, Ruby를 모르기 때문에 가져오기 스크립트를 디버깅할 수도 없습니다.

다음으로 어디로 나아가야 할지 모르겠습니다. 가져와야 할 메시지가 20년 치나 되므로, 가져온 메시지를 하나하나 수동으로 확인하여 수정할 수는 없습니다. 결론적으로 이 스크립트가 제 환경에서는 작동하지 않습니다. 왜 저에게만 이런 문제가 발생하는 걸까요?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [3월 10, 2023, 12:44오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/226 "2023-03-10T12:44:36Z")

</div>

> [@Andro](#):
>
> 왜 나한테만 이런 일이 일어나는 걸까?

그렇지 않습니다. 제가 처음 돈을 받고 한 discourse 관련 작업은 몇 달 동안 누군가 이유를 알 수 없이 수동으로 편집한 오래된 mbox 파일들을 정리하는 것이었습니다.

**정말** 정규식(regex)을 수정하거나 잘못된 메시지를 수정할 다른 방법을 찾아야 할 것 같습니다. 한 가지 방법은 다른 도구를 사용해 메시지를 파일당 하나씩 나누는 것입니다.

참고로, 저는 ruby를 배우기 전에 여러 개의 가져오기(import) 스크립트를 작성한 바 있습니다.

모든 가져오기는 고유합니다. 20년 치 데이터를 다룬다면, 과거에 사용된 여러 시스템이 변경되었기 때문에 여러 가지 다른 문제가 발생할 가능성이 높습니다.

---

<div class="post-metadata">

### Author: ![Andro](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/andro/32/173721_2.png) [@Andro](https://meta.discourse.org/u/Andro)
#### Post date: [3월 11, 2023, 3:54오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/227 "2023-03-11T03:54:04Z")

</div>

> [@pfaffman](#):
>
> 모든 임포트는 고유합니다. 20년치 데이터를 다루다 보니, 사용된 다양한 시스템들이 변화하면서 여러 가지 다른 문제가 발생할 가능성이 높습니다.

그렇습니다. 분명히 그렇습니다.

---

<div class="post-metadata">

### Author: ![MikeNolan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mikenolan/32/297597_2.png) [@MikeNolan](https://meta.discourse.org/u/MikeNolan)
#### Post date: [3월 15, 2023, 1:11오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/228 "2023-03-15T01:11:48Z")

</div>

메일맨2(mailman2) 시스템의 20년치 메시지를 아카이브 디렉터리로 가져오려고 합니다. 하지만 많은 구독자들이 이미 떠났거나 세상을 떠났기 때문에, 공간을 차지할 계정을 대량으로 만들고 싶지 않아 사용자 ID(임시 ID 포함)를 생성하지 않으려고 합니다.

모든 메시지를 동일한 사용자 ID(예: ‘archive’) 아래로 가져오는 것이 가능한가요?

또한, 아마도 당연한 질문일 수 있지만, 가져오기 과정에서 앱이 꺼져 있으므로, 새 게시물에 대한 이메일 알림을 신청한 사용자들이 방금 로드된 아카이브에 대한 이메일을 대량으로 받지 않는다는 뜻인가요?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [3월 15, 2023, 12:16오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/229 "2023-03-15T12:16:18Z")

</div>

import\_users 함수를 주석 처리하면 모든 메시지의 소유자가 system이 됩니다.

공간을 많이 절약할 수는 없습니다.

사용자가 비밀번호 찾기 과정을 통해 계정에 로그인하기 전까지는 이메일을 받지 못합니다. 기존 커뮤니티에 이러한 데이터를 가져오는 경우, 가져오기 스크립트가 생성한 새 메시지에 대한 알림을 사용자들이 받게 될 것이라고 생각합니다.

---

<div class="post-metadata">

### Author: ![MikeNolan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mikenolan/32/297597_2.png) [@MikeNolan](https://meta.discourse.org/u/MikeNolan)
#### Post date: [3월 15, 2023, 5:11오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/230 "2023-03-15T17:11:10Z")

</div>

감사합니다. 가져오기 스크립트를 살펴보다가 새 사용자 섹션을 비활성화하는 것만으로 해결될 수 있을 것 같다는 생각이 들었습니다. 이 부분은 테스트할 항목으로 목록에 올려두었습니다.

제가 염려하는 것은 디스크 용량이 아니라, 절대 사용되지 않을 수 있는 수백 개의 대기 상태 사용자 계정입니다. 따라서 저장 공간보다는 사용자 목록이 너무 길어지는 문제, 즉 관리상의 부담에 가깝습니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [3월 15, 2023, 6:52오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/231 "2023-03-15T18:52:03Z")

</div>

사용자에 대해 잘 알고 있지만, 아무도 사용하지 않을 계정이 있는 것이 20년치 메시지를 누가 올렸는지 모르는 것보다 훨씬 낫습니다.

---

<div class="post-metadata">

### Author: ![MikeNolan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mikenolan/32/297597_2.png) [@MikeNolan](https://meta.discourse.org/u/MikeNolan)
#### Post date: [3월 18, 2023, 7:00오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/232 "2023-03-18T19:00:53Z")

</div>

제이, 좋은 지적이네요.

import\_mbox.sh 파일을 찾을 수 없고, mbox.rb 스크립트를 직접 실행하려고 하면 Ruby 오류가 여러 개 나요:

root@lists-import:/var/www/discourse/script/import\_scripts# ruby mbox.rb mbox  
fatal: detected dubious ownership in repository at ‘/var/www/discourse’  
To add an exception for this directory, call:

```
    git config --global --add safe.directory /var/www/discourse

```

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.7/lib/zeitwerk/loader/callbacks.rb:25:in `on\_file\_autoloaded’: expected file /var/www/discourse/lib/freedom\_patches/pluck\_first.rb to define constant FreedomPatches::PluckFirst, but didn’t (Zeitwerk::NameError)

```
  raise Zeitwerk::NameError.new(msg, cref.last)

```

---

<div class="post-metadata">

### Author: ![Adam\_Monago](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/adam_monago/32/299117_2.png) [@Adam\_Monago](https://meta.discourse.org/u/Adam_Monago)
#### Post date: [3월 22, 2023, 3:30오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/233 "2023-03-22T15:30:29Z")

</div>

안녕하세요 여러분. 정말 훌륭한 가이드네요. Gerhard님과 다른 분들의 기여에 감사드립니다.

여기서 Lyris용으로 이 가이드를 적용해 보신 분 계신가요? 과거 설치된 환경을 이식하려는 계획이 있어, 유사한 프로젝트에서 어떤 특별한 고려 사항이나 문제가 있었는지 알고 싶습니다.

---

<div class="post-metadata">

### Author: ![tpokorra](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tpokorra/32/115003_2.png) [@tpokorra](https://meta.discourse.org/u/tpokorra)
#### Post date: [8월 14, 2023, 4:53오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/234 "2023-08-14T16:53:08Z")

</div>

메일링 리스트에서 포스트를 Discourse로 가져와야 했는데, 두 가지 문제에 부딪혔습니다.

- `sqlite3`를 찾을 수 없었습니다.
- `import_mbox.sh`를 찾을 수 없었습니다.

제 해결 방법은 다음과 같습니다:

# sqlite3 설치

`Gemfile`에 다음을 추가했습니다:

```
 gem "sqlite3", "~> 1.3", ">= 1.3.13"

```

그 다음 다음을 실행했습니다:

```
cd discourse
bundle config set frozen false
bundler install

```

# 가져오기 실행

```
cd discourse
RAILS_ENV=production bundle exec rails runner script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml

```

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [8월 14, 2023, 6:27오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/235 "2023-08-14T18:27:03Z")

</div>

> [@tpokorra](#):
>
> 메일링 리스트에서 포스트를 Discourse로 가져와야 했는데, 두 가지 문제에 부딪혔습니다.
> 
> - `sqlite3`를 찾을 수 없었습니다.
> - `import_mbox.sh`를 찾을 수 없었습니다.

[1.2. Docker 컨테이너 준비](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773#h-12-preparing-the-docker-container-3)에서 “일반 가져오기”(Regular import) 뒤에 숨겨져 있는 다음 단계를 놓치신 것 같습니다.

> [@gerhard](#):
>
> 템플릿 목록에 ` - "templates/import/mbox.template.yml"`를 추가하세요.

---

<div class="post-metadata">

### Author: ![Michael\_Sandler](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michael_sandler/32/424958_2.png) [@Michael\_Sandler](https://meta.discourse.org/u/Michael_Sandler)
#### Post date: [7월 1, 2024, 7:52오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/237 "2024-07-01T19:52:21Z")

</div>

`can't modify frozen String` 오류가 발생하고 있습니다. 수정 방법이나 제가 어디서 잘못되고 있는지 알려주실 수 있나요?

```plaintext
root@sajcf:~# /var/discourse/launcher stop app
x86_64 arch detected.
+ /usr/bin/docker stop -t 600 app
app
root@sajcf:~# /var/discourse/launcher enter import
x86_64 arch detected.
root@sajcf-import:/var/www/discourse# import_mbox.sh
The mbox import is starting...

Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...

creating index
indexing files in /shared/import/data/jjcf
indexing /shared/import/data/jjcf/SAJCF.mbox

indexing replies and users

creating categories
/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': can't modify frozen String: "jjcf" (FrozenError)
        from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/mbox.rb:13:in `<module:Mbox>'
        from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'
        from script/import_scripts/mbox.rb:10:in `<main>'

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [7월 2, 2024, 1:08오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/238 "2024-07-02T13:08:44Z")

</div>

그 문제를 해결하는 방법은 구글에서 검색해 볼 수 있습니다. `.dup`을 사용하는 것이 쉬운 방법일 것 같아요.

---

<div class="post-metadata">

### Author: ![User154574](https://avatars.discourse-cdn.com/v4/letter/u/94ad74/32.png) [@User154574](https://meta.discourse.org/u/User154574)
#### Post date: [8월 12, 2024, 1:57오후 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/240 "2024-08-12T13:57:43Z")

</div>

구체적으로 말씀드리면, 447번째 줄에 `.dup`를 추가하여 `/var/www/discourse/script/import_scripts/base.rb` 파일의 코드를 성공적으로 수정했습니다:

```plaintext
params[:name].dup.strip!

```

한 가지 명확하지 않은 점은 멀티사이트 환경에서 특정 사이트로 가져오는 방법입니다.

---

<div class="post-metadata">

### Author: ![Adam\_Skalicky](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/adam_skalicky/32/456821_2.png) [@Adam\_Skalicky](https://meta.discourse.org/u/Adam_Skalicky)
#### Post date: [12월 17, 2024, 6:04오전 UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/241 "2024-12-17T06:04:48Z")

</div>

“frozen String를 수정할 수 없음” 오류를 겪은 사람이 있나요? index.db는 정상적으로 생성되지만 카테고리 생성 단계에서 실패합니다.

```plaintext
root@xxxxxxxxxx:/var/www/discourse# import_mbox.sh

The mbox import is starting...

Loading existing groups...

Loading existing users...

Loading existing categories...

Loading existing posts...

Loading existing topics...

creating index

indexing files in /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com

indexing /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com/export.mbox

indexing replies and users

creating categories

/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': **can't modify frozen String: "xxxxx-xxxxxxx@xxxxxxx.com" (****FrozenError****)**

from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'

from /var/www/discourse/script/import_scripts/base.rb:438:in `each'

from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'

from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'

from script/import_scripts/mbox.rb:13:in `<module:Mbox>'

from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'

from script/import_scripts/mbox.rb:10:in `<main>'

```

[이전 페이지](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773.md?page=4)

[다음 페이지](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773.md?page=6)
