13 05 2015
Enviando e-mails com C#
Hoje em dia é muito comum termo que implementar o envio de e-mails através dos nossos aplicativos. Quando desenvolvemos uma aplicação utilizando o .NET Framework, essa necessidade é facilmente suprida, uma vez que o próprio .NET Framework contém classes que implementam o envio de e-mails. Confira neste artigo como enviar e-mails com C#.
As classes responsáveis pelo envio de e-mails no .NET Framework são a SmtpClient e MailMessage. Como o próprio nome já diz, a classe SmtpClient implementa as funcionalidades de SMTP (Simple Mail Transfer Protocol), que justamente é a responsável por fazer o envio do e-mail em si. Já a classe MailMessage representa uma mensagem de e-mail, com todas as propriedades que um e-mail contém, como, por exemplo, assunto, endereços do remetente e destinatário, etc.
Para aprendermos como funciona o envio de e-mails com essas classes, vamos criar um novo projeto do tipo Windows Forms. Nesse novo projeto, renomeie “Form1” para “FormEnviarEmail” e adicione alguns controles (basicamente Labels, TextBoxes, um Button e um RichTextBox – para digitarmos o conteúdo do e-mail), de forma que ele fique parecido com a imagem a seguir.
Feito isso, podemos implementar o código que fará o envio do e-mail no clique do botão “Enviar“.
Configurando o SmtpClient para funcionar com o Gmail
O primeiro passo que temos que seguir para enviarmos e-mails no C# é criarmos e configurarmos um SmtpClient. Esse SmtpClient terá todas as informações relacionadas ao servidor SMTP que fará o envio do e-mail. Você pode utilizar o servidor SMTP que quiser, mas, como é muito comum que qualquer pessoa tenha um e-mail do Gmail, vamos conferir neste artigo como configurar o SmtpClient para utilizar o SMTP do Gmail com as suas credenciais.
As propriedades que temos que configurar no SmtpClient são: Host, Port, EnableSsl, UseDefaultCredentials e Credentials. A propriedade “Host” representa o endereço do servidor SMTP e a propriedade “Port” representa a porta que o servidor SMTP utiliza (por padrão “25“). Já as outras propriedades (“EnableSsl“, “UseDefaultCredentials” e “Credentials“) servem para realizar a autenticação no servidor.
O endereço do servidor SMTP do Gmail é “smtp.gmail.com“, e a porta utilizada pelo Gmail não é a padrão (25), mas sim, a porta 587. A página de ajuda do Gmail apresenta todas essas informações para você:
Um erro que eu cometi durante os meus testes foi utilizar a porta 465 ao invés da porta 587 (talvez enganado pelas informações deste link). Como na documentação estava escrito “Porta para SSL“, achei que essa fosse a porta que eu deveria utilizar, mas, na realidade, a porta que precisamos utilizar no SmtpClient é a “Porta para TLS“.
Uma vez configuradas as propriedades “Host” e “Port“, temos que configurar a propriedade “EnableSsl” para “true“, a propriedade “UseDefaultCredentials” para “false” e a propriedade “Credentials” com as credenciais da sua conta do Gmail. Confira abaixo como fica o trecho de código com a configuração do SmtpClient:
using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient()) { smtp.Host = "smtp.gmail.com"; smtp.Port = 587; smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = new System.Net.NetworkCredential("SEUEMAIL@gmail.com", "SUASENHA"); }
Atenção! É importante que a configuração da propriedade “UseDefaultCredentials” seja feita antes da configuração da propriedade “Credentials“. Se você inverter essas duas linhas, você receberá o seguinte erro:
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.
Isso acontece porque, ao configurarmos a propriedade “UseDefaultCredentials” para “false“, o .NET Framework automaticamente faz um “reset” da propriedade “Credentials“, ou seja, ela será alterada para “null“. Portanto, temos que configurar as “Credentials” depois de ter alterado a propriedade “UseDefaultCredentials“.
Encontrei essa informação em um post no StackOverflow:
Construindo o MailMessage
Agora que já configuramos o SmtpClient, temos que criar um MailMessage, configurar suas propriedades e passá-lo ao método Send do SmtpClient. As propriedades que vamos configurar são: From, To, CC, Bcc, Subject e Body. Veja como fica o resultado no trecho de código abaixo:
using (System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage()) { mail.From = new System.Net.Mail.MailAddress("SEUEMAIL@gmail.com"); if (!string.IsNullOrWhiteSpace(textBoxPara.Text)) { mail.To.Add(new System.Net.Mail.MailAddress(textBoxPara.Text)); } else { MessageBox.Show("Campo 'para' é obrigatório.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!string.IsNullOrWhiteSpace(textBoxCC.Text)) mail.CC.Add(new System.Net.Mail.MailAddress(textBoxCC.Text)); if (!string.IsNullOrWhiteSpace(textBoxCCo.Text)) mail.Bcc.Add(new System.Net.Mail.MailAddress(textBoxCCo.Text)); mail.Subject = textBoxAssunto.Text; mail.Body = richTextBoxCorpo.Text; }
Observe que a única particularidade do código acima é que os endereços de e-mail não são simplesmente strings, mas sim, instâncias de MailAddress.
O único detalhe que está faltando para que o e-mail seja enviado é a chamada do método “Send” do SmtpClient. Nele passaremos a MailMessage que acabamos de criar:
smtp.Send(mail);
Anexando arquivos
Para anexarmos arquivos à nossa mensagem, basta utilizarmos a propriedade Attachments da classe MailMessage. Porém, antes de conferirmos como fica o código, vamos alterar um pouco a nossa janela, adicionando uma ListBox e um botão para escolhermos os arquivos a serem anexados ao e-mail:
Confira abaixo o código a ser utilizado no evento “Click” do botão “Adicionar“:
private void buttonAdicionarAttachment_Click(object sender, EventArgs e) { using (OpenFileDialog dialog = new OpenFileDialog()) { dialog.Multiselect = true; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { foreach (var file in dialog.FileNames) { listBoxAttachments.Items.Add(file); } } } }
Como você pode ver, é um código muito simples. Nós utilizamos a classe OpenFileDialog para selecionarmos um ou mais arquivos (note que a propriedade MultiSelect foi alterada para “true” a fim de possibilitarmos a escolha de mais de um arquivo) e, caso o usuário confirme o diálogo, nós preenchemos o ListBox com os caminhos para os arquivos escolhidos. Uma solução mais robusta seria possibilitar o drag and drop de arquivos diretamente do Windows Explorer para dentro desse ListBox. Você pode conferir como implementar essa funcionalidade no meu artigo sobre drag and drop em aplicações Windows Forms com C#.
Feito isso, adicione estas três linhas de código antes da chamada do método “Send” para que os arquivos sejam adicionados à mensagem de e-mail:
foreach (string file in listBoxAttachments.Items) { mail.Attachments.Add(new System.Net.Mail.Attachment(file)); } smtp.Send(mail);
E com isso podemos anexar arquivos ao nosso e-mail clicando no botão “Adicionar“.
Formatação HTML
Por padrão, a classe MailMessage utiliza o formato “texto” para as mensagens de e-mail. Porém, essa classe suporta também o envio de mensagens no formato HTML. Pensando nisso, eu resolvi substituir o controle RichTextBox por um controle que suportasse a formatação HTML.
Encontrei uma opção gratuita, chamada “ModelText HTML Edit Control“, porém, sua API é tão estranha e a documentação tão ruim que não consegui fazer com que esse controle funcionasse. Outra opção gratuita que encontrei foi um editor HTML postado no blog de um funcionário da Microsoft, mas, como achei ele extremamente complicado de utilizar, achei que nem valesse a pena o esforço. Encontrei também outras duas – opções que achei complicadas demais. Portanto, minha sugestão: se você precisar de um controle HTML na sua aplicação, separe bastante tempo para analisar essas opções gratuitas ou compre um controle comercial (como SpiceLogic .NET Win HTML Editor Control, XStandard Editor ou DevExpress RichEdit – esse último utilizamos na empresa onde eu trabalho).
A segunda ideia que tive para contornar esse problema foi: será que não tem como converter o RTF do RichTextBox em HTML? Após pesquisar, encontrei este exemplo de código que mostra como converter RTF para HTML. Resolvi dar uma chance e tentar utilizá-lo. Compilei a biblioteca, adicionei uma referência ao projeto e alterei a configuração da propriedade “Body” da MailMessage para fazer a conversão do conteúdo do RichTextBox de RTF em HTML:
mail.Body = MarkupConverter.RtfToHtmlConverter.ConvertRtfToHtml(richTextBoxCorpo.Rtf);
Porém, apesar do resultado ter sido animador, o e-mail ainda foi enviado em formato texto.
Isso aconteceu porque eu esqueci de alterar a propriedade IsBodyHtml para “true” antes de configurar o HTML no “Body” da MailMessage. Ao resolver esse detalhe, o resultado foi um pouco diferente (mas, nada animador):
mail.IsBodyHtml = true; mail.Body = MarkupConverter.RtfToHtmlConverter.ConvertRtfToHtml(richTextBoxCorpo.Rtf);
Repare na barra de rolagem na imagem acima. Não sei porque, mas, o HTML convertido ficou com inúmeros espaços entre uma linha e outra.
Depois desse fracasso, resolvi desistir de enviar o e-mail no formato HTML com essas opções gratuitas. Se você tiver essa necessidade na sua aplicação, eu sugiro que você compre um controle que suporte edição HTML.
Envio assíncrono de e-mails
Ao utilizarmos o método “Send” da classe SmtpClient, o envio será feito de forma síncrona, ou seja, a interface ficará bloqueada enquanto o e-mail estiver sendo enviado. Porém, a classe SmtpClient suporta duas modalidades para envio de e-mail assíncrono: os métodos SendAsync ou SendMailAsync. A diferença entre esses dois métodos (como você pode conferir nesta discussão no StackOverflow) é que o método “SendAsync” utiliza o esquema de “call-backs“. Já o método “SendMailAsync” utiliza o esquema dos operadores async/await. Se você tiver a possibilidade de utilizar async e await na sua aplicação, eu recomendo que você considere a opção “SendMailAsync“, que é muito mais simples.
Confira como ficou o código final, ajustado para que o e-mail seja enviado de forma assíncrona utilizando o método “SendMailAsync“:
private async void buttonEnviar_Click(object sender, EventArgs e) { using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient()) { smtp.Host = "smtp.gmail.com"; smtp.Port = 587; smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; smtp.Credentials = new System.Net.NetworkCredential("SEUEMAIL@gmail.com", "SUASENHA"); using (System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage()) { mail.From = new System.Net.Mail.MailAddress("SEUEMAIL@gmail.com"); if (!string.IsNullOrWhiteSpace(textBoxPara.Text)) { mail.To.Add(new System.Net.Mail.MailAddress(textBoxPara.Text)); } else { MessageBox.Show("Campo 'para' é obrigatório.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!string.IsNullOrWhiteSpace(textBoxCC.Text)) mail.CC.Add(new System.Net.Mail.MailAddress(textBoxCC.Text)); if (!string.IsNullOrWhiteSpace(textBoxCCo.Text)) mail.Bcc.Add(new System.Net.Mail.MailAddress(textBoxCCo.Text)); mail.Subject = textBoxAssunto.Text; mail.Body = richTextBoxCorpo.Text; foreach (string file in listBoxAttachments.Items) { mail.Attachments.Add(new System.Net.Mail.Attachment(file)); } await smtp.SendMailAsync(mail); } } }
Note que as únicas diferenças são: alteramos a chamada de “Send” para “SendMailAsync“; adicionamos a palavra-chave “await” antes da chamada de “SendMailAsync“; adicionamos a palavra-chave “async” na assinatura do método.
Concluindo
Hoje em dia, envio de e-mails é uma funcionalidade muito comum nas aplicações de negócios. Para a nossa sorte, a Microsoft disponibiliza classes no .NET Framework que implementam essa funcionalidade. Nesse artigo você conferiu como enviar e-mails com as classes SmtpClient e MailMessage, incluindo a possibilidade de anexar arquivos nas mensagens e fazer o envio de forma assíncrona. Você acompanhou também a minha luta (perdida) ao tentar utilizar editores gratuitos que suportassem o formato HTML (ou até mesmo a conversão de RTF para HTML). Agora, não perca tempo e implemente essa funcionalidade nos seus aplicativos, caso seja pertinente!
E, para finalizar, caso você queira ficar por dentro das novidades do meu site, assine a minha newsletter. Com ela você recebe um e-mail por semana comentando o artigo publicado, além de ficar sabendo em primeira mão sobre o artigo da próxima semana e também receber dicas exclusivas que eu só compartilho por e-mail. Assine utilizando este link ou o formulário abaixo.
Até a próxima!
André Lima
Photo by Sean MacEntee used under Creative Commons
https://www.flickr.com/photos/smemon/5167671844/
Para que serve o AutoMapper? Trabalhando com colunas no ReportViewer (para imprimir etiquetas)
[…] Hoje em dia é inadmissível que o usuário tenha que sair da sua aplicação para enviar um e-mail relacionado ao seu aplicativo. Caso ainda não tiver feito, implemente agora mesmo o envio de e-mails na sua aplicação utilizando este exemplo. […]
Prezado André, gostei muito do seu artigo, e apesar e já ter implementado o envio de emails o li pois estudar e aprender nunca é demais.
Agora tenho uma pergunta, seria possível receber os emails dentro da minha aplicação, serei ate mais especifico uma das vantagens seria enviar pedido de cotação de para um fornecedor.Imaginado este caso que meu sistema envie uma cotação seria possível receber esta cotação e realizar a leitura do texto ? se sim quais classes utilizar.
Att, ricardo.
Olá Ricardo, obrigado pelo comentário!
Fico feliz que você tenha gostado do artigo! Quanto à sua pergunta, para fazer o recebimento de e-mails dentro do seu aplicativo, você precisaria implementar um leitor POP3 ou IMAP (dependendo do tipo de servidor).. Existem alguns exemplos e bibliotecas para o .NET Framework sobre esse tema.. Sugiro que você pesquise por “pop3 c#” ou “imap c#” e com certeza encontrará algo que você poderá utilizar no seu aplicativo.. Por exemplo:
Retrieve Mail From a POP3 Server Using C#
OpenPop.NET – Robust POP3 client and MIME parser written in C#
Estou para escrever sobre esse tema aqui no blog (outras pessoas já me perguntaram sobre isso também), mas, com certeza o artigo não sairá este ano (só no ano que vem).. Quando ele sair, eu te aviso.. Ou, se quiser ficar sempre por dentro das novas postagens, assine a minha newsletter..
Abraço!
André Lima
Olá André!
estou com o seguinte erro ao tentar enviar o email:
System.Net.Mail.SmtpException: O servidor SMTP requer uma conexão segura ou o cliente não foi autenticado. A resposta do servidor foi: 5.5.1 Authentication Required. Learn more at
em System.Net.Mail.SendMailAsyncResult.End(IAsyncResult result)
em System.Net.Mail.SmtpTransport.EndSendMail(IAsyncResult result)
em System.Net.Mail.SmtpClient.SendMailCallback(IAsyncResult result)
— Fim do rastreamento de pilha do local anterior onde a exceção foi gerada —
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
— Fim do rastreamento de pilha do local anterior onde a exceção foi gerada —
em System.Runtime.CompilerServices.AsyncMethodBuilderCore.c__DisplayClass2.b__3(Object state)
Olá André!
Já consegui achar o erro :D
Tem que habilitar o acesso para aplicativos menos seguros no gmail, segue link: https://www.google.com/settings/security/lesssecureapps
Agradeço André pela sua atenção…
Olá Wesley!
Que bom que você conseguiu encontrar o erro.. E muito obrigado por ter voltado aqui e contado como você resolveu!
Abraço!
André Lima
André, boa tarde. Esta postagem é antiga mas a solução parece atual ainda. Eu gostaria de saber se há como implementar esta solução com maior segurança porque eu tive que desabilitar uma feature do Gmail que torna a conta remetente vulnerável. Então, no outlook, por exemplo, quando recebe e-mail desta conta, ele a envia diretamente para lixo eletrônico porque identifica que não possui segurança. Tem alguma sugestão?
Olá Andrey, obrigado pelo comentário!
Não entendi muito bem o que você teve que fazer nas configurações do Gmail.. O que é que você alterou exatamente? E o Outlook que você está falando é o Outlook na web, certo (antigo Hotmail)? O que acontece quando você envia um e-mail dessa conta do Gmail para o Outlook diretamente pelo Gmail na web? Ele também cai no lixo eletrônico?
Tenta mandar um e-mail para a minha conta do Outlook para eu ver se também cai no meu lixo eletrônico: jamjemjim [arroba] hotmail [ponto] com
Abraço!
André Lima
Obrigado André! Enviei para o e-mail uma explicação detalhada e um teste para saber se caiu no lixo eletrônico.
Abraço,
Andrey
Olá Andrey! Recebio aqui o seu e-mail e entendi a situação..
Mas, que estranho hein.. O seu e-mail realmente caiu no meu lixo eletrônico do Outlook.. O mais esquisito é que se eu utilizo o mesmo código que eu postei no site para enviar um e-mail da minha conta do Gmail para a minha conta do Outlook, ele não cai no lixo eletrônico.. Você já tentou enviar utilizando uma outra conta de e-mail do Gmail para ver se cai também no lixo eletrônico? Talvez possa ser algum problema com o e-mail que você está utilizando (que tem “testex” no endereço, termo que pode estar em algum blacklist global do Outlook)..
Abraço!
André Lima
Boa tarde André,
Infelizmente o e-mail continua entrando para a caixa de Lixo Eletrônico no Outlook. Criei uma nova conta no Gmail com o nome da minha empresa e nada mudou. Se eu tentar enviar utilizando uma conta do Outlook é ainda mais complicado porque a mensagem não é enviada. Diz que é necessário fazer uma criptografia STARTTL e que não encontrei nas opções da classe C#. Obrigado pela atenção.
Andrey
Olá Andrey!
Cara, será que não tem nada de anormal no código que você está utilizando para enviar os e-mails? Eu acabei de fazer um teste aqui criando uma nova conta no Gmail, não alterei absolutamente nada nas configurações da conta.. Aí eu utilizei este código para enviar um e-mail de teste:
E o e-mail caiu na caixa de entrada sem problema algum:
Tenta fazer um teste utilizando exatamente esse código (substituindo somente as informações das contas do Gmail e Outlook) para ver se cai no lixo eletrônico..
Abraço!
André Lima
Desculpe a demora em responder. Aparentemente o código é o mesmo. Vou criar outro método com seu código e testar. Posto o resultado aqui em breve. Obrigado.
Beleza Andrey.. Testa aí e depois volta aqui pra contar os resultados pra gente..
Abraço!
André Lima
[…] tempo atrás eu mostrei aqui no site como enviar e-mails com C#. Porém, como você obviamente sabe, todo e-mail que é enviado, chega em algum lugar (nem que seja […]
Olá André.
Faz um tempo que estou tentando enviar email utilizando a plataforma .NET (C#).
Segui vários exemplos, todos bem parecidos, mas nenhum funcionou inclusive o seu.
Gostaria de saber se você pode me ajudar.
O maior problema é que o único erro exibido pelo Visual Studio é “Falha ao enviar email”, cá entre nós, esta mensagem de erro não me ajuda em nada rsr, e nem usando try-catch estou.
Já tentei utilizar tratamentos de exceções específicos da System.Net.Mail mas todos me retornam a mesma mensagem.
Se puder me ajudar agradeço.
Abraços… :)
Olá Rodrigo, obrigado pelo comentário!
Esse erro realmente é muito genérico mesmo.. O que você pode fazer para tentar pegar uma mensagem mais específica é abrir os detalhes da Exception (“View Details” na janela quando a exception é disparada) para ver se não tem uma Inner Exception.. Às vezes a mensagem completa de erro está na Inner Exception..
Se quiser montar um projetinho por fora e me mandar para eu dar uma olhada, me envia por e-mail.. contato arroba andrealveslima ponto com ponto br..
Abraço!
André Lima
Olá André.
Já consegui resolver, devia ser algum erro do VS2013, pois com o VS2015 eu consegui fazer sem problemas, copiando e colando o código kkk.
Vlw por responder, seu blog é ótimo, estou sempre por aqui.
Abrass, até as próximas dúvidas…
Legal, Rodrigo.. Fico feliz que você tenha conseguido resolver esse problema.. E obrigado pelos elogios!
Abraço!
André Lima
smtpexception was unhandled by user code tem alguma coisa dando errada no codigo mas eu nao sei o que é, teria como me ajudar? tem algum meio que possamos entrar em contato? estou precisando muito dessa aplicação!
muito obrigado desde ja
Olá Victor,
Essa exception é muito generica.. Para saber mais detalhes sobre ela, quando ela for disparada, clica em “View Detail”:
Aí você vai conseguir ver mais informacoes sobre o erro..
Você pode entrar em contato comigo via e-mail.. contato arroba andrealveslima ponto com ponto br..
Abraço!
André Lima
Olá André!
Me tire uma dúvida: consigo inserir uma imagem no corpo do email? Consigo inseri-la no RichTextBox, mas ela não é enviada junto ao e-mail.
Obrigado!
Abraço!
Olá André!
Eu acho que você consegue colocar uma imagem “inline” no corpo do e-mail através de HTML.. Veja se esta discussão do StackOverflow te ajuda em algo e depois volta aqui contar pra gente se funcionou no seu caso:
Send inline image in email
Abraço!
André Lima
Server Error in ‘/’ Application.
Runtime Error
Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.
Details: To enable the details of this specific error message to be viewable on remote machines, please create a tag within a “web.config” configuration file located in the root directory of the current web application. This tag should then have its “mode” attribute set to “Off”.
Notes: The current error page you are seeing can be replaced by a custom error page by modifying the “defaultRedirect” attribute of the application’s configuration tag to point to a custom error page URL.
Olá Valdir!
Você não mandou mais detalhes na sua mensagem, então, não sei o que está acontecendo.. Você recebeu esse erro ao tentar enviar um e-mail com o código que eu apresentei no artigo?
Essa mensagem de erro é mensagem mais genérica possível do ASP.NET.. Para saber o que está realmente por trás desse erro, você precisa de uma mensagem de erro detalhada.. Você pode habilitar as mensagens de erro detalhadas utilizando esta técnica:
How to enable detailed error information for IIS and ASP.NET
Assim que você tiver uma mensagem de erro mais detalhada, poste aqui pra gente tentar entender o que está acontecendo..
Abraço!
André Lima
Bom dia, André Lima.
Então, na verdade percebi depois que mandei incompleta… Bom inicialmente eu copiei um trecho de código para enviar email pela pagina do meu site… veja em http://www.iesi.inf.br
antes dava erro de segurança.. e eu acabei mexendo no ISS sim, mas não lembro… ao adicionar novo site, defino a descrição, o caminho, e ao testar configuração, autenticação é valida mas no item abaixo me informa o seguinte: O servidor está configurado para usar autenticação pass-through com uma conta interna para acessar o caminho físico especificado. No entanto, o Gerenciador do IIS não pode verificar se a conta interna tem acesso. Verifique se a identidade do pool de aplicativos tem acesso de Leitura ao caminho físico. Se o servidor ingressar em um domínio, e a identidade do pool de aplicativos for NetworkService ou LocalSystem, verifique se \$ tem acesso de Leitura ao caminho físico e teste essas configurações novamente.
Olá Valdir, tudo tranquilo?
Que eu saiba, esse erro não deve afetar em nada o envio de e-mails com o código que eu mostrei nesse artigo.. A propósito, se você quiser pesquisar mais com o equivalente a essa mensagem de erro em inglês (é sempre mais fácil encontrar informações quando usamos a mensagem em inglês), você encontra ela aqui:
What is “pass-through authentication” in IIS 7?
Eu não vi nenhum lugar no seu site que tenha uma opção de enviar e-mail diretamente nele.. Você removeu a funcionalidade? O que você precisa fazer é manter a funcionalidade de envio de e-mail, habilitar no IIS para mostrar as mensagens completas de exceptions (habilitar debugging), tentar enviar um e-mail e aí sim você terá a mensagem de erro correspondente à falha no envio do e-mail..
Abraço!
André Lima
Olá André!
Tenho uma dúvida, a partir do momento em que preparo a aplicação para anexar um arquivo usando o Attachments, o mesmo torna-se obrigatório o preenchimento para envio do e-mail, caso não seja anexado nada fica dando o erro “O parâmetro ‘fileName’ não pode ser uma cadeia de caracteres vazia”. O que deve ser feito para não dar esse erro quando não a necessidade de anexar um arquivo no envio de e-mail?
Abraço!
Olá Ricardo!
Como é que ficou o seu código? No caso do exemplo desse artigo, eu só crio os Attachments caso tenha alguma coisa cadastrada no listBoxAttachments, senão o “foreach” vai pular e nenhum attachment será criado.. Você precisa fazer algo parecido no seu código.. Se quiser postar aqui o código ou enviar por e-mail (contato arroba andrealveslima [.] com [.] br), fique a vontade..
Abraço!
André Lima
André Boa Tarde !!!
Estou usando o seu código “Envio assíncrono de e-mails”, percebi que quando o usuário digita no campo “txtBoxPara.Text” qualquer coisa que não seja no formato de e-mail a aplicação da erro e finaliza. Como posso mudar isso para que valide a informação e aceite somente um e-mail valido, caso contrario de uma mensagem para verificar o e-mail digitado?
Olá Renato!
Você precisa colocar o código dentro de um bloco try-catch, principalmente a chamada do método SendMailAsync.. Dessa forma, quando acontecer algum erro durante o envio do e-mail, você conseguirá tratar e, por exemplo, exibir uma mensagem de erro ao invés do programa crashar.. Seria algo como:
Abraço!
André Lima
Boa Tarde !!!
Não consegui realizar essa verificação… o meu código ficou assim. Esta correto?
try
{
await smtp.SendMailAsync(mail);
MessageBox.Show(“E-mail enviado com sucesso!”, “Mensagem”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(“Erro”);
}
Olá Renato!
Desculpe, eu tinha confundido as coisas aqui.. Nesse caso, o que você precisa fazer é adicionar um Try-Catch na hora de instanciar o MailAddress! Senão ele já vai dar exception naquela parte e nem vai chegar na parte do SendMailAsync.. Então, na realidade, você precisaria fazer a validação aqui:
Tenta aí e depois fala pra gente se funcionou..
Abraço!
André Lima
Fecho… é isso ai! Agora foi!
Muito Obrigado !!!
Beleza Renato! Que bom que funcionou! Qualquer coisa é só falar..
Abraço!
André Lima
André bom dia, estou tentando baixar esse Nuget, mas esta desatualizado você tem outro para indicar porque ele não é compatível com a versão NET 4.5.2. Obrigado.
A mensagem que aparece é essa: (Não foi possível instalar o pacote ‘MailMessage 2.0.2’. Você está tentando instalar este pacote em um projeto que se destina a ‘.NETFramework,Version=v4.5.2’, mas o pacote não contém nenhuma referência de assembly ou arquivo de conteúdo que seja compatível com essa estrutura. Para obter mais informações, entre em contato com o autor do pacote.)
Olá André!
Que pacote do NuGet? Eu não estou usando nenhum pacote do NuGet nesse artigo.. As classes SmtpClient e MailMessage estão presentes diretamente no .NET Framework desde a versão 2.0 no namespace System.Net.Mail.. Você não precisa adicionar nenhuma referência para utilizá-las..
Abraço!
André Lima
Olá Andre.
Você saveria me informar qual a forma de um app ou dll ser reconhecido como seguro para envio de email utilizando o SMTP do gmail ou yahoo.
Sem a necessidade de alterar a configuração da conta habilitado o acesso para aplicativos menos seguros.
Olá Ronildo!
Não sei o Yahoo, mas para o Google, qualquer aplicação que não seja da suíte da Google (ou que utilize autenticação de dois fatores) é categorizada como “less secure app”.. Até o Outlook 2016, caso você utilize as configurações normais de SMTP do Gmail, é considerado um “less secure app”.. Ou seja, acredito que você não tenha um jeito de adicionar um aplicativo em uma “lista de aplicativos seguros”.. Acredito que o esquema com o Yahoo deve ser o mesmo..
Abraço!
André Lima
Obrigado meu amigo, o me código estava errado, mais com sua dica de colocar o código abaixo nesta ordem já fez o meu funcionar.
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential(username, password);
Maravilha, Vinicius! Fico feliz por ter conseguido ajudar.. :)
Abraço!
André Lima
Prezado André,
gostaria de saber se há a possibilidade de enviar email sem smtp, ou seja, sem passar pelo provedor de email usando C#
por exemplo:
string smtp= smtp.gmail.com;
eu não queria passar pelo provedor
Parabéns pelo artigo é muito completo
abraço
Olá JP, obrigado pelo comentário!
Cara, não tenho a mínima ideia de como isso seria possível.. Mas, aparentemente existe um componente (pago) que implementa essa funcionalidade.. Eu não testei, mas vale a pena dar uma olhada:
Send Email directly without SMTP server (MX DNS lookup) in C#
Abraço!
André Lima
Muito bom o arquivo, obrigado ajudou-me bastante!
De nada, Ariel! Qualquer dificuldade é só entrar em contato..
Abraço!
André Lima
Muito bom este artigo, ajudou bastante.
Estou agora tentando descobrir se tem como eu criar uma tabela com vários destinatários e disparar e-mail para todos os contatos desta tabela.
Consegue me dar uma luz nisto?
Olá Adenilson!
Não tem muito segredo.. É só criar a tabela, fazer um “foreach” nela e, para cada linha da tabela você manda a mensagem para o destinatário correspondente.. Em qual parte você está com dificuldade exatamente?
Abraço!
André Lima
Boa tarde André, tudo bem? Tenho uma aplicação que usa uma configuração muito semelhante a esta e atualmente parou de enviar com sucesso os e-mails. Porém sem erro .. simplesmente trava a aplicação por um momento pois fica tentando enviar e como não obtém sucesso destrava o thread principal mas o e-mail não é enviado. Pode testar seu método com sua aplicação pra ver se ainda está ok?
Olá Kayo!
Qual servidor de SMTP você está utilizando? É do Gmail ou algum outro? Com o Gmail eu não testei, mas utilizamos exatamente esse mesmo código na nossa aplicação (com outro servidor SMTP) e continua funcionando perfeitamente..
Você deu uma olhada no log de eventos do Windows para ver se não tem uma mensagem de erro detalhada lá?
Abraço!
André Lima
Sim, é gmail. A questão é que antes funcionava e a aplicação não foi modificada em nada. Mas tudo bem, só de saber que ainda funciona, vou dar uma atenção pra essa questão. Obrigado mais uma vez André!
Abraço.
Olá Kayo!
Fiz um teste aqui utilizando esse código com uma conta do Gmail e funcionou perfeitamente.. Será que você acidentalmente não mudou nenhuma configuração dentro do Gmail? Esse tipo de envio só funciona se a autenticação por dois fatores estiver desabilitada e se o acesso à conta por aplicações menos seguras estiver habilitado no Gmail..
Abraço!
André Lima
André, boa noite.
Tenho uma aplicação que são gerados certificados individuais de treinamento, porém, em alguns casos, estes são enviados diretamente para o RH da empresa contratante do serviço.
Esta aplicação deve enviar o certificado salvo no PC através do Outlook e minha dúvida é como posso adicionar todos os certificados gerados em um determinado treinamento como anexo no mesmo e-mail para enviar a esta empresa.
Olá Rodrigo!
Tem que ser pelo Outlook ou pode ser como eu mostrei no artigo? Porque ali no artigo eu mostro como anexar arquivos no e-mail, inclusive múltiplos anexos no mesmo e-mail.. É só você pegar a lista de arquivos dos certificados e anexar um a um através de um “foreach”, justamente como eu mostrei no artigo..
Abraço!
André Lima
Olá André!
Sim, o envio deve ser pelo outlook por exigência do cliente. Vou tentar com o foreach conforme seu código.
Assim que resolver te dou um feedback.
Olá Rodrigo!
“Outlook” você quer dizer o software mesmo? Ou seja, você deve fazer uma integração entre a sua aplicação e o Outlook de forma que o e-mail seja enviado direto pelo Outlook? Ou o que você quer dizer é que devem ser usadas as mesmas configurações de servidor SMTP que estão sendo utilizadas no Outlook do usuário? Ou talvez você esteja querendo dizer Outlook.com?
Enfim, fico aguardando o seu retorno..
Abraço!
André Lima
Boa noite André.
Obrigado pelo retorno.
O envio é pelo programa do Outlook mesmo.
O programa faz uso do Outlook para o envio, porém, não preciso que o software envie certificado por certificado para seus respectivos endereços de e-mail.
Olá Rodrigo!
Então o conceito é outro.. Você não terá que fazer envio via SMTP (como eu mostro no artigo), mas sim, terá que fazer uma automação do Outlook.. Procure por “Outlook automation C#” no Google e você encontrará alguns conteúdos interessantes que podem te dar uma base.. Por exemplo:
C# app automates Outlook (CSAutomateOutlook)
C# Application – How to Send and Receive email in Microsoft Outlook | FoxLearn
Abraço!
André Lima