
This way branching logic is only on the top level of your code, and the flow is totally linear. It is even better to extract a service object and move the mailer logic to it — this way it is even simpler to think about this code, simplifying the controller logic further.
The general rule of keeping maintainable apps is: favour explicitness over implicitness. AR callbacks are an anti-thesis of this. The advantage of DRYing up your code using them is not worth it — not to mention it is not what DRY is about, really.
This way branching logic is only on the top level of your code, and the flow is totally linear. It is even better to extract a service object and move the mailer logic to it — this way it is even simpler to think about this code, simplifying the controller logic further.