Could you not use the community commons getOriginalValueAsString?
Returns the original value of an object member, that is, the last committed value.
This is useful if you want to compare the actual value with the last stored value. - item : the object of which you want to inspect a member - member: the member to retrieve the previous value from. Note that for references, the module name needs to be included.
If you do a before commit and check if the status are different you can then send the mail.
Regards,
Ronald
You can introduce a boolean [StatusChanged] that is set when before commit finds a difference.
If the beforecommit fails this change is also rolled back and if the before commit succeeds after commit you send the notification and clear the [StatusChanged] boolean.