The most reliable way is to make a Behaviour, IMHO, because it's always applied, no matter how you upload document (web, ftp, webdav, CMIS, ....). This must be implemented on backend, in Java, packaged and installed.
- Optionally, with a custom behaviour on creating nodes, you may apply some automatic expiration date, for example 1 month. I said optionally because you can always set aspect on demand in Share, and to define the corresponding expiration date on cm:to property.
- with a custom quartz job you may check daily, for example, expired documents for cm:to property, and then to send an email to creator or a group of users.