I had the same issue.
I found some topics on google that explained tha this is because the currentBuild.result is not yet set and null.
Your Failure works because you set it yourself.
In my side, my workaround is to wrap the whole pipeline in a try / catch / finally.
If the pipeline fall in the catch, that means that an exception is thrown so i mark the build as failed.
In the finally, if currentBuil.result is null, I assume that it should be SUCCESS, so I set it myself.
Then, again in the finally block, I call the Mailer step.
It works for both, failures an back to stable notifications.
It us a workaround.
I'm not a big fan of bypassing the pipeline final result management.
I don't know if something can be done to not have to do it.