I'm with you Justin.
I have a series of Models that trigger emails based on certain actions that can come from Users, Admins and shell scripts for automated processes.
It is FAR easier to centralize an email response in the Model (like when an Order record is 'cancelled') than to rewrite the email in multiple locations.
Also, I have automated processes in the Models that handle some core 'logic' that cascade to other hasOne, belongsTo or hasMany Models that are biz rules.
For example, a crontabbed shell script calls Offer->expire() to 'expire' an Offer which then calls Offer->make() to make another Offer, but if it can't then it calls Request->expire() to 'expire' the original request. Emails must be sent to first expired Offer recipient, to any new Offer recipients and/or to the requestor if it expires. These can be called by crontabbed shell or by Users or by Admins who can manage Requests and Offers manually. All using different Controllers or interfaces.
This is what I did and can call it inside Models and Controllers:
if(empty($this->MailsController)) {
App::import('Controller','Mails');
$this->MailsController = new MailsController();
$this->MailsController->constructClasses();
$this->MailsController->Email->startup($this->MailsController);
}
Now I am able to call this from just about anywhere and centralize all the logic for what data to find(), what email to generate, whom to send it to, etc. via the following called inside the Model:
$this->MailsController->orderMail($user_id,$this->id,$mode);
Since all of the email logic is basically called by the Models indirectly via MailsController, I am going to give rscherer's code a try.
Hope this helps,
oh4real