How about creating an "after commit" action? I haven't tried this myself, but I think it only fires if the object was committed correctly.
If a microflow reaches the activity defined after the commit activity the commit was successful. If a commit is not successful the commit activity will throw an error and the microflow does not proceed it's execution (if error handling isn't set to continue).
So, you can just add the mail activity directly after the commit activity.
The only way I see is that you execute whatever before commit checks you do in the microflow itself (not as an object handler) This way you can check whether it returned true or false and handle the two outcomes in whatever way you want.
I think in general, when using custom made 'save' and 'cancel' buttons, object handlers are not always the best way to go, certainly not for checks (you could still use them to set e.g. complete names based or calculate total order values).
I use custom save and cancel buttons all the time and we are working with a 'validation' subflow in every custom save microflow so that we can choose per save action which checks should be executed and which not