Is this a reasonable use of hook_user_presave? The documentation for hook_user_presave says that


  This hook is primarily intended for modules that want to store properties in the serialized {users}.data column [...]


Instead, I'm using it to check that a change of email address does not clash with any email address in a database separate from the database for my drupal site. If it does, I do

$edit['mail'] = $account-&gt;mail;


so that the update to mail does not go through, but the rest of the edit is unaffected. (I also put up a warning message, under the assumption that the only time the email changes is when someone changes it manually.)

With anything web-related being outside my usual field, I'm not sure if using this method in a different way than intended is too clumsy or unsafe. Is it ok to use this method in this way?
If you look at the documentation page for Drupal 8, you will notice that sentence is not used anymore.


  Act on a user account being inserted or updated.
  
  This hook is invoked before the user account is saved to the database.
  
  Modules that want to store properties in the serialized {users}.data column, which is automatically loaded whenever a user account object is loaded, may add their properties to $account->data in order to have their data serialized on save.


The fact the hook has different parameters in Drupal 8 doesn't change its purpose. In fact, with Drupal 8 you could use the following code.

$account-&gt;mail = $account-&gt;original-&gt;mail;


$account-&gt;original contains the value returned from entity_load_unchanged().

Although on Drupal hook_user_presave() is normally used for the purpose you noticed, you could use it for the purpose you described.

The alternative would be to add a form submission handler to the user edit form which is executed before the default form submission handler. The pro of using hook_user_presave() is that it works also when a module programmatically save a user object using user_save().