1. Ну тут минимум 2 варианта:
I. Юзер вводит логин/мыло, сервер генерирует новый пароль, сохраняет хеш в базу а чистую копию отсылает на почту.
II. Юзер вводит логин/мыло, сервер генерирует ссылку по типу domain.com/reset_pasword?token=dfsfgesdfs34asd...., где значение token является хешем - зашифрованным при помощи md5 логином и timestamp`ом, который сохраняется в бд (например в таблицу restet_password_history со столбцами: user_id | hash | is_changed ). При переходе по такой ссылке сервер проверяет, есть ли в базе данный хеш и is_changed == false. Если да, то выводится форма для ввода пароля. После отправки в таблицу с юзером сохраняется хеш нового пароля, а is_changed записи меняется на true.
P.S. Во втором варианте неплохо было бы сделать "срок жизни" такой ссылки, т.е. сохранить в указанной таблице текущие дату и время+час, к примеру, а при переходе по ссылке проверять текущее время.
Это первое, что пришло в голову.
2. Смотря что вы имеете в виду под многостраничностью - если простые страницы по типу "о нас/контакты/правила" то да, руками. А если динамические по типу профилей/статей, то для каждой типовой страницы создается шаблон, в который выводятся данные из БД.