Тогда уже более предметно можно обсуждать, что же делать.
Наобум можно порекомендовать настроить таймаут отправки, чтобы вываливался с ошибкой при невозможности отправить за 10 секунд, например.
При интенсивной отправке писем стоит вынести отправку в отдельный сервис. Веб-логика будет только сохранять в БД параметры письма (кому, тему, содержание) и отправлять, скажем, в RabbitMQ мессадж с id записи БД. А сервис, независимо от бэка сайта, будет слушать эти сообщения в Rabbit, и возиться с отправкой писем. Зависать, перезапускаться, не влияя на бэк сайта.
Еще нужно до отправки каждого письма и после замерять промежуточную отметку microtime и memory_get_usage и логировать ее в базу или файл (с именованием отметки в каком месте кода она поставлена). Так определите, где какая функция скушала много оперативки (актуально, когда работаешь с большими файлами или непрерывными бинарниками), или задержалась по времени обработки.