2010-04-12 6 views
7

Sto scrivendo un'applicazione che dovrà inviare una grande quantità di e-mail ai nostri studenti che saranno selezionati dal nostro database (ogni e-mail sarà personalizzata nella misura in cui includerà il loro nome, corso di studio ecc ... quindi deve essere inviato uno alla volta).Invio di oltre 20.000 e-mail con asp.net

Potrei fare questo loop su un SmtpClient, ma temo che con i numeri che sto cercando di inviare, finirò per finire in problemi di timeout o il mio thread viene ucciso a causa della mancanza di risorse della macchina.

A questo punto, sto solo cercando suggerimenti per un modo migliore di gestirlo, o se il ciclo su SmtpClient è una soluzione ok, come dovrei andare a gestirlo per evitare quello che ho postato sopra.

Un servizio Web sarebbe un'alternativa migliore?

Si prega di comunicare, TIA

+0

avete bisogno di andare con alcuni strumenti di terze parti – anishMarokey

+2

che non c'è bisogno di andare con un po 'di terze parti strumenti –

risposta

11

Il mio suggerimento sarebbe di farlo uscire. Non tentare di eseguire il codice ASP.NET per creare e-mail 20K e inviarle perché si è obbligati a eseguire un timeout e problemi di prestazioni. Piuttosto compilare una tabella con destinatario, oggetto, corpo e iniziare un processo batch da un servizio di Windows. In questo modo il tuo codice viene eseguito in modo da poter gestire il ritardo, invece di avere una pagina web in attesa che la richiesta venga restituita.

+0

questo approccio sembra promettente. Sto già salvando le e-mail in un tavolo. Ci scusiamo per una domanda noobish, ma come potrei chiamare questo servizio di Windows per farlo avviare l'invio delle e-mail, e allo stesso modo, come potrei segnalare al client quali sono stati inviati con successo e quali non sono riusciti dal servizio Windows? – Kyle

+0

non dovresti chiamare il servizio Windows. lascia correre. Il servizio potrebbe essere progettato per controllare il tuo tavolo e vedere se c'è del lavoro da fare. se ci sono e-mail che non sono state inviate, raggruppale e inviale. Fondamentalmente il servizio dovrebbe essere progettato per interrogare quel tavolo ogni 5 minuti circa. (Nota che dovresti mettere un flag bool su quel tavolo che dice se è stato inviato e per scopi preformance metti un indice sul flag bool.) Ora quando chiedi al tavolo tutti gli oggetti non inviati, se il count è maggiore di uno allora il il servizio inizia a inviare email. Per quanto riguarda la segnalazione al client –

+0

cool. Darò questo via. grazie – Kyle

6

Ok, prima - questo non è certo enorme, ho movimentazione 50.000 messaggi di posta elettronica +

Lasciate che i messaggi di posta elettronica scritti in una cartella - directory. Quindi utilizzare il servizio SMTP locale che è possibile installare, puntandolo nella cartella come directory di prelievo. Ciò garantirà almeno di avere un buffer decente in mezzo (cioè si può finire il lato asp.net, mentre le e-mail non vengono inviate in quel punto).

+0

Il primo problema che viene in mente è che tutti i nostri studenti usano una "terza parte" per la loro e-mail (tutti usano la stessa), che ha il nostro server di Exchange elencato come "un mittente ok". Purtroppo non ho accesso al server di scambio per dirgli di recuperare le e-mail da questa 'cartella' ... è tutto sulle spalle della nostra infrastruttura. Inoltre, non ho accesso per aggiungere il server web come "mittente ok" sulla nostra terza parte (dove sono tutti gli indirizzi email) ... quindi non posso usarlo come server smtp lì. Se ho creato un servizio web per gestire l'invio delle e-mail attraverso il nostro scambio ... sarebbe che volano – Kyle

+0

In realtà dov'è il problema? Scherzi a parte ... Il servizio SMTP LOCALE può essere configurato per (a) utilizzare il server Exchange come relay e (b) autenticare lì usando un nome utente e una password, come faresti con il tuo normale servizio smtp. – TomTom

+0

la tua risposta non fornisce alcuna soluzione, invece, stai solo facendo più domande. Ti aspettavi che 20.000 utenti si trovassero sullo stesso provider di posta elettronica? La tua risposta mostra che non hai esperienza nell'invio di questo tipo di email. –

0

È possibile utilizzare javascript su un timer per richiedere lo script che invia la posta in piccole porzioni che non scadono. Quindi chiameresti lo script dal browser. Aggiungi una barra di avanzamento, l'autenticazione, ecc.

0

Non è necessario un servizio Web, ma piuttosto un modo per raggruppare le e-mail in una coda (forse una tabella "Email_Queue" nel DB). Quindi, un servizio Windows in esecuzione su un server poteva leggere la coda in base al principio "first-in/first-out" a pezzi ragionevoli alla volta inviati a SMTPClient, rimuovendo gli articoli dalla coda mentre venivano elaborati. Probabilmente dovresti eseguire alcune misurazioni per determinare quale sarebbe la dimensione e il ritardo del blocco per il tuo server di posta.

2

Informazioni sull'utilizzo di Database Mail strumento fornito da SQL Server stesso. Puoi ancora usare asp.net ma Email verrà inviata da SQL Server e tutto ciò che devi fare chiama la stored procedure e lascia le cose a SQL Server.

Non consiglierei l'opzione batch poiché non ci sarà alcuna ottimizzazione o coda, a meno che non si debba fare un grande sforzo per farlo.

Lo strumento Mail di database fornisce anche le opzioni di coda e prioritarie. Se si verifica un problema, l'e-mail verrà nuovamente messa in coda e inviata in seguito, ma gli altri verranno ancora inviati.

Si chiama Posta elettronica database in SQL Server 2008 e SQL Mail nelle versioni precedenti.

Per ulteriori informazioni, si prega di controllare i link qui sotto:

+0

La cosa semplicemente fa schifo e non dovrebbe mai essere utilizzata in SQL Server per iniziare. – TomTom

+0

Cosa fa semplicemente schifo? – Tarik

+1

per favore ignori TomTom: è nato ubriaco! Hai visto alcuni dei suoi altri commenti? –

Problemi correlati