Quantcast

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
  1. JO
    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. DE
    DexxA

    FÁCIL E PRÁTICO

  3. MI
    Mike

    Muito bom!

  4. TS
    The STK

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

  5. CH

    Era Porreiro o “Copy Paste” lol

    1. HM
      Hélio Moreira

      Quer o Download do código é isso?

      Se for, coloco daqui a pouco online 🙂

      Cumps

      1. PM
        Pedro Morais

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

        Obrigado

        1. CH

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

          1. HM
            Hélio Moreira

            Será o próximo tutorial.
            🙂

            Cumps

      2. CH

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

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

      3. DO
        Douglas

        ola, esda dando um pequeno erro na seguinte linha:

        smtp.Send(message);

        o erro é : SmtpException was unhandled
        Failure sending mail.

      4. MF
        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. MF
      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. LM
        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. NS
          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. AC

    Grande Artigo 🙂 Parabéns e continua

  7. RS
    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. HM
      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. RS
        rsl

        Ahh… Obrigado! 🙂

      2. FL

        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. HM
          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. LU
      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. JP
    Joao Pedro

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

    Abraço.

    1. HM
      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. JP
        Joao Pedro

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

        Cumprimentos.

  9. PE
    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. JM
      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

      http://pplware.sapo.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. PE
        PedroC.

        Obrigado!
        🙂

  10. RA
    Raclima23

    Sem dúvida um excelente artigo 🙂

  11. JO
    Jo

    Parabens pelo artigo

  12. JV
    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. HM
      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. CH

      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. FR

    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. JM
      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. CH

      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. NS
      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. TV

    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. VI
    Vinicius

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

    Obrigado

  16. RI
    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. MV
    Marcos Vinicius

    Poderia disponibilizar o codigo? obrigado

  18. IM
    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. FR
    francisco

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

  20. DM
    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. TM

    Muito Bom!
    Foi de grande ajuda.

  22. SA

    Parabens Cara era exatamente o que eu queria

  23. PS
    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. JC
    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. JO
    joao

    Brilhante artigo!
    Agradeço imenso o trabalho.

  26. LS
    Lucas Schlottfeldt

    Caramba, funcionou.

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

  27. KI
    kikokayon

    Boas

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

    1. DA
      Davi

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

  28. CJ
    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. ED
    Eduardo

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

  30. RI
    Richiely

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

    1. PR
      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. CL
    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”);

    1. RA
      Rafael

      aqui amigos tem o Download do código http://www.4shared.com/rar/d8F2-puT/E-mailNet.html

  32. ML
    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. SI

      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. PR
        Paulo Rocha

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

  33. GW

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

  34. HM
    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. MD
    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. AT

    adorei era o que eu preocurava durante duas semanas

  37. MF
    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. HM
      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. MA
    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. MA
    Matheus

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

    1. RI
      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. RI
      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. HM
    Hélio Moreira

    Caro @Matheus,

    Pode indicar qual o erro que está a dar?

    Cumps,
    Hélio Moreira

  41. PR
    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. LL
    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. LL
    Leonardo Lopes

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

    1. HM
      Hélio Moreira

      Leonardo, que erro está a dar?

      1. LL
        Leonardo Lopes

        Será que me pode ajudar

  44. LL
    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. PM
      pedro moreira

      o mesmo

  45. PM
    pedro moreira

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

Deixe um comentário