I've searched for hours why email was not saved when registration.
This was because i change mail label in form_alter.
This must be done in form_after_build.

To avoid this (mail field is part of registration form), can you add mail in the list of excluded fields like this.

 foreach (array('uid', 'name', 'author', 'buttons', 'language', '#theme', 'options','mail') as $key) {
    $form_add = $node_form;

Or better, invoke a hook returning fields to be excluded.