Вот один из подходов, но он требует, чтобы вы сохранили дополнительное поле mailorder
с каждой записью пользователя.
Просмотрите каждую запись пользователя и добавьте ее идентификатор в список списков, где каждый изsublists состоит из адреса электронной почты для конкретного хоста.Таким образом, у вас будет один список для gmail.com
, один для yahoo.com
и т. Д.
Рассчитайте длину «самого короткого» списка, превышающего некоторый разумный минимум, чтобы ни в одном списке не было больше 2 или 3раз количество предметов в этом коротком списке.Для каждого списка рассчитайте количество адресов за раунд, которое нужно взять из этого списка, используя верхний предел длины списка, деленный на длину «самого короткого» списка.Должно быть не меньше 1. Вызовите itemCount i для списка i
.
Установите mailOrder
в 0.
Goчерез список списков, извлекая первые itemCount i идентификаторы из каждого списка i
и обновляя поле mailorder
для соответствующих записей со значением переменной mailOrder
,Увеличивайте mailOrder
на единицу и повторяйте, пока все списки не будут исчерпаны.
При отправке электронных писем сортируйте записи пользователей по столбцу mailorder
(было бы неплохо иметь индекс для этого, чтобы сделать его быстрым).Периодически перезапускайте алгоритм для учета новых пользователей, которым может быть предоставлено временное mailorder
на единицу больше, чем максимальное mailorder
.
Альтернативный, возможно, лучший, подход будет заключаться в фиксированном максимальном числеколичество писем в каждом раунде до тех пор, пока список не будет исчерпан, и отправляйте по одному электронному письму на все адреса конкретного хоста (возможно, используя Bcc) сразу в каждом раунде.Это поможет минимизировать количество электронных писем, которые вы на самом деле отправляете.Выберите количество адресов за раунд в зависимости от того, что вы можете безопасно отправить на этот почтовый хост, не выходя за его пределы.