Защита адреса mailto:foo@bar.com при импорте почтовых архивов

Здравствуйте,

После успешного импорта почтовых архивов ( mbox ) в содержимом сообщений будут отображаться адреса электронной почты, которые ранее были скрыты серверами Gmane или mailman2. Это позволяет ботам, собирающим адреса, извлекать их из Discourse, и я ищу способ этого избежать.

  1. Глобальное удаление адресов электронной почты из сообщений (возможно, с помощью плагина отображения?)
  2. Существующая настройка сайта, которая уже это делает
  3. Другая идея?

Заранее спасибо за помощь!

Почему в содержимом сообщений отображаются адреса электронной почты? Можете привести пример?

Я отправлю вам ссылку на публичные посты в личном сообщении, чтобы не провоцировать ботов больше, чем они уже есть :stuck_out_tongue:

Вот замаскированная версия сообщения:


23 декабря 2010 г., 14:05, [redacted] l <[redacted]@gmail.com](mailto:[redacted]@gmail.com)
mailto:[redacted]@gmail.com> написал(а):

Для информации: когда есть обновления, вот как я действую

Итак, это проблема импорта, которую (если у вас ещё есть возможность) следует исправить на этапе импорта. Я посмотрел ваш форум, и он полон битого контента (заголовки писем, неправильное форматирование отступов) из-за того, что старые письма не обрезаются, а также из-за того, что письма, являющиеся ответами друг другу, размещены в разных темах.

Либо вы включили show_trimmed_content (здесь) во время импорта, либо формат ваших сообщений не был распознан кодом обрезки ответов (здесь). Хотя, похоже, есть и множество других проблем.

Хорошее предположение: я действительно установил show_trimmed_content в true, потому что код обрезки ответов часто удаляет больше, чем нужно. Это происходит не только с импортированными mbox-файлами, но и ежедневно с ответами, приходящими по электронной почте. Хотя теоретически можно улучшить работу обрезки, это казалось битвой с ветряными мельницами. Пользователи почты всегда: (i) отправляют письма с некорректным форматированием по разным причинам, и (ii) ожидают, что они будут отображаться полностью.

Действительно, при импорте есть и другие проблемы: он далёк от идеала. Хотя я с радостью готов обсудить их, они не являются срочной задачей.

Поскольку похоже, что я не упустил никакой опции в процессе импорта, которая могла бы скрыть адреса электронной почты, остаются, по-видимому, два варианта:

  • Глобально заменить содержимое в сообщениях чем-то вроде s/{email_regexp}/obfuscated/.
  • Найти или написать плагин, который будет скрывать отображаемое содержимое (HTML-конвертер?) с помощью s/{email_regexp}/obfuscated/.

Или… я иду не в ту сторону?

Это путь, по которому мне следует пойти.

Я бы использовал PostgreSQL regexp_replace для замены всех адресов электронной почты в posts.raw и posts.cooked.

Я сделаю это и опубликую инструкцию в этой теме, спасибо за совет!

:warning: убедитесь, что вы создали резервную копию Discourse, прежде чем выполнять следующие действия :warning:

Вот как заменить все адреса электронной почты в постах на [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