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

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

См. пункт 2.3 в исходном сообщении для проверки индексной базы данных.

3 лайка

Список Mailman 2, который я рассматриваю для импорта в Discourse, в течение части своего существования имел настройку from_is_list равной Munge From, так что заголовок From: выглядел так:

From: Listname <listname-bounces@listdomain.com> On Behalf Of [Имя оригинального отправителя]

вместо

From: [Имя оригинального отправителя] <username@example.com>

Это заставило меня подумать, что импортер будет воспринимать каждое такое сообщение как исходящее от одного и того же пользователя (с адресом электронной почты listname-bounces@listdomain.com)… НО…

Начальная строка, обозначающая начало нового письма в файле mbox, всё ещё начинается с:

From username@example.com [Дата время группа]

(и архивы Hyperkitty также показывают адрес электронной почты оригинального отправителя в обычном виде).

Так что мой вопрос — берет ли скрипт импорта адрес отправителя из заголовка From: или из строки From ? Спасибо.

Я кратко обсуждал это в предыдущей теме: Working on a mailman2 to discourse migration script - #10 by dachary

1 лайк

Используется заголовок From:.

1 лайк

Спасибо за быстрый ответ! Насколько сложно это изменить? Не обязательно официально — хотя это могло бы помочь другим, — но просто чтобы я мог изменить скрипт перед его запуском. Я пока не знаю Ruby, но если нужно просто заменить двоеточие на пробел…

Это не простое изменение, но оно выполнимо. Вам не обязательно реализовывать это в скрипте импорта. Если вы знаете другой язык скриптов, я уверен, что обновление заголовков From: в файлах mbox перед запуском импорта не составит большого труда…

Но, конечно, вы можете исправить это в скрипте импорта. PR приветствуется!
Хорошей отправной точкой для исправления заголовка должен стать метод each_mail

5 лайков

Спасибо. Похоже, что именно это сейчас определяет результат, исходя из строк 69–70 файла indexer.rb:

parsed_email = receiver.mail
from_email, from_display_name = receiver.parse_from_field(parsed_email)

Возможно ли в этот момент получить первую строку письма в формате mbox (то есть строку вида «From [адрес электронной почты] [дата и время]») из переменной parsed_email и извлечь оттуда адрес электронной почты?

3 лайка

Нет, эта строка фильтруется при разделении mbox на отдельные сообщения. Вам нужно сохранить это значение в методе each_mail, чтобы использовать его позже.

4 лайка

Мне было интересно попробовать это сделать, прежде чем я заметил, что Mailman хранит письма в формате mbox в их первоначальном, неизменном виде, так что строка «From:» содержит тот же адрес отправителя, что и строка «From » во всех случаях, даже когда письмо отправлено «From: listname-bounces@listname.domain.com»). :man_facepalming:

У меня не было установленной среды разработки Discourse или даже Ruby, но я смог продвинуться с помощью https://rubular.com/, https://replit.com/languages/ruby (и DuckDuckGo). Если вы готовы взглянуть на это, буду благодарен, если вы сообщите, сработало бы это (или почти сработало), если бы это потребовалось…

    def each_mail(filename)
      raw_message = +''
      first_line_number = 1
      last_line_number = 0

      each_line(filename) do |line|
        if line.scrub =~ @split_regex
          if last_line_number > 0
            # Мы перешли к началу СЛЕДУЮЩЕГО письма
            yield raw_message, first_line_number, last_line_number
            raw_message = +''
            first_line_number = last_line_number + 1
          else
            # Мы перешли к началу ЭТОГО письма, поэтому получаем адрес электронной почты
            new_email = line.match(/^From (\S+@\S+).*/).captures
          end
        else
          raw_message << line
        end

        last_line_number += 1
      end

      # Получаем старый адрес электронной почты (строка «From:»)
      old_email = raw_message.match(/^From: .*</(\S+@\S+)>/).captures

      # Заменяем адрес «From » в строке «From:»
      raw_message = raw_message.sub(old_email, new_email)

      yield raw_message, first_line_number, last_line_number if raw_message.present?
    end
3 лайка

Что ж, назовём это почти:wink:

1 лайк

Ха-ха… «Так что ты говоришь мне, что есть шанс!?»

3 лайка

После успешного импорта почтовых архивов (mbox) в содержимом сообщений будут отображаться адреса электронной почты, которые ранее были скрыты (обфусцированы) серверами Gmane или mailman2. Это позволяет ботам, собирающим адреса, извлекать их, и я ищу способ избежать этого.

  1. Глобальное удаление адресов электронной почты из сообщений (возможно, с помощью плагина отображения?)
  2. Существует ли какая-либо настройка сайта, которая уже решает эту задачу?
  3. Есть ли другая идея?

Заранее спасибо за вашу помощь!

5 лайков

Это взаимоисключающий выбор?

Когда я пытался импортировать свой ящик MM2 mbox в MM3, примерно четверть писем оказались «сиротами» (ответы ошибочно воспринимались как начало новых веток), потому что у них не было нужных заголовков. Pipermail в MM2 может структурировать архив по теме (если нет Message-ID или как там называется другой заголовок — не помню), но, насколько я помню, Postorius в MM3 игнорирует тему. Поэтому в идеале ваш скрипт должен делать то же самое, что и Pipermail, и в большинстве случаев правильно обрабатывать мой список :slight_smile:

Также — если письма импортируются вперемешку, как указано выше, есть ли в Discourse способ это исправить? Или единственный выход — использовать index_only и либо добавить заголовки в файл mbox, либо пересобрать index.db, как предложено в цитируемом ниже посте?

Спасибо.

3 лайка

Да, это так.

Не совсем. Ну, можно перемещать сообщения, но это утомительно, даже с автоматизацией.

Думаю, это лучший способ решить вашу проблему, если только вы не чувствуете себя комфортно, работая над скриптом импорта и добавляя какой-то гибридный режим, который группирует по Message-ID и теме, если первое отсутствует.

3 лайка

Импорт из Google Groups в настоящее время не работает, так как Google изменил интерфейс и убрал схему AJAX-сканирования, которую они ещё в 2015 году объявили устаревшей.

Удалось ли кому-нибудь использовать Google Takeout для экспорта файлов mbox?

4 лайка

Здравствуйте,

Как мы можем использовать это для импорта групп Google в облачную версию Discourse, а не в локальную?

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

Скрипт для группы Google может быть капризным в настройке аутентификации. В прошлый раз, когда я его использовал, мне пришлось поиграть с конечной точкой входа в систему, чтобы заставить его работать.

1 лайк

Вы помните изменение, которое вы внесли, чтобы вход в систему заработал? Я получаю следующую ошибку, хотя использовал то же расширение, что указано в начальных шагах для создания файла с cookie. Кстати, я работаю с частной группой доменов.

Logging in...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options as a parameter for driver initialization is deprecated. Use :capabilities with an Array of value capabilities/options if necessary instead.
Traceback (most recent call last):
        31: from script/import_scripts/google_groups.rb:293:in `<main>'
        30: from script/import_scripts/google_groups.rb:237:in `crawl'
        29: from script/import_scripts/google_groups.rb:181:in `login'
        28: from script/import_scripts/google_groups.rb:196:in `add_cookies'
        27: from script/import_scripts/google_groups.rb:196:in `each'
        26: from script/import_scripts/google_groups.rb:200:in `block in add_cookies'
        25: from /usr/local/lib/ruby/gems/2.7.0/gems/selenium-webdriver-4.0.3/lib/selenium/webdriver/common/manager.rb:61:in `add_cookie'
        24: from /usr/local/lib/ruby/gems/2.7.0/gems/selenium-webdriver-4.0.3/lib/selenium/webdriver/remote/bridge.rb:349:in `add_cookie'
#0 0x557491640f93 <unknown>: invalid cookie domain: Cookie 'domain' mismatch (Selenium::WebDriver::Error::InvalidCookieDomainError)

Извините, но исправление входа недостаточно.

2 лайка

Исправила ли более недавняя редизайн что-либо?

Нет, если только они не вернули эту функцию за последние 25 дней. Я не думаю, что они это сделают, поэтому парсеру потребуется полная переработка.

1 лайк