Pergunta

Eu tenho um thread em segundo plano que dormirá e puxará dados do banco de dados quando algo o acordar. Estou enviando os e -mails usando o Google Apps usando o SMTPClient (código abaixo).

Eu queria saber se há algo que eu saiba? Planejo enviar apenas um email por vez (um e -mail de senha de registro ou esqueci). Estou um pouco preocupado que algo possa acontecer como um email inválido, bloqueando o tópico, porque não defini um tempo limite ou talvez os aplicativos do Google sejam feitos e fazendo com que o aplicativo explodisse. O que devo estar ciente? Devo perguntar como devo testar também?

        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);
Foi útil?

Solução

Se você está usando o IIS. Instale o SMTP no seu servidor e envie todos os e -mails para localhost. Dessa forma, se um email não for imediatamente, o servidor SMTP fará fila o email em vez de pendurar seu aplicativo.

Você precisará configurar o servidor SMTP para usar o Gmail como um Smarthost. Se você precisar de mais informações sobre como configurar isso, entre em contato.

Outras dicas

Adicione uma tentativa/captura ao código e você está bem. Na pior das hipóteses, será o tempo limite. Não vai correr para sempre, e o Google não manterá a conexão aberta para sempre (na verdade, o SMTP é bastante implacável quando se trata de tempo limite ... se você for lento, isso matará a conexão).

    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
    }

Quando se trata de testar ... use uma conta Gmail diferente. Além disso, você pode verificar seu limite de e -mails enviados por dia. Não tenho certeza de qual é o número do Gmail, mas eles não permitem que você envie como você deseja enviar.

Estou assumindo que isso está sendo feito no ASP.NET, pois é uma das tags.

Quão importante é esse processo? Este pode ser um bom candidato a um serviço do Windows, em vez de parte do tempo de execução do ASP.NET, se o seu ambiente permitir.

Você mencionou que retira os dados do banco de dados e envia o email. Nada disso se baseia no Asp.net. Além disso, um serviço pode oferecer melhores opções de rosqueamento, teste, log e assíncronas.

Se você quiser ficar com o tempo de execução do ASP.NET, também pode considerar Páginas assíncronas se você ainda não o fez. Isso permitirá gerar vários tópicos de correio e ter seu tópico de página principal, aguarde os resultados. Você também pode definir um valor de tempo limite que permitirá cancelar e registrar threads presos. Definir e lidar com um tempo limite assíncrono cuidaria de muitas das suas preocupações que suspeito. Esta solução levará pelo menos o seu e -mail enviando seu tópico de solicitação de página para fazer.

Os testes devem ser diretos. Você pode registrar contas do Google separadas para testes.

Você pode definir o Timeout propriedade de SmtpClient, e depois lidar com todas as exceções jogadas pelo Send ligar. Em seguida, ele não bloqueará o encadeamento, embora você deva lidar com a causa da exceção à medida que considerar apropriado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top