Только что сделал у себя так (Laravel)
модель UserMessage
user_id // отправитель
notifiable_id // получатель
message_class // класс нотификации или мейл-класс
message // текст мейл-письма или уведомления
created_at
Перед тем как отправить делаешь нужную проверку (для каждого класса индивидуально или по шаблону)
// Проверяем есть ли такое сообщение в указанном периоде
return UserMessage::where('notifiable_id', $notifiableId)
->where('user_id', $user->id)
->where('message', $message)
->where('message_class', $messageClass)
->where('created_at', '>', now()->subMinute())
->exists();
Только у меня через hasMany отношение у модели юзер. Плюс еще в том что записывается сообщение в бд, которые юзеры отправляют по емейл, давно хотел сделать) А записи для нотификаций очищаются кроном раз в день. Написал несколько тестов на спам - все ок. Возможно есть изъяны и можно улучшить, я сильно не вникал в проблему и написал по быстрому.