Migrate a mailing list to 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 лайков

@gerhard — мне удалось перенести архив mbox из 22 000 сообщений с помощью этого скрипта на Droplet от Digital Ocean всего с 1 ГБ оперативной памяти. Проблем не возникло. Спасибо за подробную инструкцию. Всё сработало отлично. Единственная ошибка, которую я допустил при первой попытке, заключалась в том, что я попытался назвать подпапку /var/discourse/shared/standalone/import/data/X именем новой категории, которую создал до запуска скрипта. Из-за этого импортированные сообщения попали в категорию «Без категории». При второй попытке я удалил новую категорию и повторил процесс. В результате скрипт автоматически создал имя категории и корректно разместил сообщения в нужной категории.

6 лайков

Спасибо за это руководство.

Я пытаюсь выполнить импорт из Google Groups. К сожалению, при запуске import_mbox.sh возникает следующая ошибка:

Начат импорт mbox...

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)

При этом все файлы в /var/discourse/shared/standalone/import/data/Foo имеют расширение .eml, а не mbox. Имеет ли это значение?

Спасибо!

Последняя версия скрипта импорта исправляет эту проблему. В качестве альтернативы обновите ваш файл настроек. Недавно в него были внесены изменения.

5 лайков

Спасибо большое. Не могли бы вы дать совет, как обновить скрипт импорта?

Достаточно ли просто обновить скрипты импорта, или мне нужно повторить ещё какие-то шаги из руководства (какие именно)? Я не могу их найти, поэтому не знаю, как их обновить.

Я обновил файл настроек, как вы упоминали в качестве альтернативы, но у меня возникают те же проблемы.

Спасибо.

Вы можете выполнить команду /var/discourse/launcher rebuild import, чтобы обновить скрипт импорта и всё остальное, связанное с ним.

4 лайка

Спасибо.

При запуске import_mbox.sh почти все сообщения пропускаются с сообщениями, подобными следующим:

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 элементов/мин] Не удалось сопоставить пост для 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'

А ниже:

60 / 215 ( 27.9%) [58321 элементов/мин] Родительское сообщение 1b46f337-95a3-4b4a-a14a-689636941580@googlegroups.com не существует. Пропуск 5634208e-e6df-4bd8-b361-0735f73fe554@googlegroups.com:

В чём может быть причина? Спасибо.

Проблема должна быть исправлена. Пожалуйста, пересоберите ваш контейнер импорта еще раз.

6 лайков

Супер, всё сработало как по маслу. :pray: Большое спасибо за поддержку.

5 лайков

Пытаюсь загрузить Google Groups, но получаю ошибку:

Не удалось войти в систему. Пожалуйста, проверьте содержимое файла cookies.txt

Использовал рекомендованное расширение Firefox для загрузки куки-файлов. Один раз вчера и ещё раз сегодня. Убедился, что файл читается, переименовав его в неправильное имя и получив ошибку «файл не найден». Загрузил все куки, не только относящиеся к Google. Выходил из системы и входил снова, после чего повторно загрузил куки.

Вижу, что я являюсь администратором, так как у меня есть опция «управление группой».

Трижды перепроверил, что использую правильное название группы: скопировал и вставил его, убедившись, что это формат названия группы, а не доменного имени.

Что-то сломалось или проблема только у меня?

@gerhard, извините за публичное обращение, но у вас есть быстрая подсказка, как отладить эту проблему? Возможно, изменился конечный пункт для входа?

РЕДАКТИРОВАНИЕ: Нашёл причину. Скоро отправлю запрос на слияние (PR). Конечный пункт для входа изменился, и мне удалось угадать новый. :slight_smile:

1 лайк

Новичок пытается импортировать файлы mbox из Yahoo Groups. Я несколько раз следовал этим инструкциям, но всегда получаю одно и то же сообщение об ошибке. Вижу, что у других всё получилось, так что, скорее всего, это ошибка новичка. Ошибка, похоже, указывает на то, что split_regex: "^From .+@.+" не находит ключ для разделения файла, но я протестировал регулярное выражение в текстовом редакторе, и оно работает как ожидалось. Вторая строка импортируемого файла выглядит примерно так: Message-ID: <35690.0.1.959300741@eGroups.com>
Есть какие-то идеи? Заранее спасибо…

Импортирование mbox начинается...

Traceback (most recent call last):
	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): did not find expected key while parsing a block mapping at line 2 column 1 (Psych::SyntaxError)

Похоже, в файле settings.yml допущена ошибка. Предлагаю проверить конфигурацию на http://www.yamllint.com/

3 лайка

Спасибо, @gerhard. Вздох… Я должен был заметить эту проблему, это мой первый опыт работы с Ruby. Сейчас я, кажется, немного ближе к решению, но возникла другая ошибка (см. ниже). Поскольку скрипт импорта теперь загружает группы и т.д., я предполагаю, что новая ошибка находится за пределами первоначальной проблемы. Я также предполагаю, что упомянутый файл базы данных — это import/index.db, который должен был быть создан скриптом импорта (но не был создан).

Начался импорт mbox...

Загрузка существующих групп...
Загрузка существующих пользователей...
Загрузка существующих категорий...
Загрузка существующих постов...
Загрузка существующих тем...
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': unable to open database file (SQLite3::CantOpenException)
1 лайк

SYSTEM не позволяет мне редактировать мой комментарий, поэтому я отправляю этот ответ вместо него.

РЕДАКТИРОВАНИЕ: Чтобы замкнуть круг… Импорт моей группы Yahoo теперь работает, по крайней мере, до этапа индексации 9951 электронного письма. Я еще не завершил полный импорт, так что будет продолжение. Я много раз редактировал settings.yml и сейчас вернулся к исходному варианту, который внезапно снова работает! без синтаксической ошибки. Не понимаю, почему я получал множество сообщений об ошибках, которые кажутся мне противоречивыми. Исходная синтаксическая ошибка в settings.yml снова остается загадкой. Ошибка выше для меня бессмысленна… вздох.

1 лайк

@gerhard. Я думаю, что нашёл гораздо более простой способ сделать то же самое, что и в вашем руководстве, но без необходимости в технических знаниях или правах администратора на каком-либо сервере. Дайте знать, что вы об этом думаете.

Обзор

По сути, мы настроим рассылку, а затем будем использовать архив электронной почты для отправки прошлых переписок по порядку. Эти письма будут пересылаться, но не так, как кнопка «Переслать» в почтовых клиентах (это переопределит заголовки и нарушит отступы). То, что нам нужно сделать, — это переслать их повторно (отправить так, как будто они изначально были отправлены в Discourse).

Требования и допущения

  • Доступ к предыдущим обменам электронной почтой: кто-то, кто сохранил всё это в своём почтовом клиенте и готов переслать — назовём этого человека «Иван Иванов».

  • Время: пересылка электронной почты будет очень медленной, чтобы Discourse мог её обработать (возможно, несколько дней с работающим компьютером, загружающим письма — в зависимости от размера архива).

  • Клиент Thunderbird: Также предполагаем, что Иван Иванов использует почтовый клиент «Thunderbird». Возможно, это можно сделать и с другими клиентами, но я не исследовал этот вопрос.

В следующем руководстве в качестве заполнителей используются два адреса электронной почты. Вам нужно заменить их на свои фактические адреса.

:incoming_envelope: johndoe@example.com Адрес электронной почты Ивана Иванова (этот человек перешлёт полный архив рассылки)

:postbox: discourse+mailinglist-3@discoursemail.com Адрес электронной почты Discourse для пересылки писем в категорию рассылки (см. настройку 1, чтобы узнать, как его получить)

Инструкция

Вот краткое изложение инструкций:

  1. Следуйте руководству по адресу Mirroring a read-only mailing list in Discourse, чтобы создать зеркало вашей рассылки.

    Примечание: это создаст зеркало вашей рассылки только на будущее. Вы всё равно упустите прошлые обсуждения. Для этого и предназначено остальное руководство.

  2. Измените способ пересылки писем в Discourse (на самом деле я не уверен, что это необходимо).
    forwarded_behavior

  3. Откройте настройки категории и в поле Пользовательский адрес входящей электронной почты: добавьте в конце существующего значения |johndoe@example.com.

    Здесь символ «|» работает как ,, то есть вы также хотите разрешить johndoe@example.com отправлять письма в эту категорию.

  4. Иван Иванов устанавливает расширение Mail Redirect в Thunderbird.

    Это потому, что это не обычная пересылка писем. Это позволит отправить письмо так, как будто оно изначально было адресовано адресу электронной почты Discourse, а не Ивану Иванову.

  5. Иван Иванов переходит в настройки расширения и устанавливает следующее значение на 1 (по умолчанию 5).
    mail_redirect

    Это обеспечит правильный порядок поступления ответов: в противном случае Discourse не успевает понять, что ответы связаны между собой, и создаёт новую тему для каждого ответа — но это сделает процесс пересылки очень медленным.

  6. Иван Иванов выделяет все прошлые письма рассылки, нажимает правой кнопкой мыши и выбирает Перенаправить. Затем откроется новое окно, и он добавит discourse+mailinglist-3@discoursemail.com в поле Повторная отправка.

После этого почтовый клиент Ивана Иванова будет медленно отправлять архивы писем в Discourse. Просто проверьте через некоторое время, заполняется ли категория Discourse ностальгическими старыми обсуждениями.

Очистка

  • Удалите адрес электронной почты Ивана Иванова из настройки Пользовательский адрес входящей электронной почты: этой категории (и не забудьте удалить символ |).

  • Удалите расширение Mail Redirect — вам, скорее всего, оно больше не понадобится, или, по крайней мере, верните количество соединений SMTP обратно к 5.

5 лайков

Мы пытаемся перенести списки рассылки Mailman в уже работающий экземпляр Discourse. В их число входят несколько приватных списков, для которых необходимо настроить права доступа к соответствующим категориям. При создании этих категорий до импорта все сообщения из приватных списков добавляются в раздел «Без категории» (и, следовательно, автоматически становятся публичными).

Поэтому у нас два альтернативных вопроса:

  • Можно ли настроить права доступа для импортируемых списков рассылки (для нас уже достаточно, если они будут видны только администраторам) до импорта?
  • Можно ли добавить список рассылки в существующую категорию (с заранее настроенными правами доступа)?
3 лайка

Мой Discourse является продолжением группы Yahoo, которая, в свою очередь, была продолжением рассылки AOL. Прошлой осенью, в преддверии масштабного закрытия Yahoo, мне удалось скачать архив .mbox группы Yahoo и импортировать эти сообщения, следуя данным инструкциям. Теперь у меня есть частичный архив рассылки AOL, и я хотел бы импортировать и эти сообщения.

Вроде бы просто, верно? Просто создайте import/data/foo, поместите туда сообщения и запустите скрипт импорта. Но меня интересует следующее: что если позже мне удастся получить полный (или более полный) архив? Могу ли я просто положить эти файлы в import/data/foo, снова запустить скрипт импорта, и он добавит новые сообщения в ту же категорию?

  • Будет ли происходить удаление дубликатов? Или я увижу несколько копий сообщений, которые присутствовали в обоих архивах?
    • Изменится ли ответ на этот вопрос, если в одном, в другом или в обоих архивах отсутствуют заголовки message-id?
  • Перезапишет ли новый импорт в той же категории существующие сообщения?
  • Большинство моих пользователей находятся в режиме почтового списка. Если я не хочу спамить их сотнями (или тысячами) уведомлений, не говоря уже о том, чтобы не накручивать дорогой счет Mailgun, я предполагаю, что мне нужно будет отключить электронную почту на всем сайте во время импорта?
3 лайка

К сожалению, это невозможно.

Да, вы можете обмануть скрипт импорта, заставив его переиспользовать существующие категории.

./launcher enter app
rails c

# Используйте ID категории, отображаемый в URL, например
# это 56, если путь к категории выглядит так: /c/howto/devs/56
category = Category.find(56)

# Используйте имя директории, где хранятся файлы mbox. Например,
# если файлы хранятся в import/data/foo, в качестве имени директории следует указать "foo".
category.custom_fields["import_id"] = "directory_name"
category.save!

Это неожиданно. Я никогда не сталкивался с этим, но я также никогда не пытался импортировать в существующие категории с правами доступа, отличными от прав по умолчанию.

Если у вас не получится заставить это работать, я предлагаю вам разместить объявление на вашем форуме, перевести ваш сайт в режим только для чтения, создать резервную копию, восстановить её на другом сервере, запустить импорт, настроить права доступа к категории, создать ещё одну резервную копию и восстановить её на вашем рабочем сервере.

3 лайка

Да, можно. Возможно, вам стоит оставить файл import/data/index.db, на случай если вы захотите просмотреть ранее импортированные данные, изменить сгенерированные идентификаторы сообщений или что-то подобное…

Да, уже импортированные сообщения не будут импортированы повторно, если заголовок Message-ID остаётся неизменным. Если заголовок Message-ID отсутствует только в одном из архивов, вам не повезёт. Мы используем MD5-хэш сообщения, если заголовок отсутствует. Вам нужно убедиться, что оба сообщения либо имеют одинаковый заголовок Message-ID, либо дают одинаковый MD5-хэш.

Нет.

Все исходящие письма отключаются во время импорта.

3 лайка

Да, вы можете обмануть скрипт импорта, заставив его повторно использовать существующие категории.

Хорошо, в итоге мы сделали именно это (мы использовали Category.find_by_name(), но полагаю, это лишь семантика). Приятно знать, что мы выбрали «правильный» путь :wink: . Спасибо!

3 лайка