Help with SMTP mailer


I have working the following smtp script, in my C# console application.

At the bottom of the script where the message is sent I've included, Thread.Sleep(10000).  If this isnt there the message is disposed, and it doesnt send.  

My question is - How do I remove the Thread.Sleep(10000), and get the code to end (message.dispose) after the message has been sent?
static bool mailSent = false;
        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
            // Get the unique identifier for this asynchronous operation.
            String token = (string)e.UserState;
            if (e.Cancelled)
                Console.WriteLine("[{0}] Send canceled.", token);
            if (e.Error != null)
                Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
                Console.WriteLine("Message sent.");
            mailSent = true;
        public static void SendMail(string args, string emailto, string theServer)
            // Command line argument must the the SMTP host.
            SmtpClient client = new SmtpClient(args.ToString());
            // Specify the e-mail sender.
            // Create a mailing address that includes a UTF8 character
            // in the display name.
            MailAddress from = new MailAddress("",
            // Set destinations for the e-mail message.
            MailAddress to = new MailAddress(emailto);
            // Specify the message content.
            MailMessage message = new MailMessage(from, to);
            message.Body = "alert: Server, " + theServer + " (IS DOWN)";
            // Include some non-ASCII characters in body and subject.
            string someArrows = new string(new char[] { '\u2190', '\u2191', '\u2192', '\u2193' });
            message.Body += Environment.NewLine + someArrows;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.Subject = "alert";
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            // Set the method that is called back when the send operation ends.
            client.SendCompleted += new
            // The userState can be any object that allows your callback 
            // method to identify this send operation.
            // For this example, the userToken is a string constant.
            string userState = "test message";
            client.SendAsync(message, userState);

Open in new window

Who is Participating?
l-cmConnect With a Mentor Commented:
You shouldn't need to dispose of your message garbage collection should handle it for you, but if you want you can set an event for when the message has been sent.

client.SendCompleted += new SendCompletedEventHandler(SmtpClient_OnCompleted);

See this article about sending email asynchronously

If you do need to dispose of the message then just send the message and then dispose it without using SendAsync

client.SendAsync(message, userState);
mhouldridgeAuthor Commented:
Absolutely fantastic!
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.