Asynchronously sending Emails in C#?

后端 未结 10 1407
礼貌的吻别
礼貌的吻别 2020-11-28 23:43

I\'m developing an application where a user clicks/presses enter on a certain button in a window, the application does some checks and determines whether to send out a coupl

10条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-29 00:32

    As it's a small unit of work you should use ThreadPool.QueueUserWorkItem for the threading aspect of it. If you use the SmtpClient class to send your mail you could handle the SendCompleted event to give feedback to the user.

    ThreadPool.QueueUserWorkItem(t =>
    {
        SmtpClient client = new SmtpClient("MyMailServer");
        MailAddress from = new MailAddress("me@mydomain.com", "My Name", System.Text.Encoding.UTF8);
        MailAddress to = new MailAddress("someone@theirdomain.com");
        MailMessage message = new MailMessage(from, to);
        message.Body = "The message I want to send.";
        message.BodyEncoding =  System.Text.Encoding.UTF8;
        message.Subject = "The subject of the email";
        message.SubjectEncoding = System.Text.Encoding.UTF8;
        // Set the method that is called back when the send operation ends.
        client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
        // The userState can be any object that allows your callback 
        // method to identify this send operation.
        // For this example, I am passing the message itself
        client.SendAsync(message, message);
    });
    
    private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
            // Get the message we sent
            MailMessage msg = (MailMessage)e.UserState;
    
            if (e.Cancelled)
            {
                // prompt user with "send cancelled" message 
            }
            if (e.Error != null)
            {
                // prompt user with error message 
            }
            else
            {
                // prompt user with message sent!
                // as we have the message object we can also display who the message
                // was sent to etc 
            }
    
            // finally dispose of the message
            if (msg != null)
                msg.Dispose();
    }
    

    By creating a fresh SMTP client each time this will allow you to send out emails simultaneously.

提交回复
热议问题