Что я должен знать об отправке писем в фоновом потоке? ASP.NET - PullRequest
7 голосов
/ 21 января 2010

У меня есть поток, работающий в фоновом режиме, который будет спать и извлекать данные из базы данных, когда что-то пробуждает их. Я отправляю электронные письма, используя приложения Google, используя SmtpClient (код ниже).

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

        var client = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential(fromAddr, pass),
            EnableSsl = true
        };
        MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
        mail.IsBodyHtml = true;
        client.Send(mail);

Ответы [ 4 ]

3 голосов
/ 21 января 2010

Если вы используете IIS. Установите SMTP на свой сервер и отправьте всю почту на localhost. Таким образом, если электронная почта не проходит сразу, SMTP-сервер поставит ее в очередь, а не повесит приложение.

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

2 голосов
/ 21 января 2010

Добавьте попытку / улов к коду, и все в порядке. В худшем случае, в конце концов, тайм-аут. Он не будет работать вечно, и Google не будет держать соединение открытым навсегда (на самом деле SMTP довольно простителен, когда дело доходит до тайм-аутов ... если вы работаете медленно, это уничтожит соединение).

    try
    {
        var client = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential(fromAddr, pass),
            EnableSsl = true
        };
        MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
        mail.IsBodyHtml = true;
        client.Send(mail);
    }
    catch
    {
        // do something
    }

Когда дело доходит до тестирования ... используйте другую учетную запись gMail. Также вы можете проверить лимит отправляемых писем в день. Не знаю, какой номер gMail, но они не позволяют вам отправлять столько, сколько вы хотите отправить.

1 голос
/ 21 января 2010

Я предполагаю, что это делается в ASP.Net, поскольку это один из тегов.

Насколько важен этот процесс?Это может быть хорошим кандидатом для службы Windows, а не частью среды выполнения ASP.Net, если позволяет ваша среда.

Вы упомянули, что вы извлекаете данные из базы данных и отправляете электронное письмо.Ничто из этого не зависит от ASP.Net.Кроме того, служба может предоставить вам лучшие возможности потоков, тестирования, ведения журналов и асинхронности.

Если вы хотите придерживаться среды выполнения ASP.Net, то вы также можете рассмотреть Асинхронные страницы , если у вас нетт уже.Это позволит вам порождать несколько почтовых веток и заставлять вашу ветку главной страницы ждать результатов.Вы также можете установить значение тайм-аута, которое позволит вам отменить и записать застрявшие темы.Я полагаю, что установка асинхронного тайм-аута и его обработка позволят решить большинство ваших проблем.Это решение, по крайней мере, заберет вашу почту с вашей ветки запросов на создание страницы.

Тестирование должно быть простым.Вы можете зарегистрировать отдельные аккаунты Google для тестирования.

0 голосов
/ 21 января 2010

Вы можете установить свойство Timeout в SmtpClient, а затем обрабатывать любые исключения, вызванные вызовом Send. Тогда он не заблокирует поток, хотя вам придется обработать причину исключения, как вы считаете нужным.

...