Migrar una lista de correo a Discourse (mbox, Listserv, Google Groups, etc)

¿Has revisado la base de datos? Mi impresión sobre este problema es que, por alguna razón, el campo de correo electrónico no se está creando correctamente allí y, por lo tanto, no se puede leer.

Consulta el punto 2.3 en la publicación original para verificar la base de datos de índices.

3 Me gusta

La lista Mailman 2 que estoy considerando importar a Discourse ha tenido (durante parte de su existencia) from_is_list establecido en Munge From, de modo que el encabezado “From:” es:

From: Listname <listname-bounces@listdomain.com> On Behalf Of [Nombre del remitente original]

en lugar de:

From: [Nombre del remitente original] <usuario@ejemplo.com>

Esto me hizo pensar que el importador trataría cada uno de estos mensajes como si provinieran del mismo usuario (con la dirección de correo listname-bounces@listdomain.com)… PERO…

La línea inicial que marca el comienzo de un nuevo correo en el archivo mbox todavía comienza con:

From usuario@ejemplo.com [Grupo de fecha y hora]

(y los archivos de Hyperkitty también muestran la dirección de correo del remitente original de forma normal).

Así que mi pregunta es: ¿el script del importador obtiene la dirección del remitente del encabezado “From:” o de la línea "From "? Gracias.

Lo discutí brevemente en un tema anterior: Working on a mailman2 to discourse migration script - #10 by dachary

1 me gusta

Se está utilizando la cabecera From:.

1 me gusta

¡Gracias por la rápida respuesta! ¿Qué tan difícil sería cambiar esto? No necesariamente de forma oficial, aunque podría ayudar a otros, sino solo para que yo modifique el script antes de ejecutarlo. No sé nada de Ruby (¡aún!), pero si se trata solo de cambiar dos puntos por un espacio…

No es un cambio sencillo, pero debería ser factible. No necesariamente tienes que implementarlo en el script de importación. Si conoces otro lenguaje de scripting, estoy seguro de que no será muy difícil actualizar los encabezados From: en los archivos mbox antes de ejecutar la importación…

Pero, siéntete libre de corregirlo en el script de importación. ¡Una PR es bienvenida!
Un buen punto de partida para corregir el encabezado debería ser el método each_mail

5 Me gusta

¡Saludos! Parece que esto es lo que actualmente lo decide, desde las líneas 69-70 de indexer.rb:

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

¿Sería posible en ese momento obtener la primera línea del correo mbox (es decir, la línea “De [dirección de correo electrónico] [fecha y hora]”) de parsed_email y extraer la dirección de correo electrónico de ella?

3 Me gusta

No, esa línea se filtra cuando el mbox se divide en mensajes individuales. Necesitas guardar ese valor en el método each_mail para poder usarlo más tarde.

4 Me gusta

Me divertí intentando hacer esto, antes de darme cuenta de que Mailman almacena los correos en el formato mbox en su forma original y sin alteraciones, de modo que la línea “From:” contiene la misma dirección de correo (del remitente original) que la línea "From " en todos los casos, incluso cuando el correo ha sido enviado “From: listname-bounces@listname.domain.com”). :man_facepalming:

Me vi limitado por no tener una instalación de Discourse para desarrollo, ni siquiera Ruby, pero pude avanzar un poco usando https://rubular.com/ y Ruby Online Compiler & Interpreter - Replit (y DuckDuckGo). Si estuvieras dispuesto a echar un vistazo, te agradecería mucho que me hicieras saber si esto habría funcionado (o casi funcionado) en caso de haber sido necesario…

    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
            # Ahora estamos al inicio del SIGUIENTE correo
            yield raw_message, first_line_number, last_line_number
            raw_message = +''
            first_line_number = last_line_number + 1
          else
            # Ahora estamos al inicio de ESTE correo, así que obtén la dirección de correo
            new_email = line.match(/^From (\S+@\S+).*/).captures
          end
        else
          raw_message << line
        end

        last_line_number += 1
      end

      # Obtén el correo antiguo (línea "From:")
      old_email = raw_message.match(/^From: .*\s*<(\S+@\S+)>/).captures

      # Coloca la dirección "From " en la línea "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 Me gusta

Bueno, digamos que casi:wink:

1 me gusta

Jaja… "¿Me estás diciendo que hay una oportunidad!?

https://www.youtube.com/watch?v=wGdhc9k07Ms"

3 Me gusta

Tras una importación exitosa de archivos de correo (mbox), el contenido de los mensajes mostrará direcciones de correo electrónico que habrían sido ofuscadas por Gmane o el servidor de archivos mailman2. Esto permite que los bots que recopilan direcciones las recolecten, y estoy buscando una forma de evitarlo.

  1. eliminar globalmente los correos electrónicos en las publicaciones (¿quizás un plugin de visualización?)
  2. alguna configuración del sitio que ya haga eso
  3. ¿otra idea?

¡Gracias de antemano por su ayuda!

5 Me gusta

¿Es una cuestión de elegir entre una u otra opción?

Cuando intenté importar mi archivo mbox de MM2 a MM3, aproximadamente una cuarta parte de los correos quedaron huérfanos (las respuestas se trataron erróneamente como el inicio de nuevos hilos) porque no tenían las cabeceras correctas. Pipermail en MM2 puede estructurar el archivo utilizando el Asunto (si no hay un Message-ID o como se llame la otra cabecera —lo tengo olvidado—), pero, la última vez que lo comprobé, Postorius en MM3 ignora el Asunto. Por lo tanto, idealmente, tu script haría lo mismo que Pipermail y lo acertaría en gran medida en mi lista :slight_smile:

Además, si los correos se importan desordenadamente, como se mencionó anteriormente, ¿hay alguna manera en Discourse de corregirlo? ¿O la única solución es probar index_only y, bien añadir cabeceras al archivo mbox, bien reorganizar el index.db como se sugiere en la cita a continuación?

Gracias.

3 Me gusta

Sí, lo es.

No realmente. Bueno, podrías mover los mensajes, pero eso es tedioso incluso con automatización.

Creo que esa es la mejor manera de resolver tu problema, a menos que te sientas cómodo trabajando en el script de importación y agregando algún tipo de modo híbrido que agrupe por Message-ID y asunto en caso de que el primero falte.

3 Me gusta

La importación desde Google Groups está actualmente rota, ya que Google cambió la interfaz de usuario y eliminó el esquema de rastreo AJAX que habían descontinuado en 2015.

¿Alguien ha logrado usar Google Takeout para exportar archivos mbox?

4 Me gusta

Hola,

¿Cómo podemos usar esto para importar los grupos de Google a Discourse SaaS en lugar de en local?

Si pagas por alojamiento empresarial durante un año, lo harán gratis. De lo contrario, debes hacerlo en tu propio servidor, subir la copia de seguridad a tu instancia y enviar un correo al soporte para solicitarles que la restauren.

El script del grupo de Google puede ser complicado para que la autenticación funcione correctamente. La última vez que lo usé, tuve que ajustar el punto final de inicio de sesión para que funcionara.

1 me gusta

¿Recuerdas el cambio que hiciste para que el inicio de sesión funcionara? Estoy obteniendo el siguiente error, aunque usé la misma extensión mencionada en los pasos iniciales para generar el archivo de cookies. Por cierto, estoy trabajando con un grupo de dominio privado.

Iniciando sesión...
2021-10-31 12:54:41 WARN Selenium [DEPRECATION] [:browser_options] :options como parámetro para la inicialización del controlador está obsoleto. Usa :capabilities con un Array de capacidades/opciones de valor si es necesario en su lugar.
Rastreo (última llamada primero):
        31: desde script/import_scripts/google_groups.rb:293:in `\u003cmain\u003e'
        30: desde script/import_scripts/google_groups.rb:237:in `crawl'
        29: desde script/import_scripts/google_groups.rb:181:in `login'
        28: desde script/import_scripts/google_groups.rb:196:in `add_cookies'
        27: desde script/import_scripts/google_groups.rb:196:in `each'
        26: desde script/import_scripts/google_groups.rb:200:in `block in add_cookies'
        25: desde /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: desde /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: dominio de cookie inválido: la cookie 'domain' no coincide (Selenium::WebDriver::Error::InvalidCookieDomainError)

Lo siento, pero arreglar el inicio de sesión no es suficiente.

2 Me gusta

¿Ha solucionado algo el rediseño más reciente?

No, a menos que hayan vuelto a agregar la función en los últimos 25 días. No creo que lo hagan, por lo que el scraper necesitará una revisión completa.

1 me gusta