Tutorial C# – Enviar e-mail a partir de uma Windows Forms

80 Comentários

Este tutorial serve para demonstrar como se pode enviar um e-mail utilizando uma Windows Form em C#. Será um formulário muito simples, mas com possibilidade de se tornar extremamente completo. Como já anteriormente se tinha sucedido com o tutorial ”como imprimir o conteúdo de uma datagridview”, este tutorial surgiu da necessidade de criar algo simples, mas que acima de tudo, funcione!

Após várias horas de pesquisa, muitos sites vistos, algumas dezenas de exemplos complicados ou que nem sequer funcionavam, e quase sem esperança de encontrar uma ajuda na Internet, juntei vários exemplos e no fim tinha o que eu queria.

Mãos à obra.

Primeiro criamos um novo projecto, e definimos os campos que queremos que sejam utilizados. Neste caso usei cinco campos: Para; CC; Anexo; Assunto; Mensagem.

Agora vamos ao código.

Primeira parte do Código:

Apesar de não ser totalmente necessário, criei um método void para o envio do e-mail.

Neste início de código podem facilmente identificar o modo de como inserir os campos e associar a uma TextBox ou a um email previamente definido.

É importante realçar que foi utilizado o namespace System.Net.Mail.

Sem este namespace seria impossível utilizar ou chamar as funcionalidades referentes ao email. Normalmente estes namespace são utilizados logo no início, juntamento com os:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

Mas neste caso utilizei directamento no código.

Segunda parte do Código:

Terceira parte do Código:

Nesta terceira parte do código entramos na área mais técnica.

Para terminar, vamos adicionar código ao botão que irá anexar algo.

Antes de adicionar o código, é necessário adicionar o openFileDialog, que nos permitirá seleccionar o ficheiro a anexar.

Para isso basta “arrastar” o openFileDialog da Toolbox para a “Form”.

Quarta parte do Código:

Esta última parte do código serve para adicionar o método SendEmail() no botão que enviará o e-mail, e também inserir o código no botão que irá anexar algum ficheiro.

No botão que servirá para anexar um ficheiro o código será:

No botão que enviará o e-mail, o código será:

E assim acabamos o Código.

Exemplo:

E aqui está o resultado do envio:

Como em tudo na vida, é possível personalizar ao máximo estes envios, como também fazer validações (por exemplo caso o campo CC não esteja preenchido. Mas isso já depende dos gostos pessoais.

Espero que tenham gostado.

Partilhar:
Tags:

Comentários

80

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Jorge
    Jorge

    Excelente. Era mesmo disto que eu andava à procura. Simples e eficaz. Não imaginas as horas que andei na internet a pesquisar isto.

    PS: Ainda bem que voltaram os tutorial de C#.

  2. Avatar de DexxA
    DexxA

    FÁCIL E PRÁTICO

  3. Avatar de Mike
  4. Avatar de The STK
    The STK

    Muito nice… estes tutorials são porreiros, continua!

  5. Avatar de chicosoft

    Era Porreiro o “Copy Paste” lol

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Quer o Download do código é isso?

      Se for, coloco daqui a pouco online 🙂

      Cumps

      1. Avatar de Pedro Morais
        Pedro Morais

        Sim, se puderes colocar o código era óptimo.

        Obrigado

        1. Avatar de chicosoft

          Já agora queria saber se é possível criar um tutorial de aplicação simples que escreva numa BD mysql 🙂

          1. Avatar de Hélio Moreira
            Hélio Moreira

            Será o próximo tutorial.
            🙂

            Cumps

      2. Avatar de chicosoft

        Sim, em vez das imagens o “Código” era mais interessante….

        Mas tanto trabalho para mim, não é preciso 🙂

      3. Avatar de Douglas
        Douglas

        ola, esda dando um pequeno erro na seguinte linha:

        smtp.Send(message);

        o erro é : SmtpException was unhandled
        Failure sending mail.

      4. Avatar de Mario Filipe
        Mario Filipe

        olá! estudei os teus códigos, e achei-os muito fácil para pôr em prática, e já consegui conceber a aplicação, só que encontrei dificuldade ao enviar, está resultar de um erro que não estou a dar conta a que se deve o mesmo.

    2. Avatar de MacGyver's Friend
      MacGyver’s Friend

      Amigos, não sejam calões, escrevam código que só assim é que ganham prática. Copy Paste para quê? Escrevam… usem o Notepad++. Se vos disser que as classes que escrevo em java no Notepad(++) compilam à primeira… 🙂
      O Notepad é nosso amigo.

      1. Avatar de L.Mata
        L.Mata

        Se ganhares a vida a programar, e se a produtividade é um factor para ganhares mais ou menos dinheiro, isso que acabaste de dizer … enfim 🙂

        1. Avatar de Nuno Salgado
          Nuno Salgado

          Coitados dos “programadores” que precisam de copiar código de um simples processo de envio de emails.

          Reutilizar é (muito) diferente de copiar.

  6. Avatar de António de Castro

    Grande Artigo 🙂 Parabéns e continua

  7. Avatar de rsl
    rsl

    Peço desculpa por ser nabo! 🙂 Mas tirando a utilidade académica, em termos práticos isto tem mais algum interesse? Uso o web gmail, teria alguma vantagem com o uso disto?

    abraço

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Isto tem sobretudo utilidade para programadores em C# e que querem integrar numa aplicação um form de email. Não serve de maneira nenhuma para “substituir” um outlook ou um gmail 🙂

      Cumps

      1. Avatar de rsl
        rsl

        Ahh… Obrigado! 🙂

      2. Avatar de Filipe Lourenço

        Exacto, eu no BatteryCare tenho já implementado um sistema de relato de erros que permite o envio de um email, por parte do utilizador, com o log do erro em anexo para mim, para efeitos de debugging.

        1. Avatar de Hélio Moreira
          Hélio Moreira

          Eu não diria melhor.

          PS: Já agora, a tua aplicação é fantástica. É óbvio que está instalada no meu portátil. 🙂

          Cumps

    2. Avatar de luis
      luis

      Boas ,eu na verdade uso algo semelhante para fazer o backup de código gerado por uma aplicação minha, o objectivo é se um problema acontecer, no mail vai estar sempre uma versão anterior.
      antes disso, usei para relato de erros, mas ultimamente desactivei essa funcionalidade.

  8. Avatar de Joao Pedro
    Joao Pedro

    Sr Hélio, e como adicionamos a imagem (neste caso a do pplware)?

    Abraço.

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Basta clicar no botão “procurar” que está no “anexo”, e indicar o caminho de onde se encontra a imagem 😉

      Cumps

      1. Avatar de Joao Pedro
        Joao Pedro

        Obrigado pela resposta, já agora qual é o compilador que você usa?

        Cumprimentos.

  9. Avatar de PedroC.
    PedroC.

    Peço desculpa pelo offtopic!

    Mas precisava de uma dica, preciso de um programa de sincronização, ou seja, que grave os meus ficheiros noutro lado quando é alterado…por exemplo um doc do word, eu faço gravar no C:\ e fica gravado também no D:\ !

    Alguém Conhece?

    🙂

    1. Avatar de João Melo
      João Melo

      Como isto é um post de programação indico-te onde podes tirar ideias. Se perceberes de programação basta alterar o código deste tutorial aqui do pplware

      https://pplware.sitedev.pt/tutoriais/tutorial-c-peopleware-monitor/

      E fazeres com que copie o ficheiro para a pasta que pretendes.

      PS: Quando voltam os de ASP.NET?

      1. Avatar de PedroC.
        PedroC.

        Obrigado!
        🙂

  10. Avatar de Raclima23
    Raclima23

    Sem dúvida um excelente artigo 🙂

  11. Avatar de Jo
    Jo

    Parabens pelo artigo

  12. Avatar de João Vieira
    João Vieira

    Boas 😀

    Parabéns pela iniciativa, eu comecei há pouco tempo a programar C#, mas tenho tido alguns problemas em ligar aquilo a uma base de dados, e trabalhar com ela, será que podiam fazer um tutorialzinho disso?

    Cumprimentos

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Que tipo de Ligação preferes? SQL, Access? Para a semana vou colocar um tutorial online sobre ligação C# + MySQL.

      Cumps

    2. Avatar de chicosoft

      Somos 2… Eu tb comecei a pouco tempo a mexer em C#… se conseguisse escrever em bds Mysql, era meio caminho andado para as minhas coisas… o resto faço, com mais ou menos cabeçadas.. lol

  13. Avatar de FredRF

    Talvez Off topic.

    Boas,

    Gostaria de saber a vossa opinião em relação ao seguinte:

    Consideram que fale a pena apostar na minha formação nesta linguagem de programação?

    Queria aprender a programar, acham que este é um bom patamar de partida?

    Obrigado.

    1. Avatar de João Melo
      João Melo

      “Queria aprender a programar, acham que este é um bom patamar de partida?”

      Meu amigo…

      Não existe melhor para começar, .NET e principalmente c# vai-te dar um leque grandioso de opções no mercado de trabalho. É “simples” mas muito robusto e muito prático.

      Ao longo da tua vida/carreira vais ver que não podes nem te irás deparar só com uma linguagem, o truque, tens de ser bom programador( lógica, Abstracção, OOP ) depois qualquer linguagem te vai parecer igual.

      Cumprimentos

      PS: depois tens de ver onde te inseres, se Web ou Cliente, se somente Windows ou todos os sistemas.

    2. Avatar de chicosoft

      Amigo, se nunca programaste… começa com a linguagem que mais pessoas usam e ensinam nas escolas ao começar a programar: Linguagem C

    3. Avatar de Nuno Salgado
      Nuno Salgado

      As melhores linguagens de programação para se aprender a programar são as funcionais. O Haskell é um grande ponto de partida.

      Se não for do agrado, o C é sempre um bom começo.

  14. Avatar de TVMANiA

    Se pudesses fazer um sobre C# e base de dados (Microsoft Office Access 2007), adicionar, remover, ordenar, procurar dados, era de valor amigo!

    Agradeço desde já este tutorial. Cumprimentos!

  15. Avatar de Vinicius
    Vinicius

    Teria como disponibilizar para Downlaod ?
    Estou com alguns problemas para poder conseguir desenvolver.

    Obrigado

  16. Avatar de Ricardo
    Ricardo

    Boas, não sei se deve postar aqui ou não, eu tenho de fazer uma aplicação movel, exactamente com este conceito de enviar email pela aplicação movel…será que me podem ajudar, ja pesquisei e não encontrei nada. Obrigado

  17. Avatar de Marcos Vinicius
    Marcos Vinicius

    Poderia disponibilizar o codigo? obrigado

  18. Avatar de Its me
    Its me

    E teria como mandar para uma lista de pessoas?

    Qual seria o código para eu carregar essa lista de email de um arquivo txt?

    Obrigado

  19. Avatar de francisco
    francisco

    nao da para por o codigo, nao consigo por a funcionar

  20. Avatar de David Magalhães
    David Magalhães

    Eu utilizei esse código para a minha aplicação, funciona perfeitamente, mas quando utilizo o software em rede ele não funciona, apenas no pc em que tenho o c# e desenvolvi o software.

    Alguém sabe o que pode estar mal ?

  21. Avatar de Temystocles Medeiros

    Muito Bom!
    Foi de grande ajuda.

  22. Avatar de Saulo

    Parabens Cara era exatamente o que eu queria

  23. Avatar de Pedro S
    Pedro S

    Boas

    Já fiz a aplicação no entanto diz que manda o email mas nao recebo nada ….

    Alguém me pode ajudar?

  24. Avatar de João Carlos
    João Carlos

    Boa tarde , estou a trabalhar em c# so que em vez de windows forms estou a trabalhar em Wpfapllication que é destinado a pda , todo o código funciona com um pequeno problema o anexo porque eu não tenho o botão openFileDialog então não consigo por o anexo a funcionar , ha algum botão que substituía este ? o que devo fazer ?

    Obrigado desde já , excelente trabalho muito bem explicito , parabéns

  25. Avatar de joao
    joao

    Brilhante artigo!
    Agradeço imenso o trabalho.

  26. Avatar de Lucas Schlottfeldt
    Lucas Schlottfeldt

    Caramba, funcionou.

    Parabéns cara, é simples e prático.
    Muito obrigado!!!!!

  27. Avatar de kikokayon
    kikokayon

    Boas

    Podias era por o downlowd do programa e do codigo sff se possivel xD

    1. Avatar de Davi
      Davi

      Poor Favooor’ *-*
      está dando erro aqui =\ ‘noob’ eu
      Valew

  28. Avatar de Cícero Júnior
    Cícero Júnior

    Esse foi fácil de implementar.

    Tem como consultar a caixa de entrada de um e-mail via Código C# utilizando uma aplicação Windows Forms?

  29. Avatar de Eduardo
    Eduardo

    Obrigado. Fácil implementar. Parabéns pela explicação.

  30. Avatar de Richiely
    Richiely

    Alguem sabe me falar como fazer pra enviar o email sem que obrigatoriamente se anexe algo?

    1. Avatar de Paulo Rocha
      Paulo Rocha

      É só colocar a linha abaixo:
      if (!String.IsNullOrEmpty(txtAnexos.Text))
      {
      System.Net.Mail.Attachment anexo = new System.Net.Mail.Attachment(txtAnexos.Text);
      message.Attachments.Add(anexo);
      }

  31. Avatar de Cleiton
    Cleiton

    Ola a todos
    eu estou com um probleminha aqui como não tenho domínio para colocar
    tentei colocar o do Gmail só que esta dando erro nessa linha
    code:
    smtp.Send(message);

    ha
    mais uma coisas nas Credentials devemos colocar o que no “oMeuUserName” e que senha
    code:
    smtp.Credentials = new System.Net.NetworkCredential(“oMeuUsername”, “Password”);

  32. Avatar de Madson R. Lima
    Madson R. Lima

    Perfeito! De todos os que vi, esse é o melhor.

    Mas estou com dois problemas:

    1) Toda vez que tento colocar mais de um e-mail separando por “;” me apresenta a seguinte mensagem de erro: A seqüência de caracteres especificada não está no formato necessário para um endereço de email.

    2) Não consegui criar uma forma de não enviar algum arquivo anexo. Toda vez que tendo apresenta essa mensagem: O parâmetro ‘fileName’ não pode ser uma seqüência de caracteres vazia.
    Nome do parâmetro: fileName

    1. Avatar de Silvestre

      voce deve criar uma função para tratar os dados desse textbox separado, por exemplo quando for digitado ; voce deve fazer uma nova chamada de envio e pegar sempre o email depois do ;

      1. Avatar de Paulo Rocha
        Paulo Rocha

        Oi Silvestre!
        Sou iniciante e não saberia desenvolver essa função. Você tem pronta!

  33. Avatar de Guilherme Walter

    Aonde eu posso baixar o codigo fonte? eu posso utilizar essa maneira para um envio de email de cobrança?

  34. Avatar de Hélio Moreira
    Hélio Moreira

    Olá Guilherme Walter,

    Nestes tutoriais mais antigos não é possível efectuar o download do código fonte.

    Contudo, se fizer tal como está explicado funcionará perfeitamente.

    Sim, pode utilizar este método para qualquer tipo de envio de emails.

    Cumps,
    Hélio Moreira

  35. Avatar de Mauricio Dias
    Mauricio Dias

    Eu fiz todo o procedimento, que o tutorial explica, porém não tive êxito.

    Aparece a seguinte mensagem, para o campos: Para, CC, Assunto e mensagem:

    “The name ‘TbPara’ does not exist in the current context”

    Defini variável e tirei o “.Text”, mas mesmo assim não consegui. Além deste erro a sintaxe: “txtAttachmentPath.Text”, também não é reconhecida.

    Pode(m) me falar onde estou errando?

    Grato,

    Mauricio Dias de Jesus.

  36. Avatar de Augusto tecas

    adorei era o que eu preocurava durante duas semanas

  37. Avatar de Mario Filipe
    Mario Filipe

    olá! primeiro tenho de te parabenizar por este feito,
    fiz a aplicação conforme a descrição dos códigos acima mencionados, aplicação está funcionar e já autentetiquei, só que está apresentar
    um erro que não estou entender ao que se deve o mesmo.
    gostaria que me ajudasse.

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Olá Mario, antes de mais obrigado pelo teu comentário. Pode dizer qual é o erro? De preferires podes enviar email para helio.moreira[at]pplware.com

      Abraço

  38. Avatar de Matheus
    Matheus

    Qual é a ordem dos códigos, onde eu coloco a grande parte do código? Da primeira parte até a terceira do código não sei onde colocar.

  39. Avatar de Matheus
    Matheus

    Não consigo enviar o email da um erro na linha do código
    smtp.send(message);
    o que eu faço?

    1. Avatar de Ricardo
      Ricardo

      Estou com o mesmo erro na linha smtp.send(message);

      An unhandled exception of type ‘System.Net.Mail.SmtpException’ occurred in System.dll

      creio que seja a Exception que foi comentado no código que poderia acontecer, mas como se resolve isso?

    2. Avatar de Ricardo
      Ricardo

      consegui resolver, o problema é que estava faltando uma porta, colocando a seguinte linha resolve o problema

      smtp.Port = 587;

      Obs.: coloquei essa linha de código logo acima do
      smtp.Credentials

  40. Avatar de Hélio Moreira
    Hélio Moreira

    Caro @Matheus,

    Pode indicar qual o erro que está a dar?

    Cumps,
    Hélio Moreira

  41. Avatar de Paulo Rocha
    Paulo Rocha

    Hélio! Parabéns pelo tutorial.
    Seu código é espetacular, muito simples e útil.

    Porém gostaria que você colocasse um código para colocar a assinatura automaticamente. Tentei achar com smtp ponto e não veio na janela uma opção adequada.

    Outro coisa é preciso incluir uma validação do e-mail do destinatário. Eu tenho o código, mas não sei onde implementar.

  42. Avatar de Leonardo Lopes
    Leonardo Lopes

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Proteçãodados
    {
    public partial class Form2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }

    private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
    {

    }

    private void Form2_Load(object sender, EventArgs e)
    {
    }
    public void SendEmail()
    {

    System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
    message.To.Add(tbPara.Text);
    message.CC.Add(tbCC.Text);

    System.Net.Mail.Attachment anexo = new System.Net.Mail.Attachment (txtAttachmentPath.Text);
    message.Attachments.Add(anexo);

    message.Subject = tbAssunto.Text;
    message.From = new System.Net.Mail.MailAddress(“leoboss619@gmail.com”);
    message.Body = tbMensagem.Text;

    System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
    smtp.Host = “smtp.gmail.com”;
    smtp.Port = 587;
    smtp.Credentials = new System.Net.NetworkCredential(“leoboss619@gmail.com”, “leo99leo99”);
    smtp.Send(message);
    MessageBox.Show(“Email enviado com sucesso!”, “Informação”, MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    private void btEmail_Click(object sender, EventArgs e)
    {
    //Aqui chamei a funnção SendEmail
    SendEmail();
    }

    private void anexo_Click(object sender, EventArgs e)
    {
    //Aqui chamaei a função para podermos adicionar um anexo
    openFileDialog1.ShowDialog();
    txtAttachmentPath.Text = openFileDialog1.FileName;

    }

    private void button1_Click(object sender, EventArgs e)
    {
    //Fecha a aplicação
    Application.Exit();
    }
    }

    }

  43. Avatar de Leonardo Lopes
    Leonardo Lopes

    Alguém consegue me ajudar ? segui os passos acima referidos.

    1. Avatar de Hélio Moreira
      Hélio Moreira

      Leonardo, que erro está a dar?

      1. Avatar de Leonardo Lopes
        Leonardo Lopes

        Será que me pode ajudar

  44. Avatar de Leonardo Lopes
    Leonardo Lopes

    Faço todo o processo mas quando carrego no botão para enviar o e-mail ele não faz nada e dá erro na linha de código:

    smtp.Send(message);

    1. Avatar de pedro moreira
      pedro moreira

      o mesmo

  45. Avatar de pedro moreira
    pedro moreira

    System.Net.Mail.SmtpException (falha ao enviar o email)
    em smtp.Send(message);