панику рековерить
Поддерживаю. Причины паник, разумеется, стоит исправлять, но стоит их ловить на верху каждой созданной горутины, где она, с не нулевой вероятностью: может произойти, и нас не устроит аварийное завершение программы в таком случае.
Я бы сделал чтобы: Отправляющие горутины через канал возвращали что-нибудь вроде struct{EmailId, error}, в случае паники делали revover, и отправляли стектрейс в ошибке.
Родительская горутина была panic-safe (без использования стороннего кода, небезопасных операций без проверок), собирала все результаты, и одной транзакцией обновляла базу. Обращение к базе тоже стоит завернуть так, чтобы в случае паники мы не теряли данные об отправке: пробовали записать снова, или сохраняли локально.