Domanda

sto cercando buone prestazioni durante l'invio di un sacco di e-mail.

Ho sentito dire che il modo giusto per farlo è quello di aprire una connessione inviare ~ 20 e-mail e chiudere la connessione. E farlo più e più volte. È corretto?

E come fa il lavoro SmtpClient, vuol aprire una connessione per essa la propria vita? (Non IDisposable, così non sembra così) Oppure è aprire una connessione per ogni e-mail inviati? O ha una connessione aperta per tutto il tempo? O ha qualcosa di magico che si apre e chiude le connessioni quando è opportuno?

Vorrei sapere quindi so come avrei dovuto iniziare la SmtpClient. Come un singolo o solo per un pezzo di messaggi ...

È stato utile?

Soluzione

Si invia un solo MailMessage da una connessione. In realtà, non ha nemmeno correttamente chiudere la connessione. Si invia la posta, ma poi non dice il server di posta che vuole smettere di fumare. Così, semplicemente lascia spalancata, fino a quando il flusso di pool sottostante decide di chiudere il socket.

Ecco il codice interno da riflettore:

...
        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);
        }

A proposito, qui è più informazioni sul SmtpClient non emettendo il comando QUIT. https://connect.microsoft.com/VisualStudio/ feedback / ViewFeedback.aspx? FeedbackID = 146.711 & wa = wsignin1.0

Modifica: visualizzare il link morto sopra il web.archive.org

Il work-around è quello di impostare SmtpClient.ServicePoint.MaxTimeout a 1. Questo chiuderà la presa più veloce, tuttavia, questo in realtà non emettere il comando QUIT.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top