# Migrar uma lista de emails para 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:** [Fevereiro 4, 2018, 9:08pm 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:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [Fevereiro 4, 2018, 9:08pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/1 "2018-02-04T21:08:05Z")

</div>

This guide is for you if you want to migrate a **mailing list** to Discourse.  
It also contains instructions for importing messages from ![image](https://global.discourse-cdn.com/meta/original/3X/7/1/71e733e16db2fef760daff318565e01038c3d42b.png) **Google Groups**.

# 1. Importing using Docker container

This is the recommended way for importing content from your mailing lists into Discourse.

### 1.1. Installing Discourse

> 💡 The import script most likely won’t work on systems with less than 4GB of RAM. Recommended are 8GB of RAM or more. You can scale back the RAM usage after the import if you like.

Install Discourse by following the [official installation guide](https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md). Afterwards it’s a good idea to go to the Admin section and configure a few settings:

- Enable `login_required` if imported topics shouldn’t be visible to the public

- Enable `hide_user_profiles_from_public` if user profiles shouldn’t be visible to the public.

- Disable `download_remote_images_to_local` if you don’t want Discourse to download images embedded in posts.

- Enable `disable_edit_notifications` if you enabled `download_remote_images_to_local` and don’t want your users to get lots of notifications about posts edited by the system user.

- Change the value of `slug_generation_method` if most of the topic titles use characters which shouldn’t be mapped to ASCII (e.g. Arabic). See [this post](https://meta.discourse.org/t/removing-the-concept-of-slugs-for-some-languages/26643/16) for more information.

> ‼ The following steps assume that you installed **Discourse on Ubuntu** and that you are connected to the machine via SSH or have direct access to the machine’s terminal.

### 1.2. Preparing the Docker container

Copy the container configuration file `app.yml` to `import.yml` and edit it with your favorite editor.

```bash
cd /var/discourse
cp containers/app.yml containers/import.yml
nano containers/import.yml

```

> **Regular import**
>
> Add ` - "templates/import/mbox.template.yml"` to the list of templates. Afterwards it should look something like this:
> 
> ```yaml
> templates:
> - "templates/postgres.template.yml"
> - "templates/redis.template.yml"
> - "templates/web.template.yml"
> - "templates/web.ratelimited.template.yml"
> ## Uncomment these two lines if you wish to add Lets Encrypt (https)
> #- "templates/web.ssl.template.yml"
> #- "templates/web.letsencrypt.ssl.template.yml"
> - "templates/import/mbox.template.yml"
> 
> ```
> 
> That’s it. You can save the file, close the editor and build the container.

> **Google Groups import**
>
> You need to add two entries to the list of templates:
> 
> ```yaml
> - "templates/import/chrome-dep.template.yml"
> - "templates/import/mbox.template.yml"
> 
> ```
> 
> Afterwards it should look something like this:
> 
> ```yaml
> templates:
> - "templates/postgres.template.yml"
> - "templates/redis.template.yml"
> - "templates/web.template.yml"
> - "templates/web.ratelimited.template.yml"
> ## Uncomment these two lines if you wish to add Lets Encrypt (https)
> #- "templates/web.ssl.template.yml"
> #- "templates/web.letsencrypt.ssl.template.yml"
> - "templates/import/chrome-dep.template.yml"
> - "templates/import/mbox.template.yml"
> 
> ```
> 
> That’s it. You can save the file, close the editor and build the container.

```bash
/var/discourse/launcher stop app
/var/discourse/launcher rebuild import

```

Building the container creates an `import` directory within the container’s shared directory. It looks like this:

```plaintext
/var/discourse/shared/standalone/import
├── data
└── settings.yml

```

### 1.3. Downloading messages from Google Groups (optional)

You can skip this step unless you want to migrate from ![image](https://global.discourse-cdn.com/meta/original/3X/7/1/71e733e16db2fef760daff318565e01038c3d42b.png) Google Groups.

> **Instructions for Google Groups**
>
> #### 1.3.1. Preparation
> 
> > ⚠ Make sure you don’t have any pinned posts in your group, otherwise the crawler might fail to download some or all messages.
> 
> > ⚠ Make sure the group settings allow posting, otherwise you might see “Failed to scrape message” error messages. It might take a couple of minutes before the scraping works when you changed those settings recently.
> > 
> > ![image](https://global.discourse-cdn.com/meta/original/3X/e/5/e56607062bc18de0a7bb8256df5a663f29efdd92.png)
> 
> **Google account** : You need a Google account that has the [Manager or Owner role](https://support.google.com/groups/answer/2464975) for your Google Group, otherwise the downloaded messages will contain censored email addresses.
> 
> **Group name** : You can find the group name by visiting your Google Group and looking at the browser’s address bar. ![image](https://global.discourse-cdn.com/meta/original/3X/7/e/7ed38d0ca4694545d4e45ecb84cafb0e68246a58.png)
> 
> **Domain name** : The URL might look a little bit differently if you are a G Suite customer. You need to know the domain name if the URL contains something like `example.com`. ![image](https://global.discourse-cdn.com/meta/original/3X/9/0/90d1af89b67857ab34e45af9ea5c9aebfa0ec216.png)
> 
> #### 1.3.2 Cookies 🍪
> 
> In order to download messages, the crawler needs to have access to a Google account that has the owner role for your group. Please visit [https://myaccount.google.com/](https://myaccount.google.com/) in your browser and sign in if you aren’t already logged in. Then use a browser extension of your choice to export your cookies for `google.com` in a file named `cookies.txt`.
> 
> The recommended browser extensions is [Export Cookies](https://addons.mozilla.org/en-US/firefox/addon/export-cookies-txt/) for Mozilla Firefox.
> 
> ![cookies.txt in Firefox](https://global.discourse-cdn.com/meta/original/3X/6/6/66c6799aba8d4b13e80ed8bb52561cafd4befe1f.png)
> 
> Upload the `cookies.txt` file to your server and save it within the `/var/discourse/shared/standalone/import` directory.
> 
> #### 1.3.3. Download messages
> 
> > 💡 **Tip** : It’s a good idea to download messages inside a [tmux](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-tmux-on-ubuntu-12-10--2) or [screen](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-screen-on-an-ubuntu-cloud-server) session, so that you can reconnect to the session in case of SSH connection loss.
> 
> Let’s start by entering the Docker container.
> 
> ```bash
> /var/discourse/launcher enter import
> 
> ```
> 
> Replace the `<group_name>` (and if applicable, the `<domain_name>`) placeholders within the following command with the group name and domain name from step 1.3.1 and execute it inside the Docker container in order to start the download of messages.
> 
> If you didn’t find a domain name in step 1.3.1, this is the command for you:
> 
> ```bash
> script/import_scripts/google_groups.rb -g <group_name>
> 
> ```
> 
> Or, if you found a domain name in step 1.3.1, use this command instead:
> 
> ```bash
> script/import_scripts/google_groups.rb -g <group_name> -d <domain_name>
> 
> ```
> 
> Downloading all messages can take a long time. It mostly depends on the number of topics in your Google Group. The script will show you a message like this when it’s finished: _Done (00h 26min 52sec)_
> 
> > 💡 **Tip** : You can abort the download anytime you want by pressing Ctrl+C  
> > When you restart the download it will continue where it left off.

### 1.4. Configuring the importer

You can configure the importer by editing the example `settings.yml` file that has been copied into the `import` directory.

```bash
nano /var/discourse/shared/standalone/import/settings.yml

```

The [settings file](https://github.com/discourse/discourse/blob/master/script/import_scripts/mbox/settings.yml) comes with sensible defaults, but here are a few tips anyway:

- The settings file contains multiple examples on how to split data files:

- `prefer_html` allows you to configure if the import should use the HTML part of emails when it exists. You should choose what suits you best – it heavily depends on the emails sent to your mailing list.

- By default each user imported from the mailing list is created as staged user. You can disable that behaviour by setting `staged` to `false`.

- If your emails do not contain a `Message-ID` header (like messages stored by Listserv), you should enable the `group_messages_by_subject` setting.

### 1.5. Prepare files

Each subdirectory of `/var/discourse/shared/standalone/import/data` gets imported as its own category and each directory should contain the data files you want to import. The file names of those do not matter.

Example: The `import` directory should look like this if you want to import two mailing lists with multiple mbox files:

```plaintext
/var/discourse/shared/standalone/import
├── data
│ ├── list 1
│ │ ├── foo
│ │ ├── bar
│ ├── list 2
│ │ ├── 2017-12.mbox
│ │ ├── 2018-01.mbox
└── settings.yml

```

### 1.6. Executing the import script

> 💡 **Tip** : It’s a good idea to start the import inside a [tmux](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-tmux-on-ubuntu-12-10--2) or [screen](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-screen-on-an-ubuntu-cloud-server) session, so that you can reconnect to the session in case of SSH connection loss.

Let’s start the import by entering the Docker container and launching the import script inside the Docker container.

```bash
/var/discourse/launcher enter import
import_mbox.sh # inside the Docker container

```

Depending on the size of your mailing lists it’s now time for some ☕ or 😴  
The import script will show you a message like this when it’s finished: _Done (00h 26min 52sec)_

> 💡 **Tip** : You can abort the import anytime you want by pressing Ctrl+C  
> When you restart the import it will continue where it left off.

You can exit and stop the Docker container after the import has finished.

```bash
exit # inside the Docker container
/var/discourse/launcher stop import

```

### 1.7. Starting Discourse

Let’s start the app container and take a look at the imported data.

```bash
/var/discourse/launcher start app

```

Discourse will start and _Sidekiq_ will begin post-processing all the imported posts. This can take a considerate amount of time. You can watch the progress by logging in as admin and visiting `http://discourse.example.com/sidekiq`

### 1.8. Clean up

So, you are satisfied with the result of the import and want to free some disk space? The following commands will delete the Docker container used for importing as well as all the files used during the import.

```bash
/var/discourse/launcher destroy import
rm /var/discourse/containers/import.yml
rm -R /var/discourse/shared/standalone/import

```

### 1.9. The End

Now it’s time to celebrate and enjoy your new Discourse instance! 🎉

# 2. FAQ

#### 2.1. How can I remove list names (e.g. `[Foo]`) from topic titles during the import?

You can use an empty tag to remove one or more prefixes from topic titles. The [settings file](https://github.com/discourse/discourse/blob/master/script/import_scripts/mbox/settings.yml) contains an example.

#### 2.2 How can I prevent the import script from detecting messages as already being imported?

⚠ The following steps will reset your Discourse forum to the initial state! You will need to start from scratch.

The following commands will stop the container, **delete everything** except the mbox files and the importer configuration and restart the container.

> **Commands**
>
> ```bash
> cd /var/discourse
> 
> ./launcher stop app
> ./launcher stop import
> 
> rm -r ./shared/standalone/!(import)
> rm ./shared/standalone/import/data/index.db
> 
> ./launcher rebuild import
> 
> ./launcher enter import
> import_mbox.sh # inside the Docker container
> 
> ```

#### 2.3 How can I manipulate messages before they are imported into Discourse?

Enable `index_only` in `settings.yml` and take a look at the `index.db` (a SQLite database) before you run the actual import.

You can use SQL to update missing values in the database if you want. That way you don’t need to reindex any messages. The script uses only data from the `index.db` during the import phase. Simply disable the `index_only` option when you are done and rerun the importer. It will skip the indexing if none of the mbox files were changed, recalculate the content of the `user` and `email_order` tables and start the actual import process.

#### 2.4 How can I find messages which cause problems during the import?

You can split mbox files into individual files to make it easier to find offending emails.

> **Commands**
>
> ```bash
> apt install procmail;
> export FILENO=0000;
> formail -ds sh -c 'cat &gt; split/msg.$FILENO' < mbox;
> 
> ```

#### 2.5 I have already imported a group. How can I import another group?

Create a new directory in the `import/data` directory and restart the import script.

#### 2.6 I don’t have access to Mailman archives in mbox format? Is there any other way to get them?

You could give [this script](https://mail.python.org/pipermail/mailman-users/2012-October/074208.html) a try.

> Last edited by @JammyDodger 2024-05-27T14:56:11Z
> 
> > **Check document**
> >
> > Perform check on document:

---

<div class="post-metadata">

### Author: ![ravenzachary](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ravenzachary/32/163227_2.png) [@ravenzachary](https://meta.discourse.org/u/ravenzachary)
#### Post date: [Dezembro 6, 2019, 8:26pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/133 "2019-12-06T20:26:01Z")

</div>

@gerhard - Consegui migrar um arquivo mbox com 22.000 mensagens usando este script em um droplet da Digital Ocean com apenas 1 GB de RAM. Sem problemas. Obrigado pelo tutorial com as instruções. Tudo funcionou perfeitamente. O único erro que cometi na primeira tentativa foi tentar nomear a subpasta /var/discourse/shared/standalone/import/data/X com uma nova categoria que criei antes de executar o script. Isso fez com que as mensagens fossem importadas para a categoria “Sem categoria”. Na segunda tentativa, excluí a nova categoria e tentei novamente. Isso criou o nome da categoria para mim e colocou as mensagens automaticamente na categoria correta.

---

<div class="post-metadata">

### Author: ![Jeremias\_Volker](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jeremias_volker/32/162032_2.png) [@Jeremias\_Volker](https://meta.discourse.org/u/Jeremias_Volker)
#### Post date: [Março 13, 2020, 9:22am UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/142 "2020-03-13T09:22:31Z")

</div>

Obrigado por este guia.

Estou tentando fazer uma importação do Google Groups. Infelizmente, recebo este erro ao executar `import_mbox.sh`:

```
A importação do mbox está começando...

Traceback (most recent call last):
5: from script/import_scripts/mbox.rb:9:in `<main>'
4: from script/import_scripts/mbox.rb:10:in `<module:ImportScripts>'
3: from script/import_scripts/mbox.rb:13:in `<module:Mbox>'
2: from /var/www/discourse/script/import_scripts/mbox/support/settings.rb:9:in `load'
1: from /var/www/discourse/script/import_scripts/mbox/support/settings.rb:9:in `new'

/var/www/discourse/script/import_scripts/mbox/support/settings.rb:42:in `initialize': undefined method `each' for nil:NilClass (NoMethodError)

```

Todos os arquivos em `/var/discourse/shared/standalone/import/data/Foo` são arquivos `.eml`, e não `mbox`. Isso faz diferença?

Obrigado!

---

<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: [Março 18, 2020, 4:33pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/143 "2020-03-18T16:33:46Z")

</div>

A versão mais recente do script de importação corrige esse problema. Como alternativa, atualize seu [arquivo de configurações](https://github.com/discourse/discourse/blob/master/script/import_scripts/mbox/settings.yml). Houve algumas alterações recentes.

---

<div class="post-metadata">

### Author: ![Jeremias\_Volker](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jeremias_volker/32/162032_2.png) [@Jeremias\_Volker](https://meta.discourse.org/u/Jeremias_Volker)
#### Post date: [Março 19, 2020, 9:31am UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/144 "2020-03-19T09:31:05Z")

</div>

Muito obrigado. Poderia, por favor, dar algumas dicas sobre como atualizar o script de importação?

Basta apenas atualizar os scripts de importação ou preciso refazer mais etapas do guia (quais)? Não consigo encontrá-los e, por isso, não sei como atualizá-los.

Atualizei o arquivo de configurações, como você mencionou ser uma alternativa, mas estou enfrentando os mesmos problemas.

Obrigado.

---

<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: [Março 19, 2020, 12:39pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/145 "2020-03-19T12:39:09Z")

</div>

Você pode executar `/var/discourse/launcher rebuild import` para atualizar o script de importação e tudo o mais relacionado a ele.

---

<div class="post-metadata">

### Author: ![Jeremias\_Volker](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jeremias_volker/32/162032_2.png) [@Jeremias\_Volker](https://meta.discourse.org/u/Jeremias_Volker)
#### Post date: [Março 19, 2020, 5:18pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/146 "2020-03-19T17:18:09Z")

</div>

Obrigado.

Ao executar `import_mbox.sh`, quase todas as mensagens são ignoradas com mensagens como a seguinte:

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

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

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

41 / 215 ( 19.1%) [59096 itens/min] Falha ao mapear a postagem para 36a37072-e5b6-4009-878f-f0824e40eac6@googlegroups.com

método indefinido `each' para nil:NilClass

/var/www/discourse/script/import_scripts/mbox/importer.rb:179:in `block in remove_tags!'

/var/www/discourse/script/import_scripts/mbox/importer.rb:176:in `loop'

/var/www/discourse/script/import_scripts/mbox/importer.rb:176:in `remove_tags!'

/var/www/discourse/script/import_scripts/mbox/importer.rb:150:in `map_first_post'

/var/www/discourse/script/import_scripts/mbox/importer.rb:104:in `block (2 levels) in import_posts'

/var/www/discourse/script/import_scripts/base.rb:503:in `block in create_posts'

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

/var/www/discourse/script/import_scripts/base.rb:502:in `create_posts'

/var/www/discourse/script/import_scripts/mbox/importer.rb:98:in `block in import_posts'

/var/www/discourse/script/import_scripts/base.rb:882:in `block in batches'

/var/www/discourse/script/import_scripts/base.rb:881:in `loop'

/var/www/discourse/script/import_scripts/base.rb:881:in `batches'

/var/www/discourse/script/import_scripts/mbox/importer.rb:84:in `batches'

/var/www/discourse/script/import_scripts/mbox/importer.rb:92:in `import_posts'

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

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

```

E mais abaixo:

`60 / 215 ( 27.9%) [58321 itens/min] A mensagem pai 1b46f337-95a3-4b4a-a14a-689636941580@googlegroups.com não existe. Ignorando 5634208e-e6df-4bd8-b361-0735f73fe554@googlegroups.com:`

Qual poderia ser o motivo disso? Obrigado.

---

<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: [Março 26, 2020, 4:24pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/147 "2020-03-26T16:24:41Z")

</div>

O problema deve ter sido corrigido. Por favor, reconstrua seu contêiner de importação mais uma vez.

---

<div class="post-metadata">

### Author: ![Jeremias\_Volker](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jeremias_volker/32/162032_2.png) [@Jeremias\_Volker](https://meta.discourse.org/u/Jeremias_Volker)
#### Post date: [Março 26, 2020, 5:13pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/148 "2020-03-26T17:13:28Z")

</div>

Legal, funcionou perfeitamente. 🙏 Muito obrigado pelo seu apoio.

---

<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: [Abril 8, 2020, 9:25pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/149 "2020-04-08T21:25:55Z")

</div>

Estou tentando baixar o Google Groups e estou recebendo:

```
Falha no login. Verifique o conteúdo do seu cookies.txt

```

Usei a extensão recomendada do Firefox para baixar os cookies. Fiz isso ontem e novamente hoje. Confirmei que o arquivo está sendo lido ao renomeá-lo para algo errado e recebendo um erro de “não encontrado”. Baixei todos os cookies, não apenas os do Google. Saí e entrei novamente e baixe os cookies de novo.

Posso ver que sou um administrador, pois tenho as opções “gerenciar grupo”.

Confirmei três vezes que estou usando o nome correto do grupo, copiando e colando e verificando que é um formato de nome de grupo e não de domínio.

Algo está quebrado ou sou só eu?

@gerhard, desculpe chamar sua atenção, mas você tem alguma sugestão rápida sobre como depurar isso? Talvez um endpoint de login tenha mudado?

EDIT: Encontrei. Vou enviar um PR em breve. O endpoint de login mudou e consegui adivinhar o novo. 🙂

> <https://github.com/discourse/discourse/pull/9432>
>
> I'm not clear why changing only the \`wait\_for\_url\` address was necessary and not… also the \`get\` a few lines above, but this change seems to work for me on both literatecomputing.com Groups and a public group.

---

<div class="post-metadata">

### Author: ![sturdy2](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sturdy2/32/138218_2.png) [@sturdy2](https://meta.discourse.org/u/sturdy2)
#### Post date: [Abril 16, 2020, 8:40pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/150 "2020-04-16T20:40:51Z")

</div>

Novato tentando importar arquivos mbox de grupos do Yahoo. Segui estas instruções várias vezes, mas sempre com a mesma mensagem de erro. Vejo que outros tiveram sucesso, então provavelmente é um erro de iniciante. O erro parece indicar que `split_regex: "^From .+@.+"` não está encontrando a chave de e-mail para dividir o arquivo, mas testei a expressão regular em um editor de texto e ela funciona conforme o esperado. A linha 2 do arquivo de importação é semelhante a `Message-ID: <35690.0.1.959300741@eGroups.com>`  
Alguma ideia? Agradeço desde já…

```
A importação do mbox está iniciando...

Traceback (última chamada mais recente):
	12: from script/import_scripts/mbox.rb:9:in `<main>'
	11: from script/import_scripts/mbox.rb:10:in `<module:ImportScripts>'
	10: from script/import_scripts/mbox.rb:12:in `<module:Mbox>'
	 9: from script/import_scripts/mbox.rb:12:in `new'
	 8: from /var/www/discourse/script/import_scripts/mbox/importer.rb:11:in `initialize'
	 7: from /var/www/discourse/script/import_scripts/mbox/support/settings.rb:8:in `load'
	 6: from /usr/local/lib/ruby/2.6.0/psych.rb:577:in `load_file'
	 5: from /usr/local/lib/ruby/2.6.0/psych.rb:577:in `open'
	 4: from /usr/local/lib/ruby/2.6.0/psych.rb:578:in `block in load_file'
	 3: from /usr/local/lib/ruby/2.6.0/psych.rb:277:in `load'
	 2: from /usr/local/lib/ruby/2.6.0/psych.rb:390:in `parse'
	 1: from /usr/local/lib/ruby/2.6.0/psych.rb:456:in `parse_stream'
/usr/local/lib/ruby/2.6.0/psych.rb:456:in `parse': (/shared/import/settings.yml): não foi encontrada a chave esperada ao analisar um mapeamento de bloco na linha 2 coluna 1 (Psych::SyntaxError)

```

---

<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: [Abril 17, 2020, 1:29pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/151 "2020-04-17T13:29:29Z")

</div>

Parece que você cometeu um erro no arquivo `settings.yml`. Sugiro validar a configuração em [http://www.yamllint.com/](http://www.yamllint.com/)

---

<div class="post-metadata">

### Author: ![sturdy2](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sturdy2/32/138218_2.png) [@sturdy2](https://meta.discourse.org/u/sturdy2)
#### Post date: [Abril 17, 2020, 9:54pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/152 "2020-04-17T21:54:45Z")

</div>

Obrigado, @gerhard. Suspiro… Deveria ter visto esse problema, minha primeira experiência com Ruby. Agora, acho que estou um pouco mais perto, mas com um erro diferente (veja abaixo). Como o script de importação agora está carregando Grupos, etc., presumo que o novo erro esteja além do problema inicial. Também presumo que o arquivo de banco de dados referenciado seja o import/index.db, criado pelo script de importação (mas não foi criado).

```
A importação do mbox está iniciando...

Carregando grupos existentes...
Carregando usuários existentes...
Carregando categorias existentes...
Carregando posts existentes...
Carregando tópicos existentes...
Traceback (última chamada):
	9: from script/import_scripts/mbox.rb:9:in `<main>'
	8: from script/import_scripts/mbox.rb:10:in `<module:ImportScripts>'
	7: from script/import_scripts/mbox.rb:12:in `<module:Mbox>'
	6: from script/import_scripts/mbox.rb:12:in `new'
	5: from /var/www/discourse/script/import_scripts/mbox/importer.rb:14:in `initialize'
	4: from /var/www/discourse/script/import_scripts/mbox/importer.rb:14:in `new'
	3: from /var/www/discourse/script/import_scripts/mbox/support/database.rb:10:in `initialize'
	2: from /var/www/discourse/script/import_scripts/mbox/support/database.rb:10:in `new'
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/database.rb:89:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sqlite3-1.4.2/lib/sqlite3/database.rb:89:in `open_v2': unable to open database file (SQLite3::CantOpenException)

```

---

<div class="post-metadata">

### Author: ![sturdy2](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sturdy2/32/138218_2.png) [@sturdy2](https://meta.discourse.org/u/sturdy2)
#### Post date: [Abril 18, 2020, 10:04pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/153 "2020-04-18T22:04:01Z")

</div>

O SISTEMA não me permite editar meu comentário, então estou enviando esta resposta em vez disso.

EDIT: Para fechar o ciclo… Minha importação do Yahoo Group agora está funcionando, pelo menos até o ponto de indexar 9951 e-mails. Ainda não terminei a importação completa, então mais novidades em breve. Editei o settings.yml várias vezes e agora voltei à versão original, que de repente parece funcionar! sem o erro de sintaxe. Não entendo por que recebi várias mensagens de erro que parecem inconsistentes para mim. O erro de sintaxe original no settings.yml é novamente um mistério. A mensagem de erro acima não faz sentido para mim… suspiro.

---

<div class="post-metadata">

### Author: ![deeplow](https://avatars.discourse-cdn.com/v4/letter/d/df788c/32.png) [@deeplow](https://meta.discourse.org/u/deeplow)
#### Post date: [Setembro 5, 2020, 3:26pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/154 "2020-09-05T15:26:55Z")

</div>

@gerhard. Acredito que encontrei um método muito mais fácil para fazer exatamente o mesmo que seu guia, mas sem exigir conhecimento técnico nem acesso de administrador a nenhum servidor. Me diga o que você acha.

## Visão Geral

Essencialmente, configuraremos uma lista de discussão e, em seguida, usaremos um arquivo de e-mail para enviar conversas passadas em ordem. Esses e-mails serão reencaminhados, mas não como o botão “Encaminhar” dos clientes de e-mail (isso sobrescreveria os cabeçalhos e bagunçaria a indentação). O que queremos fazer é reenviá-los (enviá-los como se tivessem sido enviados ao Discourse originalmente).

## Requisitos e Suposições

- **Acesso às trocas de e-mail anteriores** : alguém que tenha armazenado tudo em seu cliente de e-mail e possa se voluntariar para encaminhar — vamos chamar essa pessoa de `João Silva`.

- **Tempo** : o reencaminhamento de e-mail será muito lento para que o Discourse consiga processar (talvez alguns dias com um computador rodando e enviando os e-mails — dependendo do tamanho do arquivo).

- **Cliente Thunderbird** : Também assumimos aqui que o João Silva usa o cliente de e-mail “Thunderbird”. Pode ser possível fazer isso com outros clientes, mas eu não verifiquei.

> O guia a seguir usa dois endereços de e-mail como espaços reservados. Você precisa substituí-los pelos seus endereços reais.
> 
> 📨 [joaosilva@exemplo.com](mailto:joaosilva@exemplo.com) E-mail do João Silva (a pessoa que encaminhará todo o arquivo da lista de discussão)
> 
> 📮 [discourse+mailinglist-3@discoursemail.com](mailto:discourse+mailinglist-3@discoursemail.com) E-mail do Discourse para encaminhar e-mails para a categoria da lista de discussão (veja a configuração 1. para saber como obtê-lo)

## Instruções

Aqui está um resumo básico das instruções:

1. Siga o guia em [Mirroring a read-only mailing list in Discourse](https://meta.discourse.org/t/creating-a-read-only-mailing-list-mirror/77990) para criar um espelho da sua lista de discussão.

2. Altere a maneira como o Discourse encaminha e-mails para (_não tenho certeza se isso é realmente necessário_).  
 ![forwarded_behavior](https://global.discourse-cdn.com/meta/original/3X/0/e/0eff32bea4f35872c9c96cbbd357059dd59da104.png)

3. Edite as configurações da categoria e, na configuração Endereço de e-mail de entrada personalizado:, adicione ao final do que já existe `|joaosilva@exemplo.com`.

4. O João Silva instala no Thunderbird a extensão [Mail Redirect](https://addons.thunderbird.net/en-US/thunderbird/addon/mailredirect/).

5. O João Silva vai para as configurações da extensão e define o seguinte para `1` (o padrão é 5).  
 ![mail_redirect](https://global.discourse-cdn.com/meta/original/3X/0/c/0c6928620e0af22209852bb899aa3aed3b51baa5.png)

6. O João Silva seleciona todos os e-mails passados da lista de discussão, clica com o botão direito e clica em Redirecionar. Em seguida, uma nova janela será aberta e ele adicionará `discourse+mailinglist-3@discoursemail.com` como `Reenviar para`.

Após isso, o cliente de e-mail do João Silva começará a enviar lentamente os arquivos de e-mail para o Discourse. Basta verificar após algum tempo para ver se a categoria do Discourse está sendo preenchida com conversas antigas e nostálgicas.

## Limpeza

- **Remova o e-mail do João Silva** da configuração `Endereço de e-mail de entrada personalizado:` dessa categoria (e não se esqueça de remover o |).

- **Desinstale a extensão Mail Redirect** — provavelmente você não precisará dela novamente, ou, no mínimo, aumente de volta as conexões SMTP para 5.

---

<div class="post-metadata">

### Author: ![miri64](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/miri64/32/194614_2.png) [@miri64](https://meta.discourse.org/u/miri64)
#### Post date: [Setembro 21, 2020, 7:57pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/155 "2020-09-21T19:57:49Z")

</div>

Estamos tentando migrar nossas listas do Mailman para uma instância do Discourse já em execução. Há várias listas privadas incluídas, para as quais precisamos definir permissões nas categorias correspondentes. Ao criar essas categorias antes da importação, todas as postagens das listas privadas são adicionadas a “Sem categoria” (portanto, automaticamente públicas).

Assim, temos duas perguntas alternativas:

- Existe uma maneira de definir permissões para as listas de e-mail importadas (se fossem visíveis apenas para administradores, já seria suficiente para nós) antes da importação?
- Existe uma maneira de adicionar a lista de e-mail a uma categoria existente (com permissões pré-configuradas)?

---

<div class="post-metadata">

### Author: ![danb35](https://avatars.discourse-cdn.com/v4/letter/d/dfb087/32.png) [@danb35](https://meta.discourse.org/u/danb35)
#### Post date: [Setembro 21, 2020, 8:18pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/156 "2020-09-21T20:18:48Z")

</div>

> [@gerhard](#):
>
> Crie um novo diretório dentro do diretório `import/data` e reinicie o script de importação.

Meu Discourse é uma continuação de um grupo do Yahoo, que por sua vez era uma continuação de um listserv do AOL. No outono passado, diante da grande limpeza do Yahoo, consegui baixar um arquivo .mbox do grupo do Yahoo e importar essas mensagens seguindo estas instruções. Agora, obtive um arquivo parcial do listserv do AOL e gostaria de importar essas mensagens também.

Fácil, certo? Basta criar `import/data/foo`, colocar as mensagens lá e executar o script de importação. Mas o que me pergunto é: se mais tarde eu conseguir um arquivo completo (ou mais completo), posso simplesmente colocar esses arquivos em `import/data/foo`, executar o script de importação novamente e fazer com que ele adicione as novas mensagens à mesma categoria?

- Ele faria a desduplicação? Ou eu veria várias cópias de mensagens que apareceram em ambos os arquivos?
  - A resposta a essa pergunta mudaria se um, o outro ou ambos os arquivos não tivessem cabeçalhos de message-id?

- Uma nova importação na mesma categoria sobrescreveria as mensagens existentes?
- A maioria dos meus usuários está no modo de lista de e-mails. Se eu não quiser enviá-los spam com centenas (ou milhares) de notificações, além de gerar uma conta cara do Mailgun, presumo que eu queira desativar o e-mail em todo o site enquanto a importação estiver ocorrendo?

---

<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: [Setembro 28, 2020, 6:51pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/157 "2020-09-28T18:51:24Z")

</div>

> [@miri64](#):
>
> Existe alguma maneira de definir permissões para as listas de e-mail importadas (se fossem visíveis apenas para administradores, já seria suficiente para nós) antes da importação?

Infelizmente, isso não é possível.

> [@miri64](#):
>
> Existe alguma maneira de adicionar a lista de e-mail a uma categoria existente (com permissões predefinidas)?

Sim, você pode enganar o script de importação para reutilizar categorias existentes.

```plaintext
./launcher enter app
rails c

# Use o ID da categoria mostrado na URL, por exemplo
# é 56 quando o caminho da categoria se parece com isso: /c/howto/devs/56
category = Category.find(56)

# Use o nome do diretório onde os arquivos mbox estão armazenados. Por exemplo,
# quando os arquivos estão em import/data/foo, você deve usar "foo" como nome do diretório.
category.custom_fields["import_id"] = "directory_name"
category.save!

```

> [@miri64](#):
>
> todos os posts das listas privadas são adicionados a “Sem categoria”

Isso é inesperado. Nunca vi isso acontecer, mas nunca tentei importar em categorias existentes com permissões diferentes das permissões padrão.

Se você não conseguir fazer funcionar, sugiro que publique um anúncio no seu fórum, coloque seu site no modo somente leitura, crie um backup, restaure o backup em um servidor diferente, execute a importação, configure as permissões da categoria, crie outro backup e restaure-o no seu site de produção.

---

<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: [Setembro 28, 2020, 7:07pm UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/158 "2020-09-28T19:07:04Z")

</div>

> [@danb35](#):
>
> Posso simplesmente colocar esses arquivos em `import/data/foo`, executar o script de importação novamente e fazer com que ele adicione as novas mensagens à mesma categoria?

Sim, você pode. Talvez seja bom manter o arquivo `import/data/index.db` por perto, caso você queira examinar os dados importados anteriormente, precise modificar os IDs de mensagem gerados ou algo assim…

> [@danb35](#):
>
> Ele faria a desduplicação? A resposta a essa pergunta mudaria se um, o outro ou ambos os arquivos não tivessem cabeçalhos de message-id?

Sim, ele não importaria mensagens já importadas, desde que o cabeçalho `Message-ID` permaneça o mesmo. Você terá problemas se o cabeçalho `Message-ID` estiver ausente em _apenas um_ dos arquivos. Usamos o hash MD5 da mensagem se o cabeçalho estiver ausente. Você precisará garantir que ambas as mensagens tenham o mesmo cabeçalho `Message-ID` ou resultem no mesmo hash MD5.

> [@danb35](#):
>
> Uma nova importação na mesma categoria sobrescreveria mensagens existentes?

Não.

> [@danb35](#):
>
> A maioria dos meus usuários está no modo de lista de e-mail. Se eu não quiser enviá-los spam com centenas (ou milhares) de notificações, sem mencionar aumentar uma conta cara do Mailgun, presumo que queira desativar o e-mail em todo o site enquanto a importação estiver em andamento?

Todos os e-mails de saída são desativados durante as importações.

---

<div class="post-metadata">

### Author: ![miri64](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/miri64/32/194614_2.png) [@miri64](https://meta.discourse.org/u/miri64)
#### Post date: [Setembro 29, 2020, 8:41am UTC](https://meta.discourse.org/t/migrate-a-mailing-list-to-discourse-mbox-listserv-google-groups-etc/79773/159 "2020-09-29T08:41:33Z")

</div>

> Sim, é possível enganar o script de importação para reutilizar categorias existentes.

Ok, é basicamente isso que fizemos no final (usamos `Category.find_by_name()` em vez disso, mas imagino que seja apenas uma questão de semântica). Bom saber que escolhemos o caminho “correto” 😉 . Obrigado!

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