Migrer une liste de diffusion vers Discourse (mbox, Listserv, Google Groups, etc)

This guide is for you if you want to migrate a mailing list to Discourse.
It also contains instructions for importing messages from image 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

:bulb: 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. 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 for more information.

:bangbang: 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.

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:

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:

  - "templates/import/chrome-dep.template.yml"
  - "templates/import/mbox.template.yml"

Afterwards it should look something like this:

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.

/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:

/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 Google Groups.

Instructions for Google Groups

1.3.1. Preparation

:warning: Make sure you don’t have any pinned posts in your group, otherwise the crawler might fail to download some or all messages.

:warning: 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.

Google account: You need a Google account that has the Manager or Owner role 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

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

1.3.2 Cookies :cookie:

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/ 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 for Mozilla Firefox.

Upload the cookies.txt file to your server and save it within the /var/discourse/shared/standalone/import directory.

1.3.3. Download messages

:bulb: Tip: It’s a good idea to download messages inside a tmux or screen session, so that you can reconnect to the session in case of SSH connection loss.

Let’s start by entering the Docker container.

/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:

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:

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)

:bulb: 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.

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

The settings file comes with sensible defaults, but here are a few tips anyway:

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

    • mbox files usually are separated by a From header. Choose a regular expression that works for your files.

    • If each of your files contains only one message, set the split_regex to an empty string. This also applies to imports from image Google Groups.

    • There’s also an example for files from the popular Listserv mailing list software.

  • 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:

/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

:bulb: Tip: It’s a good idea to start the import inside a tmux or screen 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.

/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 :coffee: or :sleeping:
The import script will show you a message like this when it’s finished: Done (00h 26min 52sec)

:bulb: 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.

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.

/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.

/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! :tada:

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 contains an example.

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

:warning: 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
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
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 a try.

Last edited by @JammyDodger 2024-05-27T14:56:11Z

Check documentPerform check on document:
30 « J'aime »

@gerhard - I was able to migrate an mbox archive of 22,000 messages using this script on a Digital Ocean droplet with only 1GB RAM. No problems. Thank you for the write-up of instructions. Everything worked great. The only mistake I made on my first attempt was trying to name the /var/discourse/shared/standalone/import/data/X subfolder using a new category I created before running the script. That caused the import to place these messages into the Uncategorized category. On second attempt, I deleted the new category and tried again. This created the category name for me and placed the messages into the proper category automatically.

6 « J'aime »

Thanks for this guide.

I’m attempting to do a Google Groups import. Unfortunately, I run into this error when running import_mbox.sh:

The mbox import is starting...

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)

All files in /var/discourse/shared/standalone/import/data/Foo are .eml files though, not mbox. Does that matter?

Thanks!

The latest version of the import script fixes that problem. As an alternative, please update your settings file. There were some recent changes.

5 « J'aime »

Thanks a lot. Could you please give some advice on how to update the import script?

Is it enough to just update the import scripts or do I have to redo more steps of the guide (which ones?)? I can’t find them and therefore don’t know how to update them.

I did update the settings file as you mentioned this being an alternative, but I’m getting the same issues.

Thanks.

You can run /var/discourse/launcher rebuild import to update the import script and everything else related to it.

4 « J'aime »

Thanks.

While running import_mbox.sh almost all messages are skipped with messages like the following:

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 items/min] Failed to map post for 36a37072-e5b6-4009-878f-f0824e40eac6@googlegroups.com

undefined method `each' for 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'

And further down:

60 / 215 ( 27.9%) [58321 items/min] Parent message 1b46f337-95a3-4b4a-a14a-689636941580@googlegroups.com doesn't exist. Skipping 5634208e-e6df-4bd8-b361-0735f73fe554@googlegroups.com:

What could be the reason for this? Thanks.

The problem should be fixed. Please rebuild your import container one more time.

6 « J'aime »

Sweet, it worked like a charm. :pray: Thanks so much for your support.

5 « J'aime »

J’essaie de télécharger Google Groups et je reçois l’erreur suivante :

Échec de la connexion. Veuillez vérifier le contenu de votre fichier cookies.txt

J’ai utilisé l’extension Firefox recommandée pour télécharger les cookies, une fois hier et une fois aujourd’hui. J’ai confirmé que le fichier était bien lu en le renommant avec un nom incorrect et en obtenant une erreur « fichier non trouvé ». J’ai téléchargé tous les cookies, pas seulement ceux de Google. Je me suis déconnecté puis reconnecté, et j’ai à nouveau téléchargé les cookies.

Je vois que je suis gestionnaire car j’ai les options « gérer le groupe ».

J’ai vérifié à trois reprises que j’utilisais le bon nom de groupe en le copiant-collant et en constatant qu’il s’agit bien d’un format de nom de groupe et non d’un nom de domaine.

Quelque chose est-il cassé ou est-ce seulement de mon fait ?

@gerhard, désolé de te taguer, mais aurais-tu une suggestion rapide pour déboguer ce problème ? Peut-être qu’un point de connexion a changé ?

EDIT : J’ai trouvé. Je vais soumettre une PR sous peu. Le point de connexion pour l’authentification a changé et j’ai réussi à deviner le nouveau. :slight_smile:

1 « J'aime »

Nouveau venu essayant d’importer des fichiers mbox depuis Yahoo Groups. J’ai suivi ces instructions à plusieurs reprises, mais toujours avec le même message d’erreur. Je vois que d’autres ont réussi, donc il s’agit probablement d’une erreur de débutant. L’erreur semble indiquer que split_regex: "^From .+@.+" ne trouve pas la clé e-mail pour diviser le fichier, mais j’ai testé l’expression régulière dans un éditeur de texte et elle fonctionne comme prévu. La ligne 2 du fichier d’importation ressemble à Message-ID: <35690.0.1.959300741@eGroups.com>
Des idées ? Merci d’avance…

L'importation mbox commence...

Traceback (dernier appel en dernier) :
	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): clé inattendue non trouvée lors de l'analyse d'un mappage de bloc à la ligne 2, colonne 1 (Psych::SyntaxError)

Il semble que vous ayez fait une erreur dans le fichier settings.yml. Je vous suggère de valider la configuration sur http://www.yamllint.com/.

3 « J'aime »

Merci @gerhard. Soupir… J’aurais dû voir ce problème, c’était ma première expérience avec Ruby. Maintenant, je pense être un peu plus proche, mais avec une erreur différente (voir ci-dessous). Puisque le script d’importation charge désormais les groupes, etc., je suppose que la nouvelle erreur survient après le problème initial. Je suppose également que le fichier de base de données mentionné est import/index.db, créé par le script d’importation (mais qui n’a pas été créé).

L'importation mbox commence...

Chargement des groupes existants...
Chargement des utilisateurs existants...
Chargement des catégories existantes...
Chargement des messages existants...
Chargement des sujets existants...
Traceback (most recent call last):
	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': impossible d'ouvrir le fichier de base de données (SQLite3::CantOpenException)
1 « J'aime »

Le système ne m’autorise pas à modifier mon commentaire, je soumets donc cette réponse à la place.

MODIF : Pour boucler la boucle… Mon import de groupe Yahoo fonctionne désormais, du moins jusqu’au point d’indexation de 9951 e-mails. Je n’ai pas encore terminé l’import complet, donc il y aura plus à venir. J’ai modifié settings.yml à de nombreuses reprises et je suis de nouveau revenu à l’original qui semble soudainement fonctionner ! sans l’erreur de syntaxe. Je ne comprends pas pourquoi j’ai reçu de nombreux messages d’erreur qui me semblent incohérents. L’erreur de syntaxe originale dans settings.yml est à nouveau un mystère. Le message d’erreur ci-dessus n’a aucun sens pour moi… soupir.

1 « J'aime »

@gerhard. Je pense avoir trouvé une méthode beaucoup plus simple pour faire exactement la même chose que votre guide, sans aucune connaissance technique requise ni besoin d’accès administrateur à un serveur. Dites-moi ce que vous en pensez.

Aperçu

Nous allons essentiellement configurer une liste de diffusion, puis utiliser une archive d’e-mails pour envoyer les conversations passées dans l’ordre. Ces e-mails seront transférés, mais pas comme avec le bouton « Transférer » des clients de messagerie (ce qui écraserait les en-têtes et perturberait le retraitement). Ce que nous voulons faire, c’est les renvoyer (les envoyer comme s’ils avaient été envoyés à Discourse dès le départ).

Prérequis et hypothèses

  • Accès aux échanges e-mail précédents : une personne qui les a tous stockés dans son client de messagerie et peut se porter volontaire pour les transférer — appelons cette personne « Jean Dupont ».

  • Temps : le transfert d’e-mails sera très lent pour que Discourse puisse le gérer (peut-être quelques jours avec un ordinateur en train de télécharger les e-mails, selon la taille de l’archive).

  • Client Thunderbird : Nous supposons ici que Jean Dupont utilise le client de messagerie « Thunderbird ». Il est peut-être possible de faire cela avec d’autres clients, mais je ne l’ai pas vérifié.

Le guide suivant utilise deux adresses e-mail comme espaces réservés. Vous devez les remplacer par vos propres adresses réelles.

:incoming_envelope: johndoe@example.com L’e-mail de Jean Dupont (la personne qui transférera l’archive complète de la liste de diffusion)

:postbox: discourse+mailinglist-3@discoursemail.com L’e-mail de Discourse pour transférer les e-mails vers la catégorie de la liste de diffusion (voir la configuration 1 pour savoir comment l’obtenir)

Instructions

Voici un résumé des instructions :

  1. Suivez le guide sur Mirroring a read-only mailing list in Discourse pour créer un miroir de votre liste de diffusion.

    Remarque : cela ne créera un miroir que pour les messages futurs de votre liste de diffusion. Vous manquerez toujours les conversations passées. C’est l’objectif du reste de ce guide.

  2. Modifiez la façon dont Discourse transfère les e-mails vers (je ne suis pas vraiment sûr que cela soit nécessaire).
    forwarded_behavior

  3. Modifiez les paramètres de la catégorie et, dans le paramètre Adresse e-mail entrante personnalisée :, ajoutez à la fin de ce qui existe déjà |johndoe@example.com.

    Le pipe ici fonctionne comme un ,, ce qui signifie que vous voulez également que johndoe@example.com puisse envoyer à cette catégorie.

  4. Jean Dupont installe l’extension Mail Redirect sur Thunderbird.

    C’est parce que ce n’est pas un simple transfert d’e-mail. Ce qui se passera, c’est que l’e-mail sera envoyé comme s’il avait été adressé à l’adresse e-mail de Discourse dès le départ, et non à celle de Jean Dupont.

  5. Jean Dupont va dans les paramètres de l’extension et définit la valeur suivante à 1 (la valeur par défaut est 5).
    mail_redirect

    Cela assurera que les réponses arrivent dans l’ordre : sinon, Discourse n’est pas assez rapide pour réaliser que les réponses sont enchaînées et crée simplement un nouveau sujet pour chaque réponse — mais cela rendra le processus de transfert très lent.

  6. Jean Dupont sélectionne tous les e-mails passés de la liste de diffusion, clique avec le bouton droit et choisit Rediriger. Ensuite, une nouvelle fenêtre s’ouvrira et il ajoutera discourse+mailinglist-3@discoursemail.com en tant que Renvoyer à.

Après cela, le client de messagerie de Jean Dupont enverra lentement les archives d’e-mails à Discourse. Vérifiez simplement après un certain temps pour voir si la catégorie Discourse se remplit de conversations anciennes et nostalgiques.

Nettoyage

  • Supprimez l’e-mail de Jean Dupont du paramètre Adresse e-mail entrante personnalisée : de cette catégorie (et n’oubliez pas de supprimer le |).

  • Désinstallez l’extension Mail Redirect — vous n’en aurez probablement plus besoin, ou du moins augmentez à nouveau les connexions SMTP à 5.

5 « J'aime »

Nous essayons de migrer nos listes Mailman vers une instance Discourse déjà en fonctionnement. Plusieurs listes privées sont incluses, pour lesquelles nous devons définir des permissions sur la catégorie correspondante. Lors de la création de ces catégories avant l’importation, tous les messages des listes privées sont ajoutés à « Sans catégorie » (donc automatiquement publics).

Nous avons donc deux questions alternatives :

  • Existe-t-il un moyen de définir les permissions pour les listes de diffusion importées (si elles étaient visibles uniquement par les administrateurs, cela nous suffirait déjà) avant l’importation ?
  • Existe-t-il un moyen d’ajouter la liste de diffusion à une catégorie existante (avec des permissions prédéfinies) ?
3 « J'aime »

Mon Discourse est la continuation d’un groupe Yahoo, qui était lui-même la continuation d’une liste de diffusion AOL. L’automne dernier, face au grand nettoyage de Yahoo, j’ai pu télécharger une archive .mbox du groupe Yahoo et importer ces messages en suivant ces instructions. J’ai maintenant obtenu une archive partielle de la liste de diffusion AOL, et j’aimerais importer ces messages également.

C’est simple, non ? Il suffit de créer import/data/foo, de placer les messages dedans et d’exécuter le script d’importation. Mais je me demande : si je parviens plus tard à obtenir une archive complète (ou plus complète), puis-je simplement placer ces fichiers dans import/data/foo, relancer le script d’importation et faire en sorte qu’il ajoute les nouveaux messages à la même catégorie ?

  • Cela va-t-il supprimer les doublons ? Ou verrai-je plusieurs copies des messages présents dans les deux archives ?
    • La réponse à cette question changerait-elle si l’une, l’autre ou les deux archives manquaient d’en-têtes message-id ?
  • Une nouvelle importation dans la même catégorie écraserait-elle les messages existants ?
  • La plupart de mes utilisateurs sont en mode liste de diffusion. Si je ne veux pas les inonder de centaines (voire milliers) de notifications, sans parler de faire grimper la facture Mailgun, je suppose que je devrai désactiver l’envoi d’e-mails à l’échelle du site pendant l’importation ?
3 « J'aime »

Malheureusement, ce n’est pas possible.

Oui, vous pouvez tromper le script d’importation pour qu’il réutilise des catégories existantes.

./launcher enter app
rails c

# Utilisez l'ID de catégorie affiché dans l'URL, par exemple
# c'est 56 lorsque le chemin de la catégorie ressemble à ceci : /c/howto/devs/56
category = Category.find(56)

# Utilisez le nom du répertoire où sont stockés les fichiers mbox. Par exemple,
# si les fichiers sont stockés dans import/data/foo, vous devez utiliser "foo" comme nom de répertoire.
category.custom_fields["import_id"] = "nom_du_répertoire"
category.save!

C’est inattendu. Je n’ai jamais vu cela se produire, mais je n’ai jamais essayé d’importer dans des catégories existantes avec des permissions autres que les permissions par défaut.

Si vous ne parvenez pas à faire fonctionner cela, je vous suggère de publier une annonce sur votre forum, de passer votre site en mode lecture seule, de créer une sauvegarde, de restaurer la sauvegarde sur un serveur différent, d’exécuter l’importation, de configurer les permissions de la catégorie, de créer une autre sauvegarde et de la restaurer sur votre site de production.

3 « J'aime »

Oui, c’est possible. Il serait peut-être judicieux de conserver le fichier import/data/index.db, au cas où vous souhaiteriez consulter les données précédemment importées, modifier les identifiants de messages générés ou autre…

Oui, il n’importera pas les messages déjà importés tant que l’en-tête Message-ID reste identique. Vous serez mal loti si l’en-tête Message-ID manque dans une seule des archives. Nous utilisons le hachage MD5 du message si l’en-tête est absent. Vous devrez vous assurer que les deux messages ont soit le même en-tête Message-ID, soit produisent le même hachage MD5.

Non.

Tous les e-mails sortants sont désactivés pendant les importations.

3 « J'aime »

Oui, vous pouvez tromper le script d’importation pour qu’il réutilise les catégories existantes.

Ok, c’est essentiellement ce que nous avons fini par faire (nous avons utilisé Category.find_by_name() à la place, mais je suppose que ce n’est qu’une question de sémantique). C’est rassurant de savoir que nous avons choisi la « bonne » méthode :wink: . Merci !

3 « J'aime »