This rule is set up as a component to run every day.
It begins with a View that uses two filters: expiration notice not sent and expiration is <= 0 days.
That view has a bulk operations attached to it that is able to send information to Rules.
The VBO is picked up by the rule and a list is created that loops. That loop takes the users that have expired memberships (<= 0 days) and have not yet been sent notification (expiration field set to "not sent") and it sends them an email. Next it changes the value of the field to "sent notice" and it thus removes them from the VBO list. Finally, it schedules itself to run the next day.
And here is the rule that governs the sending of final role expiration notice.