Без изменения $_SESSION ничего не изменится самостоятельно. Чтобы узнать изменились ли данные в БД, необходимо сделать запрос. Как вариант можно было бы сделать хитрый триггер в MySQL, запускающий внешнюю программу или скрипт при изменении данных. Но это будет дороже. При каждом запросе дергайте данные пользователя и обновляйте $_SESSION. По-моему, это самый верный путь.
Вэб-сервер не передает этот заголовок в ваши скрипты. Обратитесь к саппорту, либо настройте отдачу заголовка самостоятельно, если имеете доступ к настройке.
Вам придется сделать 20 одинаковых запросов. Технически можно сделать это одним запросом, но фактически это будут 20 различных запросов, объединенные в один.
Рекомендую не воевать с mail, потому как совершенно неизвестно какой реальный бэкенд она использует.
Используйте https://github.com/PHPMailer/PHPMailer, легкий и проверенный, умеет все, что необходимо.
По-моему, вариант с "формой целиком" самый правильный. Сервер не должен принимать промежуточное участие в этом процессе. Валидация конечной формы - непременно, ибо нельзя доверять тому, что идет от клиента. А весь остальной процесс, на мой взгляд, непременно делать на клиенте.