По первому вопросу; Лучше всего создать сценарий для отправки следующих x писем из списка получателей и повторного вызова, пока все получатели не будут обработаны. Вам нужно будет следить за тем, кто был обработан в БД, и вводить обработку ошибок в случае неудачи; хорошая стратегия для каждого пользователя:
- отметка в дБ как обработка
- отправить письмо получателю
- отметка в дБ как обработанная
Таким образом, вы можете увидеть, сколько людей потерпело неудачу в конце (то есть тех, кто все еще помечен как «обработка»).
Чтобы повторить процесс, вы можете использовать CRON и повторять каждую минуту; но что, если отправка займет более 1 минуты (например, из-за медленного SMTP-соединения), тогда у вас будет запущено два процесса вместе, поэтому вам нужно либо предотвратить это, либо ввести какую-то блокировку (приведенный выше пример пометки пользователей как " обработка "не позволит двум одновременным экземплярам сценария обрабатывать одни и те же люди).
Другая проблема с CRON каждую минуту заключается в том, что отправка всех ваших писем может занять несколько лет. У меня была именно эта проблема, и поэтому я написал Fat Controller, который обрабатывает параллельную обработку и повторение для вас. Я сделал простой сценарий оболочки, который запускается каждый день CRON и запускает Fat Controller, который затем запускает множество экземпляров сценария отправки PHP. Вот некоторые примеры использования и дополнительная информация:
http://fat -controller.sourceforge.net / потребительная cases.html
Относительно вашего второго вопроса; Я не уверен во внутренностях почтовой программы Swift, но вы захотите открыть SMTP-соединение, отправить электронную почту, а затем закрыть его, чтобы не открывать и не закрывать соединение для каждого письма. Проверьте документацию, я использовал Swift раньше, и она работала очень хорошо и имела очень четкую документацию.