Разослать тысячи отдельных писем без циклов - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть сайт, на котором люди выставляют вещи на продажу. Каждый месяц каждому пользователю, у которого есть что-то для продажи, будет отправляться электронное письмо службой Windows, в котором он спрашивает, был ли продан его товар, и дает ему пользовательскую ссылку, по которой можно щелкнуть, чтобы подтвердить, что это не так (поскольку это противоречит пользовательскому соглашению для товаров. остаться на сайте, который продан).

Сначала я должен выполнить запрос, чтобы получить все непроданные товары и отправить их по электронной почте. В настоящее время я зацикливаю все это и генерирую индивидуальные электронные письма для каждого человека и отправляю их как отдельные электронные письма.

   foreach (Item unsoldItem in unsoldItemsCollection)
        {
          //generate email

           string email = GenerateUnsoldEmail(itemName, itemPrice);
           Utils.Sendemail(unsoldItem .UserEmail, "no-reply@website.com", "Unsold Item", email);

        }

(это своего рода псевдокод, но это почти то, что я делаю)

Моя проблема в том, что в этом цикле могут быть тысячи (если это отнимает, может быть, миллионы :)) элементов, для которых требуются электронные письма, что, я думаю, вызовет проблемы.

Как еще я мог это сделать?

Бекс

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Я бы сделал это асинхронно, чтобы программа не останавливалась до тех пор, пока не будет отправлено текущее письмо.

Вы не можете слить по почте, так как все письма разные; ссылки внутри него будут другими ... если тело письма не имеет какой-либо целевой страницы, которая заставляет пользователя войти в систему, а затем перенаправляет пользователя на определенную страницу, где перечислены все элементы для пользователя, и его спрашивают удалить уже проданные. В этом случае вы можете отправить электронное письмо вместо тысяч.

SmtpClient имеет асинхронную версию метода Send

0 голосов
/ 10 ноября 2011

Вы можете создать службу Windows, которая будет отправлять все ваши электронные письма один раз в день.

Или, что еще проще, вы можете создать небольшую консольную утилиту, которая сделает то же самое и запустить ее как запланированное задание.

0 голосов
/ 10 ноября 2011

Если вы хотите что-то сделать для каждого элемента в коллекции, вам придется использовать какой-то цикл (или что-то эквивалентное, например, рекурсию). Обойти это невозможно.

Вы должны перестать беспокоиться о потенциальных проблемах. Если вы считаете, что этот код будет проблемой производительности, измерьте его и выясните, насколько он на самом деле быстр и сколько писем он будет обрабатывать.

Вы беспокоитесь, что отправка всех электронных писем может занять несколько часов. Это на самом деле проблема? Почему?

Вы также беспокоитесь, что это может занять слишком много памяти. Если вы не можете поместить все элементы в память одновременно, вы должны обрабатывать их партиями: например, получать 1000, обрабатывать их, а затем получать еще 1000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...