Transient
должен не просто создавать новый экземпляр для каждого потока, но и новый экземпляр для каждого запроса.
Я бы попробовал подтвердить, что вы действительно получаете новый экземпляр SmtpClient - убедитесь, что вы не вставляете его в статическое поле или каким-либо иным образом не заканчиваете тем же указателем. Вы можете попробовать выкладывать результат из GetHashCode()
в консоль каждый раз, когда отправляете электронное письмо, чтобы проверить, все ли они используют один и тот же объект.
Если это не удастся, мое единственное предложение - попытаться привести его к очень простому примеру - если вы не найдете в этом проблемы, вы можете опубликовать здесь код, и кто-то сможет помочь.