Время доставки электронной почты варьируется, поэтому вы не получите письмо в чей-то почтовый ящик ровно через 20 минут, независимо от того, что вы делаете.
Я использую длительный фоновый скрипт - запускаемый из CLI вместо apache - для обработки отправки электронной почты. Мое приложение сбрасывает электронные письма в таблицу очередей, которую почтовый скрипт опрашивает каждые 15 секунд. Это sleep () между опросами. Таким образом, у меня есть только один скрипт, пытающийся подключиться к SMTP-серверу и спящий.
Эта часть приложения успешно работает без каких-либо серьезных проблем в течение последних 2 лет. Единственное раздражение в том, что скрипт продолжает работать - если он по какой-либо причине отключается, почта не отправляется, пока вы не вернете его обратно. Но в худшем случае вы можете периодически перезапускать его через cron, например, ежедневно.
Если бы я занялся вашей проблемой, я просто поместил бы столбец «Время отправки» в таблицу очередей и назначил бы ему 20 минут для этих писем. Почтовик тогда SELECT * FROM mail_queue WHERE send_time <= NOW()
В качестве альтернативы, вы можете использовать настоящую очередь заданий, например, beanstalkd. Я выбрал таблицу очередей исключительно для простоты стека приложений.