Enviar um e-mail com o C#

Preciso de enviar e-mail através da minha aplicação C#.

Venho de um fundo VB 6 e tive muitas más experiências com o controlo MAPI. Em primeiro lugar, o MAPI não suportou e-mails HTML e, em segundo lugar, todos os e-mails foram enviados para a minha caixa de correio padrão. Então eu ainda precisava clicar em Enviar receber.

Se eu precisasse de enviar e - mails em html a granel (100-200), qual seria a melhor maneira de fazer isso em C#?

Obrigado antecipadamente.

 43
Author: Can Berk Güder, 2009-01-16

10 answers

Poderá usar a classe System.Net.Mail.MailMessage da plataforma. net.

Você pode encontrar a documentação MSDN aqui .

Aqui está um exemplo simples (excerto de código):

using System.Net;
using System.Net.Mail;
using System.Net.Mime;

...
try
{

   SmtpClient mySmtpClient = new SmtpClient("my.smtp.exampleserver.net");

    // set smtp-client with basicAuthentication
    mySmtpClient.UseDefaultCredentials = false;
   System.Net.NetworkCredential basicAuthenticationInfo = new
      System.Net.NetworkCredential("username", "password");
   mySmtpClient.Credentials = basicAuthenticationInfo;

   // add from,to mailaddresses
   MailAddress from = new MailAddress("[email protected]", "TestFromName");
   MailAddress to = new MailAddress("[email protected]", "TestToName");
   MailMessage myMail = new System.Net.Mail.MailMessage(from, to);

   // add ReplyTo
   MailAddress replyto = new MailAddress("[email protected]");
   myMail.ReplyToList.Add(replyTo);

   // set subject and encoding
   myMail.Subject = "Test message";
   myMail.SubjectEncoding = System.Text.Encoding.UTF8;

   // set body-message and encoding
   myMail.Body = "<b>Test Mail</b><br>using <b>HTML</b>.";
   myMail.BodyEncoding = System.Text.Encoding.UTF8;
   // text or html
   myMail.IsBodyHtml = true;

   mySmtpClient.Send(myMail);
}

catch (SmtpException ex)
{
  throw new ApplicationException
    ("SmtpException has occured: " + ex.Message);
}
catch (Exception ex)
{
   throw ex;
}
 69
Author: splattne, 2015-09-04 20:08:03

A melhor maneira de enviar e-mails em massa para uma forma mais rápida é usar threads.Eu escrevi este aplicativo de console para enviar e-mails em massa.Separei a identificação do E-mail em dois lotes, criando duas piscinas de fios.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net.Mail;

namespace ConsoleApplication1
{
    public class SendMail 
    {
        string[] NameArray = new string[10] { "Recipient 1", 
                                              "Recipient 2",
                                              "Recipient 3",
                                              "Recipient 4", 
                                              "Recipient 5", 
                                              "Recipient 6", 
                                              "Recipient 7", 
                                              "Recipient 8",
                                              "Recipient 9",
                                              "Recipient 10"
                                            };        

        public SendMail(int i, ManualResetEvent doneEvent)
        {
            Console.WriteLine("Started sending mail process for {0} - ", NameArray[i].ToString() + " at " + System.DateTime.Now.ToString());
            Console.WriteLine("");
            SmtpClient mailClient = new SmtpClient();
            mailClient.Host = Your host name;
            mailClient.UseDefaultCredentials = true;
            mailClient.Port = Your mail server port number; // try with default port no.25

            MailMessage mailMessage = new MailMessage(FromAddress,ToAddress);//replace the address value
            mailMessage.Subject = "Testing Bulk mail application";
            mailMessage.Body = NameArray[i].ToString();
            mailMessage.IsBodyHtml = true;
            mailClient.Send(mailMessage);
            Console.WriteLine("Mail Sent succesfully for {0} - ",NameArray[i].ToString() + " at " + System.DateTime.Now.ToString());
            Console.WriteLine("");

            _doneEvent = doneEvent;
        }

        public void ThreadPoolCallback(Object threadContext)
        {
            int threadIndex = (int)threadContext;
            Console.WriteLine("Thread process completed for {0} ...",threadIndex.ToString() + "at" +  System.DateTime.Now.ToString());
            _doneEvent.Set();
        }      

        private ManualResetEvent _doneEvent;
    }


    public class Program
    {
        static int TotalMailCount, Mailcount, AddCount, Counter, i, AssignI;  
        static void Main(string[] args)
        {
            TotalMailCount = 10;
            Mailcount = TotalMailCount / 2;
            AddCount = Mailcount;
            InitiateThreads();                     

            Thread.Sleep(100000);
        }

       static void InitiateThreads()
       {
            //One event is used for sending mails for each person email id as batch
           ManualResetEvent[] doneEvents = new ManualResetEvent[Mailcount];

            // Configure and launch threads using ThreadPool:
            Console.WriteLine("Launching thread Pool tasks...");

            for (i = AssignI; i < Mailcount; i++)            
            {
                doneEvents[i] = new ManualResetEvent(false);
                SendMail SRM_mail = new SendMail(i, doneEvents[i]);
                ThreadPool.QueueUserWorkItem(SRM_mail.ThreadPoolCallback, i);
            }

            Thread.Sleep(10000);

            // Wait for all threads in pool to calculation...
            //try
            //{
            // //   WaitHandle.WaitAll(doneEvents);
            //}
            //catch(Exception e)
            //{
            //    Console.WriteLine(e.ToString());   
            //}

            Console.WriteLine("All mails are sent in this thread pool.");
            Counter = Counter+1;
            Console.WriteLine("Please wait while we check for the next thread pool queue");
            Thread.Sleep(5000);
            CheckBatchMailProcess();            
        }

        static  void CheckBatchMailProcess()
        {

            if (Counter < 2)
            {
                Mailcount = Mailcount + AddCount;
                AssignI = Mailcount - AddCount;
                Console.WriteLine("Starting the Next thread Pool");

                Thread.Sleep(5000);
                InitiateThreads();
            }

            else
            {
                Console.WriteLine("No thread pools to start - exiting the batch mail application");
                Thread.Sleep(1000);
                Environment.Exit(0);
            }
        }
    }   
}

Defini 10 recepientes na lista para um sample.It irá criar dois lotes de E-mails para criar dois grupos de thread para enviar e-mails.Você pode escolher os detalhes de sua base de dados também.

Pode usar este código copiando-o e colando-o num aplicação de consola.(Substituindo o programa.cs file).Em seguida, a aplicação está pronta a usar.

Espero que isto te ajude.
 16
Author: Vijaya Priya, 2012-02-24 14:46:07

Código:

using System.Net.Mail

new SmtpClient("smtp.server.com", 25).send("[email protected]", 
                                           "[email protected]", 
                                           "subject", 
                                           "body");

E-Mails Em Massa:

Os servidores SMTP normalmente têm um limite no número de ligações que o chapéu pode lidar de uma vez, se tentar enviar centenas de E-mails que a sua aplicação pode parecer não responder.

Soluções:

  • se está a construir um WinForm, então use um BackgroundWorker para processar a fila.
  • Se estiver a usar o servidor de IIS SMTP ou um servidor de SMTP que tem uma pasta de Saída, então poderá usar SmtpClient ().PickupDirectoryLocation = "c:/smtp/outboxFolder"; isso vai manter o seu sistema responsivo.
  • Se não estiver a usar um servidor de SMTP local do que poderia criar um serviço de sistema para usar o Filewatcher para monitorizar um forlder do que irá então processar todos os e-mails que largar aí.
 7
Author: rizzle, 2009-03-03 16:53:01

A plataforma. NET tem algumas classes incorporadas que lhe permitem enviar e-mail através da sua aplicação.

Deverá dar uma vista de olhos no espaço de nomes do System.Net.Mail, onde poderá encontrar as classes MailMessage e SmtpClient. Você pode definir o corpo format da classe MailMessage para MailFormat.Galeria.

Também pode ser útil se você fizer uso da propriedade AlternateViews da classe MailMessage, para que você possa fornecer uma versão de texto simples do seu mail, para que ele possa ser lido por clientes que não suportam HTML.

Http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.alternateviews.aspx

 4
Author: Frederik Gheysels, 2009-01-16 09:02:27

Pode enviar e-mail com SMTP ou CDO

Utilizar SMTP:

mail.From = new MailAddress("[email protected]");
mail.To.Add("to_address");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";

SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;

Fonte: C# SMTP Email

CDO.Message oMsg = new CDO.Message();
CDO.IConfiguration iConfg;
iConfg = oMsg.Configuration;
ADODB.Fields oFields;
oFields = iConfg.Fields;
ADODB.Field oField = oFields["http://schemas.microsoft.com/cdo/configuration/sendusing"];
oFields.Update();
oMsg.Subject = "Test CDO";
oMsg.From = "from_address";
oMsg.To = "to_address";
oMsg.TextBody = "CDO Mail test";
oMsg.Send();

Fonte: C# CDO Email

Masculino

 3
Author: Jerrym, 2014-01-20 07:25:21

Posso recomendar vivamente a biblioteca aspNetEmail: http://www.aspnetemail.com/

O {[[0]} vai levá-lo a algum lugar se as suas necessidades são apenas básicas, mas se você se deparar com problemas, por favor verifique aspNetEmail. Ele me salvou um monte de tempo, e eu sei de outros develoeprs que também jurar por ele!

 2
Author: JMS, 2009-03-10 12:43:45

Use o sistema de espaços de nomes. Net. Mail. aqui está uma ligação para a página MSDN

Pode enviar e-mails com a classe SmtpClient.

Eu parafraseei a amostra de código, por isso verifique o MSDN para mais detalhes.
MailMessage message = new MailMessage(
   "[email protected]",
   "[email protected]",
   "Subject goes here",
   "Body goes here");

SmtpClient client = new SmtpClient(server);
client.Send(message);
A melhor maneira de enviar muitos e-mails seria colocar algo assim no forloop e mandar embora!
 1
Author: bentford, 2009-01-16 09:00:34
Olha para a Biblioteca FluentEmail. Tenho blogado sobre isso aqui Tens uma api agradável e fluente para as tuas necessidades.
Email.FromDefault()
 .To("[email protected]")
 .Subject("New order has arrived!")
 .Body("The order details are…")  
 .Send();
 0
Author: Dennis Nerush, 2014-02-23 20:32:48
Vamos fazer algo como uma solução completa:). Talvez também possa ajudar. É uma solução para enviar um conteúdo de E-mail e um arquivo anexado (ou sem anexar) para muitos endereços de E-mail. Claro que enviar apenas um e-mail também é uma possibilidade. Resultado é listar objeto com dados o que está OK e o que não está.
namespace SmtpSendingEmialMessage
{ 
    public class EmailSetupData
    {
        public string EmailFrom { get; set; }
        public string EmailUserName { get; set; }
        public string EmailPassword { get; set; }
        public string EmailSmtpServerName { get; set; }
        public int EmailSmtpPortNumber { get; set; }
        public Boolean SSLActive { get; set; } = false;
    }

    public class SendingResultData
    {
        public string SendingEmailAddress { get; set; }
        public string SendingEmailSubject { get; set; }
        public DateTime SendingDateTime { get; set; }
        public Boolean SendingEmailSuccess { get; set; }
        public string SendingEmailMessage { get; set; }
    }
    public class OneRecData
    {
        public string RecEmailAddress { get; set; } = "";
        public string RecEmailSubject { get; set; } = "";
    }


    public class SendingProcess
    {
        public string EmailCommonSubjectOptional { get; set; } = "";
        private EmailSetupData EmailSetupParam { get; set; }
        private List<OneRecData> RecDataList { get; set; }
        private string EmailBodyContent { get; set; }
        private Boolean IsEmailBodyHtml { get; set; }
        private string EmailAttachFilePath { get; set; }

        public SendingProcess(List<OneRecData> MyRecDataList, String MyEmailTextContent, String MyEmailAttachFilePath, EmailSetupData MyEmailSetupParam, Boolean EmailBodyHtml)
        {
            RecDataList = MyRecDataList;
            EmailBodyContent = MyEmailTextContent;
            EmailAttachFilePath = MyEmailAttachFilePath;
            EmailSetupParam = MyEmailSetupParam;
            IsEmailBodyHtml = EmailBodyHtml;
        }

        public List<SendingResultData> SendAll()
        {
            List<SendingResultData> MyResList = new List<SendingResultData>();
            foreach (var js in RecDataList)
            {
                using (System.Net.Mail.MailMessage MyMes = new System.Net.Mail.MailMessage())
                {
                    DateTime SadaJe = DateTime.Now;
                    Boolean IsOK = true;
                    String MySendingResultMessage = "Sending OK";

                    String MessageSubject = EmailCommonSubjectOptional;
                    if (MessageSubject == "")
                    {
                        MessageSubject = js.RecEmailSubject;
                    }

                    try
                    {

                        System.Net.Mail.MailAddress MySenderAdd = new System.Net.Mail.MailAddress(js.RecEmailAddress);
                        MyMes.To.Add(MySenderAdd);
                        MyMes.Subject = MessageSubject;
                        MyMes.Body = EmailBodyContent;
                        MyMes.Sender = new System.Net.Mail.MailAddress(EmailSetupParam.EmailFrom);
                        MyMes.ReplyToList.Add(MySenderAdd);
                        MyMes.IsBodyHtml = IsEmailBodyHtml;

                    }
                    catch(Exception ex)
                    {
                        IsOK = false;
                        MySendingResultMessage ="Sender or receiver Email address error." +  ex.Message;
                    }

                    if (IsOK == true)
                    {
                        try
                        {
                            if (EmailAttachFilePath != null)
                            {
                                if (EmailAttachFilePath.Length > 5)
                                {
                                    MyMes.Attachments.Add(new System.Net.Mail.Attachment(EmailAttachFilePath));
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            IsOK = false;
                            MySendingResultMessage ="Emial attach error. " +  ex.Message;
                        }

                        if (IsOK == true)
                        {
                            using (System.Net.Mail.SmtpClient MyCl = new System.Net.Mail.SmtpClient())
                            {
                                MyCl.EnableSsl = EmailSetupParam.SSLActive;
                                MyCl.Host = EmailSetupParam.EmailSmtpServerName;
                                MyCl.Port = EmailSetupParam.EmailSmtpPortNumber;
                                try
                                {
                                    MyCl.Credentials = new System.Net.NetworkCredential(EmailSetupParam.EmailUserName, EmailSetupParam.EmailPassword);
                                }
                                catch (Exception ex)
                                {
                                    IsOK = false;
                                    MySendingResultMessage = "Emial credential error. " + ex.Message;
                                }

                                if (IsOK == true)
                                {
                                    try
                                    {
                                        MyCl.Send(MyMes);
                                    }
                                    catch (Exception ex)
                                    {
                                        IsOK = false;
                                        MySendingResultMessage = "Emial sending error. " + ex.Message;
                                    }
                                }
                            }
                        }
                    }

                    MyResList.Add(new SendingResultData
                    {
                            SendingDateTime = SadaJe,
                            SendingEmailAddress = js.RecEmailAddress,
                            SendingEmailMessage = MySendingResultMessage,
                            SendingEmailSubject = js.RecEmailSubject,
                            SendingEmailSuccess = IsOK
                    });
                }

            }
            return MyResList;
        }
    }

}
 0
Author: user2721448, 2018-07-19 12:15:16

Podes usar o Mailkit.MailKit é uma biblioteca de código aberto multi-plataforma.net mail-cliente que é baseado no MimeKit e otimizado para dispositivos móveis.

Ele tem mais e mais recursos avançados melhor do que o sistema. Net. Mail

  • Um Pop3Client totalmente cancelável com suporte para STLS, UIDL, APOP, PIPELINING, UTF8 e LANG. Ordenação e roscagem do lado do cliente mensagens (o assunto Ordinal e o tópico Jamie Zawinski algoritmos são suportados).
  • assíncrono versões de todos os métodos que atingem a rede.
  • S / MIME, OpenPGP e suporte de assinatura DKIM através do MimeKit.
  • Suporte do Microsoft TNEF via MimeKit.

    Você pode baixar de Aqui.

Veja este exemplo que pode enviar por e-mail

            MimeMessage mailMessage = new MimeMessage();
            mailMessage.From.Add(new MailboxAddress(senderName, [email protected]));
            mailMessage.Sender = new MailboxAddress(senderName, [email protected]);
            mailMessage.To.Add(new MailboxAddress(emailid, emailid));
            mailMessage.Subject = subject;
            mailMessage.ReplyTo.Add(new MailboxAddress(replyToAddress));
            mailMessage.Subject = subject;
            var builder = new BodyBuilder();
            builder.TextBody = "Hello There";            
            try
            {
                using (var smtpClient = new SmtpClient())
                {
                    smtpClient.Connect("HostName", "Port", MailKit.Security.SecureSocketOptions.None);
                    smtpClient.Authenticate("[email protected]", "password");

                    smtpClient.Send(mailMessage);
                    Console.WriteLine("Success");
                }
            }
            catch (SmtpCommandException ex)
            {
                Console.WriteLine(ex.ToString());              
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
            }
 0
Author: Naveen Soni, 2018-08-04 10:59:51