메일 아카이브 가져올 때 mailto:foo@bar.com의 오버페이션

안녕하세요,

메일 아카이브(mbox)를 성공적으로 가져온 후, 메시지 내용에는 Gmane 또는 mailman2 아카이브 서버에서 가려졌어야 할 이메일 주소가 그대로 표시됩니다. 이로 인해 주소를 수집하는 봇들이 Discourse에서 이메일 주소를 수집할 수 있게 되며, 이를 방지할 방법을 찾고 있습니다.

  1. 게시글에서 이메일 주소를 전역으로 제거하기 (표시 플러그인 사용 가능?)
  2. 이미 이러한 기능을 제공하는 사이트 설정이 있는지
  3. 다른 아이디어가 있는지

도움 주시면 감사하겠습니다!

왜 메시지 내용 안에 이메일 주소가 표시되나요? 예를 들어 주시겠어요?

봇들이 이미 많이 시끄러운데 더 이상 자극하지 않도록 공개된 게시물 링크를 DM으로 보내겠습니다 :stuck_out_tongue:

메시지의 난독화 버전은 다음과 같습니다:

…
2010년 12월 23일 14:05, [redacted] l <[redacted]@gmail.com](mailto:[redacted]@gmail.com)
mailto:[redacted]@gmail.com> 님이 작성:

참고로 업데이트가 있을 때 이렇게 진행합니다
…

따라서 이는 가져오기(import) 단계의 문제이며, 아직 기회가 남아 있다면 가져오기 단계에서 수정되어야 합니다. 여러분의 포럼을 확인해 보았는데, 오래된 이메일이 잘리지 않는 문제뿐 아니라 서로 답장 관계인 이메일이 서로 다른 주제(topic)에 배치되는 등 깨진 콘텐츠(이메일 헤더, 잘못된 들여쓰기)가 가득합니다.

가져오기 과정에서 show_trimmed_content(여기)가 활성화되어 있거나, 메시지 형식이 답장 트리머 코드(여기)에 의해 인식되지 않은 것 같습니다. 다만 다른 문제들도 많이 있는 것으로 보입니다.

좋은 추측입니다. 실제로 답장 트리머 코드가 지나치게 많이 잘라내는 경우가 잦아서 show_trimmed_content를 true로 설정했습니다. 가져온 mbox 파일에서만 그런 것이 아니라, 매일 이메일로 오는 답장에서도 같은 문제가 발생했습니다. 트리머를 개선하는 것이 가능할 수는 있지만, 쉽지 않은 싸움이었습니다. 이메일을 사용하는 사람들은 항상 (i) 어떤 이유에서든 이상하게 포맷된 이메일을 보내고, (ii) 그 이메일이 전체적으로 표시되기를 기대하기 때문입니다.

가져오기 과정에서 다른 문제들도 실제로 존재합니다: 완벽과는 거리가 멉니다. 논의하긴 좋지만, 당장의 시급한 문제는 아닙니다.

가져오기 옵션에서 이메일을 오블리케이트(obfuscate, 가리기)하는 옵션을 놓친 것이 아닌 것 같으니, 결국 남은 옵션은 두 가지입니다:

  • 게시물의 내용을 전역적으로 s/{email_regexp}/obfuscated/와 같은 방식으로 치환
  • 표시되는 내용(HTML 컨버터?)을 s/{email_regexp}/obfuscated/와 같은 방식으로 오블리케이트하는 플러그인을 찾거나 작성

아니면… 제가 잘못된 방향으로 가고 있는 건가요?

이 방식이 제가 취해야 할 방향인 것 같습니다.

PostgreSQL의 regexp_replace를 사용하여 posts.raw와 posts.cooked에 있는 모든 이메일 주소를 교체하겠습니다.

그렇게 하겠습니다. 조언해 주셔서 감사합니다! HOWTO를 이 주제에 게시하겠습니다.

:warning: 아래 내용을 시도하기 전에 반드시 discourse를 백업하세요 :warning:

게시물에 포함된 모든 이메일 주소를 **[email_redacted]**로 대체하는 방법은 다음과 같습니다. 이 정규 표현식은 다소 제한적이라 일부 이메일을 놓칠 수 있지만, 모든 게시물의 내용을 수정할 때 읽고 이해하기 쉬운 표현식을 선호합니다.

$ ./launcher enter app
/var/www/discourse# su - postgres -c psql
psql (13.2 (Debian 13.2-1.pgdg100+1))
Type "help" for help.

postgres=# \c discourse
You are now connected to database "discourse" as user "postgres".
discourse=# \set re '[0-9a-z._%+-]+@[a-z0-9.-]+\\.[a-z]{2,64}'
discourse=# update posts set raw = regexp_replace(raw, :'re', '[email_redacted]', 'gi') where raw ~ :'re';
UPDATE 1
discourse=# update posts set cooked = regexp_replace(cooked, :'re', '[email_redacted]', 'gi') where cooked ~ :'re';
UPDATE 1