После успешного импорта почтовых архивов ( mbox ) в содержимом сообщений будут отображаться адреса электронной почты, которые ранее были скрыты серверами Gmane или mailman2. Это позволяет ботам, собирающим адреса, извлекать их из Discourse, и я ищу способ этого избежать.
Глобальное удаление адресов электронной почты из сообщений (возможно, с помощью плагина отображения?)
Существующая настройка сайта, которая уже это делает
Итак, это проблема импорта, которую (если у вас ещё есть возможность) следует исправить на этапе импорта. Я посмотрел ваш форум, и он полон битого контента (заголовки писем, неправильное форматирование отступов) из-за того, что старые письма не обрезаются, а также из-за того, что письма, являющиеся ответами друг другу, размещены в разных темах.
Либо вы включили show_trimmed_content (здесь) во время импорта, либо формат ваших сообщений не был распознан кодом обрезки ответов (здесь). Хотя, похоже, есть и множество других проблем.
Хорошее предположение: я действительно установил show_trimmed_content в true, потому что код обрезки ответов часто удаляет больше, чем нужно. Это происходит не только с импортированными mbox-файлами, но и ежедневно с ответами, приходящими по электронной почте. Хотя теоретически можно улучшить работу обрезки, это казалось битвой с ветряными мельницами. Пользователи почты всегда: (i) отправляют письма с некорректным форматированием по разным причинам, и (ii) ожидают, что они будут отображаться полностью.
Действительно, при импорте есть и другие проблемы: он далёк от идеала. Хотя я с радостью готов обсудить их, они не являются срочной задачей.
Поскольку похоже, что я не упустил никакой опции в процессе импорта, которая могла бы скрыть адреса электронной почты, остаются, по-видимому, два варианта:
Глобально заменить содержимое в сообщениях чем-то вроде s/{email_regexp}/obfuscated/.
Найти или написать плагин, который будет скрывать отображаемое содержимое (HTML-конвертер?) с помощью s/{email_regexp}/obfuscated/.
убедитесь, что вы создали резервную копию Discourse, прежде чем выполнять следующие действия
Вот как заменить все адреса электронной почты в постах на [email_redacted]. Регулярное выражение довольно ограничено и, вероятно, пропустит некоторые адреса, но я предпочитаю выражение, которое могу прочитать и понять при изменении содержимого всех постов.
$ ./launcher enter app
/var/www/discourse# su - postgres -c psql
psql (13.2 (Debian 13.2-1.pgdg100+1))
Введите "help" для справки.
postgres=# \c discourse
Вы теперь подключены к базе данных "discourse" как пользователь "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