[VB.NET] Mass Mailing

Pagina: 1
Acties:

  • Friedchicken
  • Registratie: Maart 2000
  • Laatst online: 20-06-2015
Nu ben ik een aantal uurtjes bezig met het maken van een goed werkend mail systeem. Het is de bedoeling om de ontvangers een nieuwsbrief te sturen in HTML format. Het html verstuur gedeelte lukt. Nu komen er hoogst waarschijnlijk een kleine 400 ontvangers in de DB.

Op dit moment verstuur ik op de volgende manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 Dim ontvangers As String

        connectie.Open()
        Dim queryOntvangers As String = "SELECT KlantEmail as ontvangers from Klanten WHERE KlantNBOntvangen='1'"
        Dim cmdOntvangers As SqlCommand = New SqlCommand(queryOntvangers, connectie)
        Dim dtrOntvangers As SqlDataReader = cmdOntvangers.ExecuteReader()

        While dtrOntvangers.Read()
            ontvangers = dtrOntvangers.GetSqlString(0).Value

            Dim mail As MailMessage = New MailMessage

            'Gegevens die E-mail moet bevatten
            mail.To = ontvangers
            mail.From = "noreply@host.nl"
            mail.BodyFormat = MailFormat.Html
            SmtpMail.SmtpServer = "smtp.xs4all.nl"
            mail.Subject = "Multiple test"

            mail.Body = "<font face='Tahoma, Arial, Helvetica, sans-serif' size='2'>Komt dit netjes aan ?</font>"

            'Daadwerkelijke commando versturen e-mail
            SmtpMail.Send(mail)

            'update the email counter
            EmailCounter += 1
            

        End While

        dtrOntvangers.Close()
        connectie.Close()


Over 20 adressen doet hij nu een seconden of 5. Je raad het vast al dat op een gegeven moment er 400 mailtjes uit moeten dat het lang duurt en of zelfs stuk loopt.

Ik heb al een aantal manieren gevonden om mass mailing te doen. Sommige hiervan hebben mooie progress balken.

http://www.aspnetemail.com/samples/webmailer/ <-- deze verstuurd zo'n 1500 mails in zeer korte tijd.

De source van deze mag je bekijken en alles krijg je voor elkaar geprogged, totdat je op moment van versturen komt. Dan mag je een licentie bij de mannen kopen. Op zich respect voor ze, het ziet er goed uit. Maar nu zou ik graag willen weten of mijn zelf geschreven code beter kan op het versturen niveau..

  • Giblet
  • Registratie: December 2001
  • Laatst online: 21-04 21:40

Giblet

Dingen

Ik vermoed dat het aan het feit ligt dat je het naar de mailserver van XS4All stuurt en de site van je voorbeeld waarschijnlijk localhost als mailserver gebruikt.

Test het dus eens met localhost :)

  • Friedchicken
  • Registratie: Maart 2000
  • Laatst online: 20-06-2015
De standaard content van de mail heb ik uit de while gehaald.

code:
1
2
3
4
5
6
 While dtrOntvangers.Read()
            ontvangers = dtrOntvangers.GetSqlString(0).Value
            mail.To = ontvangers
            EmailCounter += 1
            SmtpMail.Send(mail)
        End While


En idd, als ik b.v. 20 mails verstuur vanaf localhost (op webserver) dan gooit hij deze in minder dan 1 sec eruit...

Op naar het bouwen van de progressie balk...

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

met giblet ^^
Eventueel zou je je prog nog wat kunnen optimaliseren door zoiets te doen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 Dim ontvangers As String

        connectie.Open()
        Dim queryOntvangers As String = "SELECT KlantEmail as ontvangers from Klanten WHERE KlantNBOntvangen='1'"
        Dim cmdOntvangers As SqlCommand = New SqlCommand(queryOntvangers, connectie)
        Dim dtrOntvangers As SqlDataReader = cmdOntvangers.ExecuteReader()

        Dim mail As MailMessage = New MailMessage

        'Gegevens die E-mail moet bevatten
        mail.From = "noreply@host.nl"
        mail.BodyFormat = MailFormat.Html
        SmtpMail.SmtpServer = "smtp.xs4all.nl"
        mail.Subject = "Multiple test"

        mail.Body = "<font face='Tahoma, Arial, Helvetica, sans-serif' size='2'>Komt dit netjes aan ?</font>"

        While dtrOntvangers.Read()
            ontvangers = dtrOntvangers.GetSqlString(0).Value

            mail.To = ontvangers
           
            'Daadwerkelijke commando versturen e-mail
            SmtpMail.Send(mail)

            'update the email counter
            EmailCounter += 1
            

        End While

        dtrOntvangers.Close()
        connectie.Close()


Dit scheelt je iig het elke keer aanmaken van de MailMessage class zodat je daar wat performance winst boekt.
De meeste performance winst haal je natuurlijk uit wat giblet zegt over localhost.

grr sneller typz0ren :P

[ Voor 7% gewijzigd door MTWZZ op 13-12-2005 14:18 ]

Nu met Land Rover Series 3 en Defender 90


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Je kan ook het mailen in een background thread laten gebeuren; heb je er ook weinig last van :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Friedchicken
  • Registratie: Maart 2000
  • Laatst online: 20-06-2015
Ja in background laten draaien kan, maar ik wil iedere seconde zeg maar een value requesten.

En die value is dan die van Emailcounter, dus om uit te rekenen hoeveel procent gedaan is.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

Friedchicken schreef op dinsdag 13 december 2005 @ 15:02:
Ja in background laten draaien kan, maar ik wil iedere seconde zeg maar een value requesten.

En die value is dan die van Emailcounter, dus om uit te rekenen hoeveel procent gedaan is.
Dat kan gewoon, je kunt een MailSender class maken die jou verzendingen mailt in een apparte Thread en gewoon een public field of een propertie waard opvragen in een timer event ofzo op je main form.

  • Friedchicken
  • Registratie: Maart 2000
  • Laatst online: 20-06-2015
Het werken met Threads is voor mij iets nieuws, ergens een goede tut bij de hand ?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

C#:
1
2
3
4
5
6
7
8
9
10
public class Mailer
{
     private int _sendCount = 0;

     public void Send()
     {
          // TODO: code om te zenden
          _endCount++;
     }
}


Je roept nu gewoon de Send method aan in anderen Thread. Dit kun je doen met de Thread.Start method die een ThreadStart delegate accepteerd.

In C# kun je dit alsvolgt doen:

C#:
1
2
3
4
5
Mailer mailer = new Mailer();
Thread mailThread = new Thread( new ThreadStart(mailer.Send));
mailThread.Name = "MAILTHREAD";
mailThread.Priority = ThreadPriority.Lowest;
mailThread.Start();

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 12:42
Waarom verstuur je niet 1 email met iedereen in de BCC ?
Dan hoef je maar 1 emailtje te versturen.

Of zit ik er naast ?

The best thing about UDP jokes is that I don't care if you get them or not.


  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Remc0 schreef op woensdag 14 december 2005 @ 15:01:
Waarom verstuur je niet 1 email met iedereen in de BCC ?
Dan hoef je maar 1 emailtje te versturen.

Of zit ik er naast ?
Omdat je dan grote kans hebt dat de mail door spamfilters tegengehouden wordt en je kan de mail niet personalizen.

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
@Remc0:

Als je gepersonaliseerde email verstuurd is dat niet zo handig :)


Bij ons kantoor versturen we ook e-mail naar opt-inners. Dit is gepersonaliseerd en gaat met ongeveer 15 ontvangers per seconde de deur uit. Hou bij dit soort acties rekening met de volgende zaken:

- Het moet opt-in e-mail zijn, met een duidelijk manier in de e-mail om je af te melden;
- Plaatjes en attachments > 50 kb is not done. Niet iedereen heeft een dikke ADSL2+ lijn.
- Doe het niet te vaak;
- Vermijd animated gif images.

[ Voor 75% gewijzigd door Robbemans op 14-12-2005 15:12 ]


  • Friedchicken
  • Registratie: Maart 2000
  • Laatst online: 20-06-2015
Op dit moment gaat er een html mail uit met 10 mails per seconde.

Iedere mail wordt appart verzonden. Dus geen mensen in CC of BCC, zo hoeven de ontvangers niet te zien wie nog meer de mail ontvangt en kan de mail gepersonaliseerd worden met hun eigen persoonsgegevens.

  • Flapp
  • Registratie: December 2004
  • Laatst online: 02-01 20:16
Kan je dit niet gewoon heel simpel met php doen ?

"Stilte, een gat in het geluid...."


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Ik zou er een sleep ingooien, aangezien de nieuwsbrieven het netwerk nog wel eens half willen platgooien. Ongeveer een sleep van 1 seconde zou genoeg moeten zijn.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 Dim ontvangers As String

        connectie.Open()
        Dim queryOntvangers As String = "SELECT KlantEmail as ontvangers from Klanten WHERE KlantNBOntvangen='1'"
        Dim cmdOntvangers As SqlCommand = New SqlCommand(queryOntvangers, connectie)
        Dim dtrOntvangers As SqlDataReader = cmdOntvangers.ExecuteReader()

        Dim mail As MailMessage = New MailMessage

        'Gegevens die E-mail moet bevatten
        mail.From = "noreply@host.nl"
        mail.BodyFormat = MailFormat.Html
        SmtpMail.SmtpServer = "smtp.xs4all.nl"
        mail.Subject = "Multiple test"

        mail.Body = "<font face='Tahoma, Arial, Helvetica, sans-serif' size='2'>Komt dit netjes aan ?</font>"

        While dtrOntvangers.Read()
            ontvangers = dtrOntvangers.GetSqlString(0).Value

            mail.To = ontvangers
           
            'Daadwerkelijke commando versturen e-mail
            SmtpMail.Send(mail)

            'update the email counter
            EmailCounter += 1
            
            'Let the process sleep for about 1 second to not overload the system
            sleep(1000);
        End While

        dtrOntvangers.Close()
        connectie.Close()

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

Dat betekend dat je met 10.000 mails alleen als 2 uur en 42 minuten tijd besteed aan je sleep, lijkt mij een beetje overdreven.

Het beste is dan om de sleep variable te maken, ik zou eerder om de 10 mails even wachten of als de service die dit verzend ook een form heeft daar een control ingooien waarmee je de sleep kunt regelen. Natuurlijk is pauzeren ook een handige functie ;)
Pagina: 1