Как эффективно внедрить систему новостной рассылки для предотвращения дублирования электронных писем?

У нас есть сайт электронной коммерции с примерно 500 000 активных клиентов. Мы регулярно отправляем новостные рассылки через внешнюю почтовую службу (https://www.campaignmonitor.com/) Однако по мере роста компании и увеличения числа наших клиентов расходы на нашу рассылку возрастают.
Недавно я столкнулся с Amazon SES, который идеально подходит для нас, поскольку они дешевы, и, поскольку мы уже используем AWS для наших серверов, это упрощает обслуживание. Я знаю, что есть более дешевые альтернативы, но я бы предпочел придерживаться Amazon SES.

Допустим, я создаю в своей системе информационный бюллетень, который рассылает электронное письмо всем, у кого сегодня день рождения. Так получилось, что сегодня у 400 000 человек день рождения, и отправлено 400 000 писем.
На следующий день у оставшихся 100 000 человек есть дни рождения, а также еще 100 000 человек, которые вчера уже получили электронное письмо с днем ​​рождения, но изменили дату своего рождения на этот день, потому что они ввели это неправильно при регистрации. Теперь система видит 200 000 электронных писем для отправки, но должна знать, что нужно отправить только 100 000 из них, потому что 100 000 уже получили электронное письмо за период времени (365 дней).

У меня проблема с базой данных и эффективностью скриптов.

В первый день я сохраняю адреса электронной почты 400 000 человек в таблице «отправлено».
На второй день я получаю список всех адресов электронной почты для отправки. У меня тогда есть следующие варианты:

  • Запросите «отправленную» таблицу 200 000 раз, чтобы узнать, на какие адреса электронной почты отправлять — крайне неэффективно, плюс ненужная нагрузка на сервер, на котором работает сам сайт.
  • Получить всю «отправленную» таблицу, сохранить в массиве и отфильтровать соответственно — быстро (всего 1 запрос БД), но требует много оперативной памяти. В настоящее время я так поступаю, но, очевидно, я получаю исчерпанные ошибки PHP-памяти, так что это больше не жизнеспособно, особенно по мере роста сайта.
  • Отсортируйте 200 000 адресов электронной почты по алфавиту и запросите таблицу «отправлено» в пакетном режиме, например, все адреса электронной почты A, все адреса электронной почты B и т. Д. — Быстро и должно использовать меньше оперативной памяти в зависимости от условий пакета, но что, если все 200 000 адресов электронной почты начинаются с буквы S?
  • Что-то другое?!

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

Если в Amazon SES встроена эта функциональность, я хотел бы узнать, где я могу ее найти! Я искал их документы, но не вижу этого.

У кого-нибудь есть опыт в этой области или есть какие-то предложения? Я несколько дней ломал голову, пытаясь найти хорошее решение, но я просто не могу ничего найти.

ПОМОГИТЕ! 🙂


РЕДАКТИРОВАТЬ: я использую MySQL. Я изучил No-SQL, но не чувствую, что это необходимо.

РЕДАКТИРОВАТЬ: День рождения вещь просто пример бюллетеня. Это должна быть полностью общая система, которая не основывается на каких-либо предопределенных представлениях о том, что содержат данные.

РЕДАКТИРОВАТЬ: сервер уже реализует хорошие методы электронной почты, такие как SPF, DKIM и т. Д.

РЕДАКТИРОВАТЬ: Я решил реорганизовать вещи и создать свой собственный индексатор на основе файлов и / или памяти, который в некоторой степени решает проблему. Дело закрыто, по крайней мере, на данный момент.

0

Решение

Вы можете написать свою собственную систему или использовать существующий инструмент. На Google Sendy https://sendy.co/ приходит как первый результат для «php mysql SES newsletter», который, похоже, подходит вам по списку отправленных вами тегов. Есть тысячи других программ на основе PHP / Mysql, которые могут вам подойти. Тот выглядел довольно опрятным.

Что касается обеспокоенности по поводу нагрузки на сервер. Я бы раскрутил «маленький» экземпляр в AWS и использовал бы его только для своей почтовой системы. Таким образом, вам не нужно беспокоиться о длительных процессах или тайм-аутах, которые могут вызвать проблемы на рабочем сайте. 200 000 или 500 000 записей на самом деле не так много. Могу поспорить, что вы тратите больше времени на ожидание ответа Amazon SES, чем на ожидание возврата или анализа.

2

Другие решения

Других решений пока нет …