Hello,
> ie no hacks of core.
The approach based on local events handling outlined here http://moodle.org/mod/forum/discuss.php?d=201499 does not require 'core hacks' . At least it will solve points 1 (event user_created) and 2 (event user_enrolled or role_assigned) .
Point 3 may be solved by trapping event user_modified and checking that field fisrtaccess is equal to field lastaccess for the corresponding user.
In all cases, your local handler will receive a record that you can use to further query the database, and ends with an eventual call to API function email_to_user(). See the sample codes proposed on github.
Extra customizations (i.e. email address to sent to, subjects, ....) could be added as $CFG->xxxxx values directly added to config.php file (unsensible to future Moodle upgrades) or in tables mdl_config/mdl_config_plugins if you bother to write local settings.php scripts.
Cheers.