La comprobación de correo POP3 dejó de funcionar

Tenemos un problema extraño con nuestro servidor Discourse. Durante varias semanas, la recepción de correos desde nuestro servidor POP3 interno funcionó sin ningún problema. El 16 de febrero, la recepción de correos dejó de funcionar de repente. Curiosamente, vemos actividad de Discourse en los archivos de registro de nuestro servidor POP3:

Feb 25 13:54:49 mailout popa3d[12458]: Authentication passed for discourse
Feb 25 13:54:49 mailout popa3d[12458]: 1545 messages (12060237 bytes) loaded
Feb 25 13:54:49 mailout popa3d[12458]: 0 (0) deleted, 1545 (12060237) left

Sin embargo, no se procesan nuevos correos.

Estamos utilizando la versión más reciente de Discourse 2.7.0.beta4 (desde hoy; antes era la 2.7.0.beta3). Estos son nuestros ajustes de correo:

¿Tienen alguna idea de qué podría estar fallando? ¿Qué podemos hacer para investigar el error con más detalle?

¿Son estos correos electrónicos antiguos? ¿Cuáles son las fechas de estos correos electrónicos?

Tengo prácticamente la misma situación.

POP3 funcionó durante años, pero a partir del 23 de febrero, los correos electrónicos dejaron de llegar.

Verifiqué el servidor de correo y Discourse consultó diligentemente el servidor cada pocos minutos. Sin embargo, no se recibió nada.

Los correos electrónicos permanecen en el servidor de correo.

Nota: Realicé una actualización a la versión 2.7.0.beta4 el 22 de febrero, por lo que creo que esto probablemente tenga que ver con ello…

Los correos electrónicos atrapados en el servidor de correo tienen todas fechas posteriores a que POP3 dejó de funcionar, es decir, después del 23 de febrero en mi caso.

OK, intenta esto:

Ve al servidor de correo, elimina todos los correos que haya allí. Obviamente, debe haber alguna forma de conservar los que quieras guardar…

Luego, espera a que Discourse realice la conexión POP3 de nuevo.

Esto ahora funciona para mí y los correos vuelven a aparecer.

Sospecho que algún contador interno de IDs de correo se ha corrompido durante la última actualización de la versión. @codinghorror Tal vez está configurado con un número muy grande, por lo que todos los correos se tratan como “ya leídos” o algo así…

Si no elimino todos los correos existentes, los nuevos simplemente se acumulan.

1 me gusta

El cambio más reciente en el sondeo POP3 ocurrió en enero.

Eso por sí solo no debería impedir que Discourse realice el sondeo, pero es posible que un correo entrante genere una excepción. No hay manejo de errores en el nuevo código…

@jzedlitz ¿Sigues experimentando el problema y quieres ayudar a averiguar qué está ocurriendo? ¿Hay algún error relacionado en /logs? ¿Ves un error en /sidekiq/scheduler cuando buscas Jobs::PollMailbox? ¿Ves un error al realizar un sondeo manual en la consola de Rails?

./launcher enter app
rails c

Jobs::PollMailbox.new.execute({})

Por lo general, al menos en mi caso, la situación es que la consulta POP3 tiene éxito.

Puedo ver que Discourse realiza la consulta al servidor de correo.

Sin embargo, Discourse simplemente se desconecta sin descargar ningún correo.

Al menos en mi caso, no hay errores en absoluto.

Hace un tiempo también añadimos una verificación de seguridad para ignorar el correo muy antiguo; quizás @martin lo recuerde.

Sí, ese fue el PR que @gerhard vinculó en POP3 email polling stopped working - #6 by gerhard. No debería romper nada, creo que no. Necesitaría el mensaje de correo electrónico original completo para probarlo. Este es el cambio principal en el código:

def mail_too_old?(mail_string)
  mail = Mail.new(mail_string)
  date_header = mail.header['Date']
  return false if date_header.blank?

  date = Time.parse(date_header.to_s)
  date < 1.week.ago
end

Así que supongo que podría haber un error silencioso si Time.parse falla. Ya que ni siquiera intentamos hacer algo si falta la cabecera Date.

2 Me gusta

Perdona por no responder antes. Hemos resuelto más o menos el problema vaciando la bandeja de entrada POP3 de Discourse. Inmediatamente, Discourse pudo volver a recibir mensajes. Transferí algunos de los correos electrónicos más recientes a la bandeja de entrada POP3, ahora vacía, y también pudieron ser procesados. Sin embargo, tan pronto como coloqué algunos de los 1.400 correos electrónicos más antiguos en la bandeja, Discourse dejó de procesar cualquier mensaje.

3 Me gusta

Acabo de toparme con el mismo problema. Noté que algo no funcionaba correctamente cuando los correos deberían haber creado mensajes. La bandeja de entrada POP3 tenía algunos correos (ejecuto una instancia pequeña).
Parece que agregar los mensajes uno por uno solucionó el problema; creo que ahora funciona mejor, pero debo esperar un poco para confirmarlo.

1 me gusta

Desafortunadamente, el problema ha vuelto a ocurrir. Usando formail, he dividido el mbox en mensajes individuales y los he introducido uno por uno en la cuenta POP3. Algunos mensajes (incluso los más antiguos) fueron procesados por Discourse, mientras que otros no.

¿Existe alguna forma de generar más mensajes de registro desde Jobs::PollMailbox.new.execute({}) para ver por qué se ignora un mensaje?

¿Has estado revisando /logs cuando se encuentra un correo electrónico que se niega a procesarse?

Las publicaciones anteriores parecen indicar que son mensajes específicos los que están fallando.

1 me gusta

¿Qué archivo de registro exactamente? Intenté tail -f /var/discourse/shared/standalone/log/rails/*.log, pero no aparecen mensajes mientras Discourse intenta recuperar los correos.

Como administrador, visita https://discourse.example.com/logs en tu navegador web.

Cabe destacar que la carpeta se llama /log/, y no era a lo que me refería :smirk:

1 me gusta

Gracias por la explicación. Lamentablemente, /logs/ permanece vacío mientras se recuperan los correos electrónicos. ¿Existe alguna forma de aumentar el nivel de registro?

1 me gusta

Entonces, podría haber un problema en el manejo de errores en el sondeo POP3. Alguien debe revisar el código y ver si está ocultando errores.

¿Podrías aplicar los siguientes cambios a app/jobs/scheduled/poll_mailbox.rb dentro del contenedor de Docker antes de ejecutar Jobs::PollMailbox.new.execute({}) en la consola de Rails?

       pop3.start(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password) do |pop|
+        mail_string = nil
         pop.each_mail do |p|
+          mail_string = nil
           mail_string = p.pop
           break if mail_too_old?(mail_string)
           process_popmail(mail_string)
           p.delete if SiteSetting.pop3_polling_delete_from_server?
+        rescue => e
+          puts e.message
+          puts e.backtrace.join("\n\t")
+          puts "", "MESSAGE:", mail_string if mail_string
         end
       end
1 me gusta

Ahora que sé en qué archivo buscar, pude hacer algunas pruebas por mi cuenta. El problema era la verificación mail_too_old. Después de eliminarla, los mensajes atascados se procesaron.

1 me gusta

Sí, lo sospechaba, pero sería interesante saber qué correo impidió que mail_too_old? funcionara. ¿Era realmente demasiado antiguo? ¿Falló al analizar el correo? ¿O fue algo más? Si quieres, puedes enviarme por mensaje privado el correo que estaba impidiendo que POP3 funcionara.