55 votes

L'envoi d'E-mail à l'aide de C#

J'ai besoin d'envoyer des mails via mon application en C#.

Je viens d'une VB 6 arrière-plan, et a eu beaucoup de mauvaises expériences avec le contrôle MAPI. Tout d'abord, MAPI n'a pas en charge les e-mails HTML et le deuxième, tous les e-mails ont été envoyés à mon courrier par défaut de la boîte d'envoi. Donc, j'ai encore besoin de cliquer sur envoyer et recevoir.

Si j'avais besoin d'envoyer en masse html corsé e-mails (100 - 200), quelle serait la meilleure façon de le faire en C#?

Merci à l'avance.

85voto

splattne Points 48126

Vous pouvez utiliser le Système.Net.Mail.MailMessage classe de l' .NET framework.

Vous pouvez trouver la documentation MSDN ici.

Voici un exemple simple (extrait de code):

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("test@example.com", "TestFromName");
   MailAddress to = new MailAddress("test2@example.com", "TestToName");
   MailMessage myMail = new System.Net.Mail.MailMessage(from, to);

   // add ReplyTo
   MailAddress replyto = new MailAddress("reply@example.com");
   myMail.ReplyTo = 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;
}

16voto

Vijaya Priya Points 1

La meilleure façon d'envoyer des courriels de masse pour plus de moyen plus rapide est d'utiliser des threads.J'ai écrit cette console application pour envoyer des courriels de masse.J'ai séparé l'email en vrac ID en deux lots par la création de deux pools de threads.

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);
            }
        }
    }   
}

J'ai défini 10 recepients dans le tableau de la liste pour un échantillon.Il permettra de créer deux lots de courriels afin de créer deux pools de threads pour envoyer des mails.Vous pouvez choisir les détails de votre base de données.

Vous pouvez utiliser ce code à copier / coller dans une application console.(En remplacement du programme.cs fichier).Ensuite, l'application est prête à l'utilisation.

J'espère que cela vous aide à vous :).

13voto

rizzle Points 3127

Code:

using System.Net.Mail

new SmtpClient("smtp.server.com", 25).send("from@email.com", 
                                           "to@email.com", 
                                           "subject", 
                                           "body");

E-Mails De Masse:

Les serveurs SMTP ont généralement une limite sur le nombre de connexion chapeau peut gérer à la fois, si vous essayez d'envoyer des centaines d'e-mails de l'application peut sembler ne pas répondre.

Solutions:

  • Si vous êtes à la construction d'une WinForm, puis utilisez un BackgroundWorker pour traiter la file d'attente.
  • Si vous utilisez le serveur SMTP IIS ou un serveur SMTP qui a un dossier boîte d'envoi, alors vous pouvez utiliser SmtpClient().PickupDirectoryLocation = "c:/smtp/outboxFolder"; Cela permet de garder votre système réactif.
  • Si vous n'êtes pas en utilisant un serveur SMTP local que vous pouvez construire un système de service à utiliser Filewatcher pour surveiller un forlder que ne puis traiter les e-mails que vous déposez dans il.

4voto

Frederik Gheysels Points 36354

L' .NET framework a certaines classes intégrées qui vous permet d'envoyer des e-mails via votre application.

Vous devriez jeter un oeil dans le Système.Net.Le courrier de l'espace de noms, où vous trouverez les MailMessage et SmtpClient classes. Vous pouvez définir la BodyFormat de la classe MailMessage à MailFormat.Html.

Il pourrait également être utile si vous utilisez de la AlternateViews propriété de la classe MailMessage, de sorte que vous pouvez fournir un texte brut de la version de votre courrier, de sorte qu'il peut être lu par les clients qui ne prennent pas en charge le format HTML.

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

2voto

JMS Points 1121

Je peux que recommander fortement la aspNetEmail de la bibliothèque: http://www.aspnetemail.com/

L' System.Net.Mail , vous obtiendrez quelque part, si vos besoins ne sont que de base, mais si vous avez des problèmes, s'il vous plaît vérifier aspNetEmail. Il m'a sauvé un paquet de temps, et je sais que d'autres develoeprs aussi qui ne jurent que par elle!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X