21 messaggi dal 18 novembre 2005
Ciao a tutti,

ho un problema ad inviare una newsletter ai 1400 utenti iscritti;
infatti da qualche tempo il mio provider (NGI) ha messo un limite massimo di 100 e-mail inviate contemporaneamente...

Volevo quindi fare uno script che inviasse "pacchetti" di 100 indirizzi email alla volta...

gli indirizzi li prendo da un database SQL Server 2005

Secondo voi come posso procedere ?

si può fare con un loop su una query del database o in che modo ???

Qui di seguito il codice che ho utilizzato fin'ora....

Grazie per qualsiasi suggerimento!



Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Try

Dim objConnect As New SqlConnection(ConfigurationSettings.AppSettings("StringaConnessione"))
objConnect.Open()

Dim strSQL As String

'creo la lista dei destinatari

strSQL = "SELECT email FROM tab_utenti_newsletter"

Dim objCommand As New SqlCommand(strSQL, objConnect)
Dim myReader As SqlDataReader = objCommand.ExecuteReader()

Dim Destinatari As String = ""

While myReader.Read()
Destinatari = Destinatari & myReader.GetString(0) & ", "
End While

myReader.Close()
objConnect.Close()

'invio la Newsletter

Dim Mail As New MailMessage
Mail.From = TextBox_Mittente.Text
Mail.To = TextBox_EMail_Mittente.Text
Mail.Bcc = Destinatari
Mail.Subject = TextBox_Oggetto.Text
Mail.BodyFormat = MailFormat.Html
Mail.Body = FreeTextBox_Corpo_Messaggio.Text
SmtpMail.SmtpServer = "smtp.ngi.it"
SmtpMail.Send(Mail)


Label_Messaggio.Text = "Newsletter inviata con successo!"
Catch exc As Exception
Label_Messaggio.Text = "Errore!<br>" & exc.ToString
End Try
End Sub
Ciao, la soluzione ideale sarebbe creare un Windows Services, ma posso capire e/o immaginare che il tuo provider non ti consenta di installarlo. In alternativa una soluzione possibile è l'utilizzo dei thread lavorando in asincrono.

Una possibile soluzione sarebbe creare X thread in base al numero di inviii, o meglio, se devi inviare 1000 email puoi creare 10 thread che inviano 100 email a thread.
Ovviamente devi aprirne uno alla volta e tramite i delegate, quando il primo thread ha finito il suo lavoro, fai partire il secondo.
Attenzione alla gestione degli errori!!! L'esecuzione della pagina è immeditata e il thread sta lavorando in asincrono, quindi non puoi sapere come sta andando il lavoro.

Probabilmente non è la soluzione ideale, ma non potendo utilizzare un servizio windows è la prima soluzione che mi è venuta in mente  .
Ciauz

imperugo
Microsoft MVP
myblog : http://www.tostring.it
21 messaggi dal 18 novembre 2005
Pensavo a qualcosa del tipo
Carico tutti i dati del database SQL in un datatable
a questo punto con un ciclo estraggo 100 record alla volta dalla datatable...

ma mi chiedo... è possibile estrarre i record in questo modo da una datatable ?
cioè dal record 1 al record 100 e poi dal 101 al 200, ecc... ?
1.495 messaggi dal 27 dicembre 2005
Certo,ti appoggi ad una variabile che funge da contatore.
189 messaggi dal 28 maggio 2007
Ciao David, secondo me non è una buona pratica inviare 100 mail alla volta.

Ad esempio, se tra questi 100 mail ci sono 50 del provider HOTMAIL, certamente i filtri hotmail si incazzano e la tua mail o viene inviata alla cartella SPAM o viene rifiutata.

Soluzioni? Bhe, le aziende che lavorano con invio di newsletter e che hanno bisogno di inviare migliaia di mail al giorno (purtroppo vale pure a quelle che inviano i maledetti spam) usano soluzioni per "ingannare" i filtri. Ad esempio, HOTMAIL quando riceve 50 mail da uno stesso IP (smtp) fa bene di rifiutare i messaggi.
Quindi, una soluzione adottata è quella di usare più IP per inviare le mail.

Purtroppo, non c'è molto da fare per un sito che usa un server condiviso, visto che non può utilizzare altri IP (come SMTP server) e nemmeno Servizi Windows o altre possibilità di "meccanizzare" il sistema di invio ogni X secondi.

Quello che potresti fare è:
creare una tabella temporanea per ogni newsletter (invio), con il nome utente, indirizzo mail e un campo booleano stato. Fai un select di X registri (pensi tu quanto vuoi, 100... 50...) e dopo l'invio setta lo stato come TRUE, ovvero, MAIL INVIATA.
Nella pagina di risposta metti una funzione javascript che dopo X secondi (vedi tu quanto vuoi) fa l'invio successivo. Puoi pure indicare all'utente: INVIATE X mail di un totale di XXX.

Bella soluzione? NO, NO, NO. Anche perché, se il numero di mail è grande, ci vogliono ore per finire il processo di invio.
Però, visto che i provider usano tanti filtri e il tuo sito usa server condiviso (o sia, senza libertà e possibilità di scegliere alternative migliori) è una soluzione che almeno funziona :)

Ho utilizzato questa soluzione 4 anni fa in un'azienda all'estero e mi pare che fino ad oggi utilizzano il sistema
Però se cerchi un po' su questo argomento (invio di newsletter, filtri spam, regole anti-spam, ecc) magari trovi una soluzione migliore e più moderna.

Saluti

Andrea R.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.