Creating new SMTP connection for each email is inefficient. Tracking what you sent and what is left is much wiser solution. You just need to catch all exceptions and simply retry.
By default, timeout values are set to 20 seconds. You can use SendTimeout and ReceiveTimout properties to change this value.
This value only affects single read/write to the network stream. Every command (or even every byte written/read) resets this value. Sending email takes at least 3 commands to complete.
I tend to not like re-declaring objects every time
There is no way to clear MailBuilder's attachments. Creating new object in .NET is really fast. You shouldn't worry about that.