[C#] Meerdere emails versturen door 1 verbinding

Pagina: 1
Acties:

  • G F0rce 1
  • Registratie: Juli 2003
  • Laatst online: 04-03-2015
Hoi tweakers,
Ik ben bezig met een programma in C# om een groot aantal mails te versturen naar klanten van het bedrijf waar ik werk ( circa 100 000 ) . Normaal gesproken verstuur je emails via de SmptMail class uit System.Web.Mail. Maar deze class maakt voor elke email een nieuwe verbinding met de SMTP server, iets wat ongeveer drie seconden in beslag neemt. Opzich geen probleem maar met deze aantallen emails die vertuurd dienen te worden duurt dat veel te lang.
De code die ik nu gebruik is als volgt.
C#:
1
2
3
4
MailMessage message = new MailMessage();
// Instellingen message component verwijderd, voegt nu even niks toe
SmtpMail.SmtpServer = "smtp.someserver.org"
SmtpMail.Send(message);

Simpel dus maar niet effectief. Ik vraag me af of het mogelijk is om op een fundamentelere ( en dus snellere ) manier emails te versturen. Ik heb ook al een poging gedaan met multithreading maar dit levert geen snelheidswinst op omdat mail communicaties allemaal lopen via een COM object die zelf een que maakt en dus alsnog de emails stuk voor stuk verstuurd.
Wat ik dus eigenlijk wil is zelf een verbinding maken met de server en door 1 verbinding alle emails vesturen en de verbinding vervolgens weer sluiten. Het lijkt me dat er op die manier een aanzienlijke snelheidswinst optreed, het enige probleem is dat ik geen idee heb hoe ik dat moet doen en de website http://systemwebmail.net helpt daar ook niet mee, misschien dat iemand hier een idee heeft..?

I feel absolutely clean inside, and there is nothing but pure euphoria. - Alexander Shulgin


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Heb je niets aan http://www.dotnet247.com/247reference/msgs/26/131287.aspx ; bijvoorbeeld alles zelf dumpen in de "pickup" folder?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:53

Creepy

Tactical Espionage Splatterer

Ik zou eerst eens gaan kijken waarom het zo absurd lang duurt om 1 mailtje te versturen. 3 seconden is echt heel lang. De tijd die nodig is om een verbinding te maken met een SMTP server is normaal gesproken velen maken korter.
Kan je bij de instellingen van de server waar je naar toe aan het zenden bent? Waarschijnlijk valt daar nog wat te optimaliseren (reverse DNS checks bijv.).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:35

TeeDee

CQB 241

Je zou de CDO kunnen implementen.

Iets in deze richting:

C#:
1
2
3
4
5
6
7
            CDO.Configuration mailerConfig = new CDO.ConfigurationClass();
            CDO.IMessage msg = new CDO.MessageClass();
              
            mailerConfig.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"].Value = 2;
            mailerConfig.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"].Value = "localhost";   
            mailerConfig.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"].Value = 25;
            mailerConfig.Fields.Update();


Vervolgens kan je het e.e.a. aan params pakken en middels een loop versturen:
C#:
1
2
3
4
5
6
7
8
9
            msg.AutoGenerateTextBody = true;
            msg.MimeFormatted = false;
            msg.CreateMHTMLBody(Url, CDO.CdoMHTMLFlags.cdoSuppressNone, "", "");
            msg.HTMLBody = UrlReplacer(msg.HTMLBody);
            msg.AutoGenerateTextBody=true;
            msg.Sender = FromAddress;
            msg.From = Name;
            msg.To = ToAddress;
            msg.Subject = Subject;

e.e.a. kom uit een tool van ons, maar ach, dat mag de pret niet drukken toch?
Voor zover ik houdt deze de connectie open.

Wat gorgi_19 ook al zegt :)
Je zou volgens mij ook nog kunnen proberen om correct geformateerde .eml files in de queue van je smtp server kunnen droppen.

Op die manier schrijf je eerst 100.000 mailtjes weg op het filesystem, en dan ros je die door de smtp heen. Is ook een optie.

[ Voor 4% gewijzigd door TeeDee op 05-10-2005 16:45 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • G F0rce 1
  • Registratie: Juli 2003
  • Laatst online: 04-03-2015
TeeDee schreef op woensdag 05 oktober 2005 @ 16:44:
Wat gorgi_19 ook al zegt :)
Je zou volgens mij ook nog kunnen proberen om correct geformateerde .eml files in de queue van je smtp server kunnen droppen.

Op die manier schrijf je eerst 100.000 mailtjes weg op het filesystem, en dan ros je die door de smtp heen. Is ook een optie.
Het gaat op dit moment om een remote server waarvan de instellingen wel goed zijn, relaying is op die server niet toegestaan dus misschien dat de controle daaop wat tijd in beslag neemt? Verder ga ik jou manier even proberen. Alvast bedankt :) .

I feel absolutely clean inside, and there is nothing but pure euphoria. - Alexander Shulgin


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 19-04 14:26

dotcode

///\00/\\

Je kan toch gewoon een worker threads aanmaken en paralel verzenden.

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
(jarig!)
offtopic:

Ik denk dat je zoiezo problemen gaat krijgen als je 100.000 mailtjes in 1x er uit gooit (op welke manier dan ook). je komt gegarandeerd op een spamlist te staan of de servers die je mailtjes moeten relayen bannen je.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:53

Creepy

Tactical Espionage Splatterer

4of9 schreef op woensdag 05 oktober 2005 @ 16:54:
offtopic:

Ik denk dat je zoiezo problemen gaat krijgen als je 100.000 mailtjes in 1x er uit gooit (op welke manier dan ook). je komt gegarandeerd op een spamlist te staan of de servers die je mailtjes moeten relayen bannen je.
Tenzij je zelf de verzendende mailserver beheert (en geen 100.000 mailtjes naar hetzelfde domein verstuurt uiteraard).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
(jarig!)
alleen die verzendende mailserver maakt ook weer gebruik van andere mailservers die vaak niet blij worden van dat soort hoeveelheden.

Ik heb in het verleden ook wel eens dit soort hoeveelheden mail moeten versturen voor mijn toenmalige baas en dat leverde ons aardig wat spamlist vermeldingen op.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:53

Creepy

Tactical Espionage Splatterer

Dat ligt dan puur aan de mail die je verstuurd. Wij verzenden hier regelmatig mailings en hebben nagenoeg geen problemen. Alle mails zijn dan uiteraard ook opt-in. En ge-automatiseerd op een spamlist terecht komen of geblockt worden gebeurt niet zo heel snel. Dan moet je dus echt erg veel mail in 1 keer naar dezelfde mailserver sturen, maar die kans dat dat gebeurt is redelijk klein.

De meeste spam meldingen komen van induviduelen die de e-mail gewoon niet willen hebben. Als je zorgt dat alles netjes opt-in is (zoals dat wettelijk hoort!) is er niks aan de hand.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 29-04 13:22

GrimaceODespair

eens een tettenman, altijd ...

TeeDee schreef op woensdag 05 oktober 2005 @ 16:44:
Je zou de CDO kunnen implementen.
Euhm... dan doe je hetzelfde: http://www.systemwebmail.com/faq/1.5.aspx

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • G F0rce 1
  • Registratie: Juli 2003
  • Laatst online: 04-03-2015
dotcode schreef op woensdag 05 oktober 2005 @ 16:52:
Je kan toch gewoon een worker threads aanmaken en paralel verzenden.
Wat ik al zei, meerdere threads helpt niet, je komt op het zelfde probleem en dat is dat de wrapper om de COM extensie een eigen message que maakt.
Wat ik nu aan het proberen ben is zelf een connectie leggen met de SMTP server en vervolgens binnen diezelfde connectie meerder berichten versturen. Ik worstel alleen nog een beetje met het SMTP protocol maar vanavond maar is een paar RFC's lezen dan moet dat ook wel opgelost zijn :) .

I feel absolutely clean inside, and there is nothing but pure euphoria. - Alexander Shulgin


Verwijderd

http://www.eggheadcafe.com/articles/20030316.asp/
Dit kan natuurlijk ook een oplossing zijn...

  • G F0rce 1
  • Registratie: Juli 2003
  • Laatst online: 04-03-2015
Yip dat is wat ik ga proberen, voor mensen die zich afvragen waarom ze niet te goede pagina zien, de link is http://www.eggheadcafe.com/articles/20030316.asp ( mind the last slash ;) )

I feel absolutely clean inside, and there is nothing but pure euphoria. - Alexander Shulgin


  • G F0rce 1
  • Registratie: Juli 2003
  • Laatst online: 04-03-2015
Een kickje van mij, ik ben inmiddels heel wat verder en heb een opzichzelfstaande SMTP class geschreven met behulp van een socket. Opzich gaat alles goed behalve dat het socket niet beschikbaar wordt voor nieuwe data na het versturen van het bericht.
Volgens de RFC van SMTP zou het DATA command worden afgesloten met een punt ( . ) . Dit doe ik maar vervolgens komt het socket niet meer vrij voor het volgende bericht.
Wanneer ik er twee wit regels achteraan plak krijg ik van de server een 500 Bad command terug, maar dan krijg ik in ieder geval wel wat terug en wordt het socket dus ook weer beschikbaar, alleen na ongeveer 5 Bad Commands verbreekt de server de verbinding, dus dit is niet de oplossing en eigenlijk zelfs niet eens een workaround... heeft iemand een idee wat ik fout doe?
C#:
1
2
3
4
    while (s.Available==0)
            {
                System.Threading.Thread.Sleep(5);           
            }

Maar het probleem is dus, dat wanneer ik geen fout commando naar de server stuur s ( de socket ) nooit beschikbaar wordt... vergeet ik misschien iets?

I feel absolutely clean inside, and there is nothing but pure euphoria. - Alexander Shulgin


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

3 seconden is inderdaad wel wat aan de lange kant, maar het volgende algo werkt goed, zeker in combinatie met een goed werkende caching NS :

a) sorteer alle mails op domeinnaam
b) zoek van alle unieke domeinnamen het MX record op
c) Koppel nu de ontvangers aan het MX record
d) Open per MX record 1 verbinding, en doe, aan de hand van de inhoud van de mail het volgende :

Alle mails hetzelfde :

1 Mail From: <>
X aantal Rcpt To: <>, totdat de MTA iets anders teruggeeft als 2xx
DATA
Nog niet alles verstuurd ? Dan nog een keer met dezelfde verbinding

Alle mails versturen met een aparte Mail From / Rcpt to.

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 13-04 20:00
G F0rce 1 schreef op zaterdag 08 oktober 2005 @ 15:29:
Volgens de RFC van SMTP zou het DATA command worden afgesloten met een punt ( . ) . Dit doe ik maar vervolgens komt het socket niet meer vrij voor het volgende bericht.
Stuur je de punt wel op een aparte regel?

Verders is het algoritme wat igmar geeft inderdaad de meest gebruikte en ook het efficientste.

zeroxcool.net - curity.eu

Pagina: 1