Don't use smtpClient.SendAsync 

If you are using SendAsync, you should check whether you can already send the next e-mail 
As stated in the SendAsync documentation (http://msdn.microsoft.com/en-us/library/x5x13z6h%28v=vs.110%29.aspx): "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."   You are not checking whether the transmission has ended or not.

Furthermore, if you use a callback, it's the callback who can tell you if the message has been send sucessuflly.  You are now returning true if the messages has been passed on a new thread.  You will (almost always) return true in your code.  Check also the example on the same url (http://msdn.microsoft.com/en-us/library/x5x13z6h%28v=vs.110%29.aspx).

IMHO (and experience) the default SMTP client is not very good when building async or parallel smtp sending of e-mails.