none
Envoi de mail lent? RRS feed

  • Question

  • Bonjour,
    Je suis débutant en .NET et dans le cadre d'un auto reply j'ai codé une petite méthode d'envoi d'email.
    Le problème c'est que la page met 1mn à se charger quand j'active l'auto reply ce qui est assez long.
    Je voudrai savoir s'il y a possibilité d'optimiser mon code voir de faire tourner l'instruction qui appelle la méthode en arrière plan (j'ai lu quelque part que .net permettait cela mais comment...)
    Voici donc le bout de code en question
    protected void EnvoyerMail(string Adresse)
        {
            MailMessage sonmail = new MailMessage();
            string utilisateur = ConfigurationSettings.AppSettings["SMTP_Auth_Login"];
            string password = ConfigurationSettings.AppSettings["SMTP_Auth_Password"];
            string serveur = ConfigurationSettings.AppSettings["SMTP_Server"];
            string from = ConfigurationSettings.AppSettings["SMTP_From"];
            sonmail.SubjectEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");
            sonmail.BodyEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");
            sonmail.IsBodyHtml = true;
            sonmail.From = new MailAddress(from);
            sonmail.To.Add(new MailAddress(Adresse));
            sonmail.Subject = "Bienvenue!";
            sonmail.Body = "le mail au format html";
            SmtpClient smtp = new SmtpClient();
            smtp.Host = serveur;
            smtp.Credentials = new System.Net.NetworkCredential(utilisateur, password);
            smtp.Send(sonmail);
        }
    Et j'appelle donc la méthode en faisant EnvoyerMail(Adresseemailauformatstring); depuis l'objet courant.
    J'utilise la classe System.Net.Mail;
    Merci beaucoup pour votre aide!
    Cya
    mercredi 22 juillet 2009 10:00

Réponses

  • Bonjour,

    Vous pouvez utiliser le composant BackgroundWorker pour faire tourner l'envoi de mail en arrière plan.

    Cordialement
    Gilles TOURREAU - MVP C#
    dimanche 26 juillet 2009 11:38
    Modérateur
  • Re,
    J'ai fini par trouver la réponse tout seul, en fait il vaut mieux utiliser system.threading avec la classe thread.
    En plus cela fait moins de code, virer tout le code du background worker et mettre cela à la place.
    Thread mailer = new Thread(new ThreadStart(EnvoyerMail_method));
    mailer.IsBackground = true;
    mailer.Start();
    La seule chose c'est que threadstart ne prend que des méthodes apparemment donc j'ai dû faire une méthode qui appelle la fonction, un moindre mal :)
    Merci à tous pour votre aide, sinon pour votre lecture!

    La doc de la classe thread: http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx
    Cya
    mardi 28 juillet 2009 14:11

Toutes les réponses

  • Bonjour,

    Vous pouvez utiliser le composant BackgroundWorker pour faire tourner l'envoi de mail en arrière plan.

    Cordialement
    Gilles TOURREAU - MVP C#
    dimanche 26 juillet 2009 11:38
    Modérateur
  • Bonjour,
    J'ai fait quelques essais depuis ce tuto http://glarde.developpez.com/dotnet/bgworker/cs/ qui est assez bien fait.
    La chose fonctionne mais je n'ai pas gagné en temps d'exécution côté utilisateur. Je poste donc mon code (en partie) ici pour que vous puissiez voir si je n'ai pas fait d'erreurs.
    Merci pour votre aide.
    ...
    using System.ComponentModel;
    
    public partial class _Default : System.Web.UI.Page 
    {
    private System.ComponentModel.BackgroundWorker bgwCode;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            ...
            if (Page.IsPostBack)
            {
                bgwCode = new BackgroundWorker();
                bgwCode.WorkerReportsProgress = false;
                bgwCode.WorkerSupportsCancellation = false;
                bgwCode.DoWork += new DoWorkEventHandler(bgwCode_DoWork);
                bgwCode.RunWorkerAsync((string)TxT__Email.Text);
            }
        }
       void bgwCode_DoWork(object sender, DoWorkEventArgs e)
        {
            e.Result = EnvoyerMail((string)e.Argument);
        }
    ...
    protected int EnvoyerMail(string Adresse)
        {
            MailMessage sonmail = new MailMessage();
            string utilisateur = ConfigurationSettings.AppSettings["SMTP_Auth_Login"];
            string password = ConfigurationSettings.AppSettings["SMTP_Auth_Password"];
            string serveur = ConfigurationSettings.AppSettings["SMTP_Server"];
            string from = ConfigurationSettings.AppSettings["SMTP_From"];
            sonmail.SubjectEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");
            sonmail.BodyEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");
            sonmail.IsBodyHtml = true;
            sonmail.From = new MailAddress(from);
            sonmail.To.Add(new MailAddress(Adresse));
            sonmail.Subject = "Bienvenue";
            sonmail.Body = "...";
    SmtpClient smtp = new SmtpClient();
            smtp.Host = serveur;
            smtp.Credentials = new System.Net.NetworkCredential(utilisateur, password);
            smtp.Send(sonmail);
            return (1);
        }
    ...
    }

    Cya
    mardi 28 juillet 2009 12:48
  • Re,
    J'ai fini par trouver la réponse tout seul, en fait il vaut mieux utiliser system.threading avec la classe thread.
    En plus cela fait moins de code, virer tout le code du background worker et mettre cela à la place.
    Thread mailer = new Thread(new ThreadStart(EnvoyerMail_method));
    mailer.IsBackground = true;
    mailer.Start();
    La seule chose c'est que threadstart ne prend que des méthodes apparemment donc j'ai dû faire une méthode qui appelle la fonction, un moindre mal :)
    Merci à tous pour votre aide, sinon pour votre lecture!

    La doc de la classe thread: http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx
    Cya
    mardi 28 juillet 2009 14:11