Идеологически правильный setter?
Проверять корректность должен.
При этом он остается ответственным за одно действие — за установку именно email'a, а не произвольной строки.
Поэтому и генерировать исключение при неправильных данных тоже должен.
Метод же неспроста называется setEmail.
Вы же не удивляетесь, что при попытке присвоить строку в integer поле получаете ошибку (вероятно даже компиляции). 
Здесь же происходит фактически тоже самое. 
Если говорить про идейность, то еще лучше сделать тип Email и проверки делать в нем. Но в обычном, а не идеальном коде, это почти наверняка будет излишним. Поэтому проверка в setter'e — хороший компромисс.
> 1. Должен ли этот сеттер проверять корректность мыла?

Нет, не должен. Проверка целостности данных должна производится перед выполнением критического действия. 

Однако, зачем тогда такой простой метод? 

C таким же успехом можно просто писать:
$s->email=«vasia@pup.zemli»;

Сеттеры и валидаторы должны жить отдельной жизнью.