Отправляет только одно MailMessage из соединения. На самом деле, он даже не закрывает соединение должным образом. Он отправляет почту, но затем не сообщает почтовому серверу, что он хочет выйти. Таким образом, он просто остается открытым, пока основной объединенный поток не решит закрыть сокет.
Вот внутренний код от Reflector:
...
this.GetConnection();
fileMailWriter = this.transport.SendMail((message.Sender != null) ? message.Sender : message.From, recipients, message.BuildDeliveryStatusNotificationString(), out exception);
}
catch (Exception exception2)
{
if (Logging.On)
{
Logging.Exception(Logging.Web, this, "Send", exception2);
}
if ((exception2 is SmtpFailedRecipientException) && !((SmtpFailedRecipientException) exception2).fatal)
{
throw;
}
this.Abort();
if (this.timedOut)
{
throw new SmtpException(SR.GetString("net_timeout"));
}
if (((exception2 is SecurityException) || (exception2 is AuthenticationException)) || (exception2 is SmtpException))
{
throw;
}
throw new SmtpException(SR.GetString("SmtpSendMailFailure"), exception2);
}
Кстати, здесь больше информации о том, что SmtpClient не выполняет команду QUIT.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711&wa=wsignin1.0
Редактировать: просмотреть недействительную ссылку выше на web.archive.org
Обходное решение - установить SmtpClient.ServicePoint.MaxTimeout в 1. Это сократит сокет быстрее, однако на самом деле это не вызовет команду QUIT.