Prepared Statements
По-моему вы код неправильно понимаете (проблема где-то в другом месте). Удалена строка или нет, цикл все равно будет завершен. Из результата (result) записи не удаляются в процессе выполнения тела цикла (даже в случае добавления SQL с DELETE в транзакцию). А вот при следующем вызове метода SendExternalMails строки опять будут выбраны и опять попадут в result, если они не были удалены ранее.
Господи какой же я критин — благодарю за подсказку!