ИМХО, компоненты, реализующие основную бизнес-логику и рассылки не должны знать друг о друге. Лучше написать класс, который знает о том, что есть события, по которым нужно отправлять письма (назовем его MailEventManager). Плюс добавить интерфейс для классов - почтовых событий. Например, пусть они возвращают текст письма, отправителя, получателя и тему. И для каждого поытового события пишем по классу, реализующему этот интерфейс. А MailEventManager сопоставляет произошедшее событие (напр., регистрация пользователя) и имеющийся класс почтового события, из которого получает все необходимые данные. Полученные же данные уже передает в компонент, непосредственно осуществляющий отправку писем (или уведомлений в телеграм, или что угодно еще).
Таким образом достигается большая гибкость системы, части которой при необходимости можно будет безболезненно вынести в отдельные приложения.