Migrar uma lista de emails para Discourse (mbox, Listserv, Google Groups, etc)

Você já olhou no banco de dados? Minha intuição sobre esse problema é que, por algum motivo, o campo de e-mail não está sendo criado corretamente lá e, portanto, não pode ser lido.

Veja o item 2.3 na OP para verificar o banco de dados de índice.

3 curtidas

A lista do Mailman 2 que estou considerando importar para o Discourse teve (por parte de sua existência) a configuração from_is_list definida como Munge From, de modo que o cabeçalho “From:” fica assim:

From: Listname <listname-bounces@listdomain.com> On Behalf Of [Nome do remetente original]

em vez de:

From: [Nome do remetente original] <username@example.com>

Isso me fez pensar que o importador importaria cada uma dessas mensagens como se viessem do mesmo usuário (com o endereço de e-mail listname-bounces@listdomain.com)… MAS…

A linha inicial que marca o início de um novo e-mail no arquivo mbox ainda começa com:

From username@example.com [Data hora grupo]

(e os arquivos do Hyperkitty mostram o endereço de e-mail do remetente original normalmente também).

Então, minha pergunta é: o script de importação obtém o endereço do remetente do cabeçalho “From:” ou da linha "From "? Obrigado.

Discuti isso brevemente em um tópico anterior: Working on a mailman2 to discourse migration script - #10 by dachary

1 curtida

Está usando o cabeçalho From:.

1 curtida

Obrigado pela resposta rápida! Quão difícil seria alterar isso? Não necessariamente de forma oficial — embora possa ajudar outros —, mas apenas para que eu possa modificar o script antes de executá-lo. Ainda não sei Ruby, mas se for apenas trocar dois pontos por um espaço…

Não é uma mudança simples, mas deve ser viável. Você não precisa necessariamente implementá-la no script de importação. Se você conhece outra linguagem de script, tenho certeza de que não será muito difícil atualizar os cabeçalhos From: nos arquivos mbox antes de executar a importação…

Mas, sinta-se à vontade para corrigir isso no script de importação. Um PR é bem-vindo!
Um bom ponto de partida para corrigir o cabeçalho deve ser o método each_mail

5 curtidas

Ótimo. Parece que isso é o que atualmente decide, das linhas 69 a 70 de indexer.rb:

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

Seria possível, nesse ponto, obter a primeira linha do e-mail mbox (ou seja, a linha “De [endereço de e-mail] [data e hora]”) de parsed_email e extrair o endereço de e-mail a partir dela?

3 curtidas

Não, essa linha é filtrada quando o mbox é dividido em mensagens individuais. Você precisa salvar esse valor no método each_mail para poder usá-lo depois.

4 curtidas

Diverti-me bastante tentando fazer isso, antes de perceber que o Mailman armazena os e-mails no mbox em sua forma original e intacta, de modo que a linha “From:” contém o mesmo endereço de e-mail (do remetente original) que a linha "From " em todos os casos, mesmo quando o e-mail foi enviado “From: listname-bounces@listname.domain.com”. :man_facepalming:

Fiquei limitado por não ter uma instalação de desenvolvimento do Discourse, ou mesmo o Ruby, mas consegui avançar um pouco usando https://rubular.com/ e Ruby Online Compiler & Interpreter - Replit (e o DuckDuckGo). Se você estiver disposto a dar uma olhada, ficaria grato se pudesse me dizer se isso teria funcionado (ou quase funcionado) caso fosse necessário…

    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
            #Estamos agora no início do PRÓXIMO e-mail
            yield raw_message, first_line_number, last_line_number
            raw_message = +''
            first_line_number = last_line_number + 1
          else
            #Estamos agora no início DESTE e-mail, então obtenha o endereço de e-mail
            new_email = line.match(/^From (\S+@\S+).*/).captures
          end
        else
          raw_message << line
        end

        last_line_number += 1
      end

      #Obter o e-mail antigo (linha "From:")
      old_email = raw_message.match(/^From: .*<(\S+@\S+)>/).captures

      #Colocar o endereço "From " na linha "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 curtidas

Bem, vamos dizer que foi quase:wink:

1 curtida

Haha… “Então você está me dizendo que há uma chance!?”

3 curtidas

Após uma importação bem-sucedida de arquivos de e-mail (mbox), o conteúdo das mensagens exibirá endereços de e-mail que teriam sido ofuscados pelo Gmane ou pelo servidor de arquivo mailman2. Isso permite que bots que coletam endereços os capturem, e estou procurando uma maneira de evitar isso.

  1. remover globalmente e-mails nos posts (talvez um plugin de exibição?)
  2. alguma configuração do site que já faça isso
  3. outra ideia?

Obrigado antecipadamente pela ajuda!

5 curtidas

É uma questão de escolha exclusiva entre uma coisa ou outra?

Quando tentei importar meu mbox do MM2 para o MM3, cerca de um quarto dos e-mails ficaram órfãos (respostas foram erroneamente tratadas como início de novos tópicos) porque não tinham os cabeçalhos corretos. O Pipermail no MM2 consegue estruturar o arquivo usando o Assunto (se não houver Message-ID ou como quer que se chame o outro cabeçalho — esqueci), mas, na última vez que verifiquei, o Postorius no MM3 ignora o Assunto. Então, idealmente, seu script faria o mesmo que o Pipermail e acertaria a maior parte na minha lista :slight_smile:

Além disso — se os e-mails forem importados de forma desordenada, como mencionado acima, há alguma maneira no Discourse de corrigir isso? Ou a única solução é tentar index_only e adicionar cabeçalhos ao arquivo mbox ou reorganizar o index.db, conforme sugerido na postagem citada abaixo?

Obrigado.

3 curtidas

Sim, é.

Não exatamente. Bem, você poderia mover as postagens, mas isso é trabalhoso, mesmo com automação.

Acho que essa é a melhor maneira de resolver seu problema, a menos que você se sinta confortável trabalhando no script de importação e adicionando algum tipo de modo híbrido que agrupe por Message-ID e assunto, caso o primeiro esteja ausente.

3 curtidas

A importação do Google Groups está atualmente quebrada, pois o Google alterou a interface e removeu o esquema de rastreamento AJAX que eles descontinuaram em 2015.

Alguém conseguiu usar o Google Takeout para exportar arquivos mbox até agora?

4 curtidas

Olá,

Como podemos usar isso para importar grupos do Google para o Discourse SaaS, em vez de uma versão on-premise?

Se você contratar o hospedagem empresarial por um ano, eles farão isso gratuitamente. Caso contrário, você mesmo fará no seu servidor, fará o upload do backup para sua instância e enviará um e-mail para o suporte solicitando a restauração.

O script do Google Groups pode ser caprichoso para que a autenticação funcione perfeitamente. Na última vez que o usei, precisei ajustar o endpoint de login para fazê-lo funcionar.

1 curtida

Você se lembra da alteração que fez para fazer o login funcionar? Estou recebendo o seguinte erro, mesmo tendo usado a mesma extensão mencionada nas etapas iniciais para gerar o arquivo de cookies. Aliás, estou trabalhando com um grupo de domínio privado.

Logando...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options como parâmetro para inicialização do driver está obsoleto. Use :capabilities com um Array de capacidades/opções de valor, se necessário.
Rastreamento (última chamada primeiro):
        31: from script/import_scripts/google_groups.rb:293:in `\u003cmain\u003e'
        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 \u003cunknown\u003e: domínio de cookie inválido: incompatibilidade no 'domínio' do cookie (Selenium::WebDriver::Error::InvalidCookieDomainError)

Desculpe, mas corrigir o login não é suficiente.

2 curtidas

A redesign mais recente corrigiu algo?

Não, a menos que tenham reintroduzido a funcionalidade nos últimos 25 dias. Não acho que o farão, então o scraper precisará de uma reformulação completa.

1 curtida