This doesn’t need to be on chain. I don’t know how you’ve set up your subdomain contract, but you could simply have a ‘web2’ microservice that calls your contract to get the expiry dates and then drops the subdomain owner an email as appropriate…
You could maintain a ‘web2’ database of subdomains and expirations to minimise unnecessary contract calls and use the contract purely as a final source of truth.