I suggest you to change the database structure a bit to fit with this solution.
So for example you have the following tables:
Table domains:
+----+----------------------+
| id | domain_name |
+----+----------------------+
| 1 | domain1.com |
+----+----------------------+
| 2 | domain2.com |
+----+----------------------+
| 3 | domain3.com |
+----+----------------------+
Table domain_expiry
+----+--------------+----------------------+
| id | domain_id | expiry_date |
+----+--------------+----------------------+
| 1 | 1 | 2016-07-01 11:22:24 |
+----+--------------+----------------------+
| 2 | 1 | 2017-07-01 11:22:24 |
+----+--------------+----------------------+
| 3 | 2 | 2016-08-01 11:22:24 |
+----+--------------+----------------------+
Table reminders:
+----+-----------+---------------+------------+--------+
| id | expiry_id | reminder_type | date_sent | status |
+----+-----------+---------------+------------+--------+
| 1 | 1 | 1 | 2016-06-01 | 1 |
+----+-----------+---------------+---------------------+
| 2 | 1 | 2 | 2016-06-23 | 1 |
+----+-----------+---------------+---------------------+
| 3 | 2 | 1 | 2016-08-01 | 0 |
+----+-----------+---------------+---------------------+
Now, you should have a cron which runs daily/nightly ( say at 12:00 AM ), this cron shall do:
1- Pulls the domains and their latest expiry_date
2- Checks if the expiry_date of the domain matches the record in domain_expiry table, if matches do nothing, if doesn't match add a new records with domain_id and new expiry_date
3- Sends reminder according to domain latest expiry_date
4- Inserts the result of reminder sending process into reminders table
expiry_id
,
reminder_type (1, 2, or 3)
,
the date when that reminder was sent, date_sent
and status (1 = success and 0 = failure)
Update
I updated my answer to allow the solution to keep history logs.