Using SendAsync to send multiple emails
From the SendAsync docs:


  After calling SendAsync, you must wait for the e-mail transmission to
  complete before attempting to send another e-mail message using Send
  or SendAsync.


So no, this may not work properly. You need to register an event handler on the SmtpClient.SendCompleted event so that you know the message has sent successfully. 

I'm going to be frank about this, the SmtpClient has an awful API. Your confusion is not your fault. 

Your best bet would be to create a dictionary of recipients to use as a queue. 


Send the first message and pass the dictionary key in as the token. 
When the message completed event occurs, use the token to remove the recipient from the dictionary and send the next message. 
Repeat until the queue is empty. 


This is going to be a slow, fairly synchronous process, so you may want to spin up a background thread or task to run this on, if your program has other work to do while this is going on. 

I really encourage you to thoroughly read through the documentation I linked to. It's an old part of the framework and not very user (or async) friendly.  



Or forget all that and just use the newer SendMailAsync(MailMessage) method. 

Just be sure to await the result. 

    try
    {
        await client.SendMailAsync(mm);
    }


Which means that you'll need to modify the signature of your method to be compatible with async/await.