выведите $_POST['text'] перед nl2br() и после её работы.
По идее эта функция не должна транслитерировать буквы, скорее всего замена происходит где-то в другом месте
Включайте вывод ошибок. Скорее всего у вас какая-то ошибка, вывод их отключен - поэтому и белый экран.
А от ошибки можно уже и дальше плясать.
Ну письмо - это та же html страница. Если можете страницу сайта так же сверстать - то и письмом получится. Там, правда, есть некоторые технические нюансы, типа табличной верстки, прописывания стилей инлайном и т.п. - но всё это гуглится по теме "верстка писем".
Как еще один вариант - откройте исходники вот этих пришедших писем и посмотрите как они сделаны.
Что на выходе-то хотите получить? А то не осбо понятно, что значит вставить сайт? Ссылку на сайт или письмо оформить в стиле дизайна сайта или что-нибудь ещё?
А что должно происходить при клике?
Как бы там в ссылке и прописано, чтобы окно смещалось к элементу с id=page1 или name=page1
Используй константу __DIR__ и от неё остальные пути задавай, чтобы не путаться.
вот здесь попробуйте полный путь к файлу указать
header("Content-Length: ".filesize($name)."");
Не совсем понял, вы смотрели сам файл, который генерируется (не удаляли его) и скачивали его по фтп для проверки?
Либо оставить как есть - либо редирект куда-нибудь, куда надо. Думаю, зависит от того, реальный ли пользователь наткнулся или бот.
Выбор за вебмастером.
ЗАйдите на страницу, которая указана в referer и откройте средства разработчика в Хроме на вкладке Network. Там смотрите, если ли запросы на http://www.сайт/категория/ - если есть - то смотрите колонку initiator - откуда запрос и исправляйте.
Если нет - то смотриет что за ip, может бот какой криво сайт парсит или на всякий случай проверяет, не открыта ли индексация каталогов.
Общее правило - отправляйте те же заголовки, что и браузер. Куки - это тоже заголовки.
Ну или как вариант - есть так называемые headless браузеры - phantom, slimer (вроде) - это вообще браузерные движки, которыми можно управлять из скриптов.