Я делаю это путем помещения электронной почты в базу данных сервера SQL. Любая совместимая с ACID база данных будет работать, или вы можете использовать MongoDB со вставками «безопасного режима», но если вам действительно нужна гарантия, тогда используйте SQL-сервер или MySQL. Таким образом, если ваша почта попадет в базу данных, она «гарантированно» не будет потеряна, и вашему приложению не придется об этом думать. Вы можете использовать веб-сервис или просто создать общую сборку со статическим публичным методом в классе, чтобы оставить вашу электронную почту в БД для вас.
Включите столбец для статуса, такого как «новый», «доставлен», «почтовый ящик получателя временно заполнен», который можно представить числовыми значениями, и оставьте столбец TimeToSend, который начинается как время, когда электронная почта помещается в очередь в базы данных.
Тогда у вас есть почтовое приложение, которое вы можете запускать раз в минуту как запланированное задание Windows. Сделать это как консольное приложение. Когда он загружается, он проверяет, запущен ли его экземпляр, и если он есть, он закрывается. Когда работает:
1. Попытки доставить каждую почту на почтовый сервер. Запросите базу данных для всей почты, где TimeToSend старше, чем сейчас.
2. Если почта доставляется на почтовый сервер, пометьте ее как логически удаленную.
3. Если какое-либо письмо не может быть доставлено, переместите столбец TimeToSend для них на 10 минут.
4. Удалить записи из таблицы, которые логически удалены. Вы можете сделать это в приложении или сделать это с помощью задания sql.