If time based mail is needed then cron is best.
But, if even based mail is need then PHP mail() function could be the only way. Cron cannot be used in such cases.
By events I mean like some user visited your page (identified by IP) or some error occurred while some processing.