Dev (Back & Front)ARTIGO

As várias maneiras de mandar e-mail utilizando .NET

Olá pessoal, neste artigo mostrarei como criar métodos para mandar e-mail a usuários de forma diferente. Por exemplo, existe sistema que não pode mandar e-mail para outras contas, ou seja, com uma conta do próprio domínio mandar e-mail para o mesmo domínio, e existe outro sistema que pode. Isso porque, para mandar qualquer e-mail para outra pessoa, é necessário autenticação de e-mail que envia junto ao servidor.

Requisitos:

Linguagem: C.NET

Tecnologia: ASP.NET

Tipo: Envio de e-mail de duas maneiras

Nível: Avançado

Como assim?

Para ser mais prático, imagine que você tem um sistema que o usuário preenche os dados e envia, ao enviar os dados, automaticamente é passado um e-mail pra ele e um e-mail para o administrador do sistema. Esse tipo de envio de e-mail precisa de autenticação no servidor. Para enviar e-mail do provedor1 para o provedor1, isto é, do seu provedor para o seu provedor, já não precisa de autenticação.

Toda essa explicação que tentei fazer, mostrarei via código, como desenvolver um e-mail que é enviado via autenticação e sem autenticação.

Configuração

Antes de começar o desenvolvimento, é bom gerenciar as formas dos dados, ou seja, no arquivo web.config é bom conter todos os dados necessários para envio de e-mail, configuração de smtp e outros. Pois caso altere alguma coisa no servidor ou domínio, basta alterar no arquivo de configuração. Dentro do <AppSettings> pode ser colocado estes dados.

Exemplo:

<add key="SMTP" value="smtp.seuprovedor.com.br"/> seu smtp<br />	<add key="EmailDeAutomatico" value="seuemail_que_envia.com.br"/> seu e-mail responsável pelo envio dos dados ao usuário. Geralmente um e-mail genérico ou automático.

Depois de atribuir os valores corretamente em seu arquivo de configuração, basta fazer os métodos para utilizá-los. Lembro que, para cada exemplo mostrado, coloco o exemplo testado e comprovado, facilitando assim uma melhor visualização.

Primeiro Exemplo:

Neste primeiro exemplo, mostro a forma mais comum para enviar e-mail sem qualquer tipo de autenticação de SMTP, usuário e senha.

    public void enviarEmailPart(string args)<br />        {<br />            string host = ConfigurationManager.AppSettings["SMTP"].ToString();<br />            string from = args[0];<br />            string to = args[1];<br />            string subject = args[2];<br />            string body = args[3];<br />            try<br />            {<br />                using (MailMessage message = new MailMessage(from, to, subject, body))<br />                {<br />                    SmtpClient client = new SmtpClient(host);<br />                    client.UseDefaultCredentials = true;<br />                    client.Send(message);<br />                }<br />            }<br />            catch (SmtpException exception)<br />            {<br />                throw new Exception("M\\x00e9todo: enviarEmailPart()", exception);<br />            }<br />            catch (Exception exception2)<br />            {<br />                throw new Exception("M\\x00e9todo: enviarEmailPart()", exception2);<br />            }<br />        }

Referência: Cod. 1.1

Explicação:

Esse método envia e-mail passando como parâmetro um array de string. São 4 posições, ou seja, de 0 a 3. Dessa forma, antes de passar os dados, os mesmos devem ser atribuídos.

            string host = ConfigurationManager.AppSettings["SMTP"].ToString();<br />            string from = args[0];<br />            string to = args[1];<br />            string subject = args[2];<br />            string body = args[3];

Referência: Cod. 1.2

Note que criei algumas variáveis fixas dentro do método que envia e-mail. O host pega a configuração do web.config, o from pega o primeiro argumento do array, o to pega o segundo argumento, o subject para o terceiro argumento e o body pega o quarto argumento. Todos os nomes são intuitivos.

        try<br />            {<br />                using (MailMessage message = new MailMessage(from, to, subject, body))<br />                {<br />                    SmtpClient client = new SmtpClient(host);<br />                    client.UseDefaultCredentials = true;<br />                    client.Send(message);<br />                }<br />            }

Referência: Cod. 1.3

Depois de montados, basta enviar os dados. Lembro que estou usando using System.Net.Mail; no início da classe. O SMTPCliente é passado pela variável host, atribuo o mesmo e mando o send passando a variável message criada anteriormente no using.

Esse é o método principal para enviar o e-mail. Podem ser criados outros métodos para setar/atribuir os valores antes de chamar o método principal. No corpo da mensagem tem uma manha legal, faço com StringBuilder com vários parâmetros e no final crio o argumento. Veja um exemplo para não ficar perdido.

public void enviaEmailSistema(EmailVO vo)<br />        {<br />            try<br />            {<br />                string[] args = new string[4];<br />                args[0] = ConfigurationManager.AppSettings["EmailDeAutomatico"].ToString();<br />                args[1] = ConfigurationManager.AppSettings["EmailDeAutomatico"].ToString();<br />                args[2] = "Acampamento - Fale Conosco";<br />                StringBuilder builder = new StringBuilder();<br />                builder.Append("");<br />                builder.Append("\\n\\r");<br />                builder.Append("\\n\\r");<br />                builder.Append("FALE CONOSCO");<br />                builder.Append("\\n\\r");<br />                builder.Append("Usu\\x00e1rio: "  vo.Nome);<br />                builder.Append("\\n\\r");<br />                builder.Append("E-mail: "  vo.Email);<br />                builder.Append("\\n\\r");<br />                builder.Append("Descricao: "  vo.Descricao);<br />                builder.Append("\\n\\r");<br />                builder.Append("\\n\\r");<br />                builder.Append("Telefone: "  vo.Telefone);<br />                builder.Append("\\n\\r");<br />                builder.Append(".......Por favor, n\\x00e3o responda este e-mail...........");<br />                builder.Append("\\n\\r");<br />                builder.Append("");<br />                args[3] = builder.ToString();<br />                this.enviarEmailPart(args);<br />            }<br />            catch (Exception exception)<br />            {<br />                throw new Exception("Erro na classe cadastro.cs", exception);<br />            }<br />        }

Referência: Cod. 1.4

Note que no começo do método criei uma variável do tipo string onde possui um array de string com 4 posições. Logo depois atribuo os dados e no final mando para o método principal.

Todos esses passos são necessários para enviar e-mail do usuário local para o usuário local, ou seja, se você tenta envia algum e-mail do seu domínio para um domínio hotmail, yahoo ou gmail, acaba voltando e não chegando; pois o mesmo precisa de autenticação.

Necessariamente precisa de autenticação para mandar e-mail a outro terceiro e-mail, é como mandar um e-mail do seu outlook e com sua conta, para um e-mail do sua mãe. Esse procedimento de envio precisa que você se autentique para enviar.

Da forma mostrada acima (Cod. 1.1), envia e-mail do seu domínio para o seu domínio, ou seja, do automatico AT dominio.com.br para auto AT dominio.com.br.

O segundo que mostrarei será com autenticação, você pode mandar e-mail para qualquer outro e-mail; lembrando da lei de SPAM que existe hoje em dia.

Segundo Exemplo

public void enviaEmailColecao(string emailPara, string mensagem, string titulo)<br />        {<br />            try<br />            {<br />                MailMessage mail = new MailMessage();<br />                mail.From = "email_de "; //email de<br />                mail.To = emailPara.ToString(); // email para<br />                mail.Subject = titulo.ToString(); // titulo<br />                mail.BodyFormat = MailFormat.Html; //formato html<br /><br />                mail.Body = "<br><br><font face='verdana' size='2'>"  mensagem.ToString()  "</font>";<br /><br />                mailField(mail);<br /><br />                SmtpMail.SmtpServer = "endereco_smtp";<br />                SmtpMail.Send(mail);<br />            }<br />            catch (Exception e)<br />            {<br />                e.Message.ToString();<br />            }<br />        }

Referência: Cod.1.5

Antes de explicar o método, devo importar a classe using System.Web.Mail. Assim não terá erro no momento de instanciar o método MailMessage().

Analisando o método, depois da instância criada, tenho que atribuir os dados, tanto de entrada quando de saída. No atributo BodyFormat; posso escolher a forma que o e-mail tem que chegar. Geralmente utilizo no MailFormat o tipo HTML.

O método mailField(mail) é responsável pela autenticação de usuário e senha. Veja a referência Cod. 1.6.

/// método para autenticar e-mail.<br />private static void mailField(MailMessage mail)<br />        {<br />            mail.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;<br />            mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = "seu_email";<br />            mail.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = "sua_senha";<br />        }

Referência: Cod.1.6

O atributo MailMessage possui os campos Fields, e neles podemos atribuir o método de autenticação, passando o usuário e senha. O primeiro field é smtpauthenticate onde aceita os valores 0 e 1. O segundo field é o usuário, ou seja, o seu e-mail com AT e tudo mais. O terceiro field pode ser colocado a senha do seu e-mail. O campo 2 e 3 são do tipo string.

Depois de atribuir os dados, coloco o STMP_SERVER colocando o endereço do smtp que o email valida. Logo após faço o send.

Bom, fico por aqui.

Espero ter ajudado, qualquer dúvida só entrar em contato.

Com mais de 20 anos trabalhando no mercado de tecnologia. Mestre em Engenharia Elétrica voltada para o mundo mobile, com mais de 20 livros publicados e cerca de 700 artigos publicados com intuito de ajudar àqueles que querem aprender a programar (site, software, desktop, serviços, api e mobile). Site pessoal: https://www.mauriciojunior.net - MVP, MCAD, MCP Microsoft

Ver perfil