Массовая рассылка писем без дубликатов

Представьте, что участник выбрал группы и подкатегории, которые его интересуют.

Я хочу отправить объявление тем, кто выбрал любую из этих групп или подкатегорий.

Пример: Город состоит из главного глобального города, нескольких районов и тем.
Также у меня есть группы, специфичные для конкретных пар «район–тема».

Пользователь может выбрать:

  • Конкретную тему (которая является общей группой);
  • Группу в своём районе по этой теме;
  • Группы в двух других районах по этой теме;
  • Вторую конкретную тему (которая также является общей группой);
  • Все группы во всех районах по этой теме;
  • Главную группу для главного города;

Если я захочу отправить письмо одной или нескольким группам или подкатегориям внутри этих групп, некоторые пользователи могут получить одно и то же объявление несколько раз, особенно если человек выбрал группу главного города, которая пересылает информацию из всех районов и по всем темам, плюс некоторые подгруппы и т. д.

Вопрос: Как подготовить рассылку, охватывающую более одной целевой группы и списка подкатегорий, без дубликатов, и отправить это сообщение?

  1. Нужно ли использовать внешний скрипт?

  2. Нужно ли использовать внешний процессор электронной почты?

Спасибо,

Марк

Если вам требуется гарантированная доставка без дубликатов для произвольных наборов групп и категорий, необходимо:

  • Экспортировать списки пользователей из целевых групп или категорий.
  • Объединить и удалить дубликаты в этих списках — вручную или с помощью скрипта.
  • Использовать внешний процессор электронной почты для отправки сообщения в очищенный от дубликатов список.

Это наиболее надёжный способ гарантировать, что пользователи не получат одно и то же объявление несколько раз.

Спасибо. Знаете ли вы, можно ли это автоматизировать? Например, запрашивать у API сообщения о каждой новой регистрации участника/выходе или выборе группы/категории, получая только новые изменения. Или (менее предпочтительно) получать полный список с указанием их групп/категорий, который может запрашивать программа на Python?

(Я могу написать код на Python). Вопрос скорее об автоматизации взаимодействия между Discourse и Python, а также между Python и почтовым процессором.

Discourse предоставляет надежный REST API, который позволяет:

  • Получать списки всех пользователей, групп и членства пользователей в группах
  • Отслеживать регистрацию новых пользователей и действия вступления/выхода из групп (через опрос или веб-хуки)
  • Получать конфигурации членства в категориях

Вы можете запросить полный список или попытаться отслеживать недавние изменения. Для полной детекции инкрементальных изменений, возможно, потребуется реализовать проверки на основе времени и локально управлять различиями. Аутентификация осуществляется через заголовки HTTP (Api-Key, Api-Username).

Однако для более эффективного и интегрированного управления я рекомендую создать пользовательский плагин Discourse. Плагин работает внутри среды сервера Discourse и предоставляет прямой доступ к внутренним компонентам Discourse, таким как:

  • Обновления членства пользователей, групп и категорий
  • Хуки событий жизненного цикла для регистрации и изменений в группах
  • Прямой доступ к внутренним API и базе данных Discourse

Такой подход обеспечивает возможности работы в реальном времени и большую гибкость при реализации автоматизированных рабочих процессов, таких как обработка почты или сегментация пользователей.

  1. Можем ли мы создать плагин, который будет работать на нашем экземпляре, даже если он размещён Discourse, или нам нужно разместить его самостоятельно?

  2. Затем, для отправки электронной почты, нужно ли мне экспортировать список, созданный плагином?

  3. Что будет делать плагин? Могу ли я создать своего рода длинный список непосредственно на сервере Discourse? Или идея заключается в отправке информации на другой сервер?

Спасибо

Если это неофициальный плагин, я думаю, что вы можете установить его только на плане Enterprise, иначе вам придется разместить его самостоятельно.

  • Генерировать динамические списки (данные о пользователях/группах/категориях) и отображать или хранить их внутри Discourse.
  • Экспортировать данные в файл или создавать загружаемые административные отчёты.
  • Выполнять HTTP(S)-запросы к другому серверу (например, отправлять обновления списков пользователей в ваш инструмент на Python/почтовый сервис).
  • Запускать вебхуки, планировать задачи или напрямую интегрироваться с внешними API — всё это изнутри Discourse без необходимости опроса (polling).

@EMHmark7, вы в итоге решили, как хотите это реализовать?

В Discourse один из способов сделать то, что вам нужно, — это создать категории и позволить участникам сообщества «подписаться» на эти категории, выбрав уровень уведомлений «Слежение». Параметры «Слежение по умолчанию за категориями» или «Слежение по умолчанию за первым сообщением в категории» удобны для создания категории объявлений на вашем сайте, чтобы охватить всех пользователей.

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

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

Однако мне кажется, что вам может понадобиться другой инструмент, если ваша цель — не форум или сообщество, куда люди заходят для участия в обсуждениях, а набор рассылочных списков, отправляющих электронные письма.

Всё это может быть реализовано в коде вне Discourse, поэтому устанавливать его не обязательно. Если вы используете WordPress, то многое из этого можно получить бесплатно с помощью GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub, а затем использовать другой плагин WordPress для обработки части рассылки.