Avatar billede tblaster Nybegynder
17. juli 2003 - 09:53 Der er 41 kommentarer og
1 løsning

Mailsystem skal kunne sende mails til op til 2000 bruger

Hejsa

Jeg står og skal have lavet et lille mailsystem der gør at hver gang der postes en nyhed i et nyhedssystem så skal der sendes en mail til alle bruger i systemet. Hvordan gør jeg lige nemmest dette? Det skal jo ikke være sådan at jeg får en besked om at den tid hvor koden er tilladt at køre i er blevet overskredet.

Jeg køre med JMail. Og forstiller mig noget i stil med følgende hvor email adresserne hentes fra en database.

        Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "din.mail.server"
        JMail.Sender = "afsenders emailadresse"
        JMail.Subject = request("header")
        JMail.AddRecipient rs("email")
        JMail.Body = request("tekst")
        JMail.Priority = 3
        JMail.Execute
        set JMail = nothing

Hvis jeg nu tilføjede alle brugerne som cc recipient og ikke bare en normal recipient vil det så være muligt at koden kun sender en mail afsted så det ikke tager en evighed at afsende koden? Eller belaster det serveren for meget?

Jeg har snakket med min webudbyder, wannafind.dk, og de siger at det jeg skal gøre er at afsende 10 mails og så sætte koden til at vente i 1 sek for så at afsende de næste 10 mails ... men er dette en smartere måde og hvis, hvordan skal det så laves?

Jeg er såment ligeglad hvilken måde det laves på. Det skal bare laves med Jmail og asp og så skal det laves så koden udføres så hurtigt som muligt men samtidg udføres uden fejl om at scriptet overskrider den tilladte tid det er tilladt at køre et script på. Pt. skal systemet kun håndter at sende mails til 200 bruger men det skal være så systemet kan håndter at sende mails til godt 2000 bruger.
Avatar billede dk_akj Nybegynder
17. juli 2003 - 10:05 #1
Du kan hæve timeout.

Server.ScriptTimeout = 180

//akj
Avatar billede jonbdk Nybegynder
17. juli 2003 - 10:08 #2
Jeg synes jeg har oplevet, at specielt hotmail nogle gange afviser mailen hvis der er rigtig mange modtagere - Andre der har oplevet det problem?
Og ville det kunne løses ved at sende som BCC...
Undskylder jeg stiller et spm - men synes også det var lidt relevant for dig...
Jon
Avatar billede nazaq Nybegynder
17. juli 2003 - 10:10 #3
Hvis alle brugere skal have den samme mail, altså ikke noget med at skrive brugerens navn i mailen, så er det bedste at sende mailen til dig selv og så tilføje alle brugerene som BCC: ellers kan de se alle som modtager mailen. En anden god ide var nok at dele det op så du sender 10 mails i stedet for en, det ville jeg gøre, ved ikke hvorfor men det lyder fornuftigt :-)

/T
Avatar billede nazaq Nybegynder
17. juli 2003 - 10:10 #4
øv jon var hurtigst :-)
Avatar billede nielle Nybegynder
17. juli 2003 - 10:23 #5
Husk endeligt at tilføje alle modtagerne som BCC i stedet for CC.

Det er !!FY!! at sende et nyhedsbrev til en masse mennesker, som ikke kender hinanden, og hvori man kan se de andres adresser. Den slags vil med garanti give dit mange sure response-mails. Det er noget med "privatlivets fred" og desuden er det en spammers drøm at kunne høste en masse aktive adresser ved blot at tilmelde sig et nyhedsbrev.
Avatar billede tblaster Nybegynder
17. juli 2003 - 11:36 #6
jonbdk ... for mig gør det intet om hotmail ikke kan modtage de mail ... der bliver nemlig ikke sendt mails til hotmail ... det er alle kun professionelle mails med en mailserver og eget domaine!

Og så må jeg live undskylde ... det var også BCC jeg mente og ikke CC ... men det skal ikke skille os ad ... det jeg gerne skal have er noget kode jeg kan bruge til at udføre en sådan send mail med. Gerne så den kun sender til 10 ad gangen eller sådan noget. Jeg har en script time out på min server til 50 sek så koden kan ikke køre i en uendelighed.

Men hvis alle tilføjes som bcc sender koden så ikke kun en mail til mail serveren som så deler det hele op eller sender den alle 200 mails via koden?
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 13:21 #7
Jo, hvis du sender det som BCC, så sender du kun een mail.
Der du kan løbe ind i tidsproblemet (tim-out) i den forbindelse, er dit loop, hvori du læser fra DB og laver en add af bcc-receipient.

Men hvis din DB er hurtig nok, er dette ikke noget problem. Og så er det bare lige SMTP-serveren, der så skal på arbejde (med at sende alle de mails).

Men hey - der er jo stadig ikke noget til hinder for, at du laver een mail - med 50 BCC'er. Sender den.
Og så næste mail - med de næste 50.
osv.
Avatar billede jonbdk Nybegynder
17. juli 2003 - 13:24 #8
Undskyld spam, (ved godt det ikke interesserer dig tblaster) men er der andre der kender problemet med at nogle mails (specielt hotmail afviser hvis der er mange modtager, og er det problem løst ved at sende bcc?
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 13:25 #9
Nope jonbdk - har ikke stødt på det.
Men det bliver vel også løst idet man splitter mailen op i flere.
Avatar billede tblaster Nybegynder
17. juli 2003 - 13:36 #10
the bma man ... men hvordan får den til kun at sende mails til for eksempel kun 50 ad gangen?

Det jeg står med er noget lig dette:

<%

Set Conn = Server.CreateObject("ADODB.Connection")
conn.Open "DBQ="&(Server.MapPath(".")) &"mailing.mdb; DefaultDir=DBQ="&(Server.MapPath(".")) &"\;Driver={Microsoft Access Driver (*.mdb)};"
    SQL = "SELECT * from mailingliste"
    set send = conn.execute( SQL )
    do while not send.eof
        Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "din.mail.server"       
        JMail.Sender = "afsenders emailadresse"
        JMail.Subject = request("header")
        JMail.AddRecipient send("email")
        JMail.Body = request("tekst")
       
        JMail.Execute
        set JMail = nothing

%>
Avatar billede dk_akj Nybegynder
17. juli 2003 - 13:41 #11
Noget som dette måske
//akj

do while not send.eof
  i = i + 1
        Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "din.mail.server"       
        JMail.Sender = "afsenders emailadresse"
        JMail.Subject = request("header")
        JMail.AddRecipient send("email")
        JMail.Body = request("tekst")
 
if i >= 50 then     
        JMail.Execute
        i = 0
end if


loop

' sikrer at der sendes til alle
if i < 50 then
  JMail.Execute
end if

        set JMail = nothing
Avatar billede dk_akj Nybegynder
17. juli 2003 - 13:43 #12
Nok nærmere:

        Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "din.mail.server"       
        JMail.Sender = "afsenders emailadresse"
        JMail.Subject = request("header")
      JMail.Body = request("tekst")


do while not send.eof
  i = i + 1
        JMail.AddRecipient send("email")
 
if i >= 50 then     
        JMail.Execute
        i = 0
end if


loop

' sikrer at der sendes til alle
if i < 50 then
  JMail.Execute
end if
Avatar billede tblaster Nybegynder
17. juli 2003 - 13:55 #13
skal lige have lidt forklaring til disse 3:

i = i + 1
if i >= 50 then 
if i < 50 then

Jeg forstår ikke hvordan den kode udtager de første 50 og sender en mail til dem og så tager de næste 50 og sender en mail til dem ...
Avatar billede jonbdk Nybegynder
17. juli 2003 - 14:03 #14
den sender hver gang der er gennemgået halvtreds, og så sender den igen når alle er gennemgået medmindre at i er over 50 ( i hvilket tilfælde du jo HAR sendt)
Undskyld jeg blander mig
Avatar billede dk_akj Nybegynder
17. juli 2003 - 14:03 #15
do while not send.eof
  i = i + 1      ' tøl op på tæller
        JMail.AddRecipient send("email")  ' tilføj til listen
 
if i >= 50 then      ' er der tilføjet 50 ??
        JMail.Execute  ' ja - vi sender mails
        i = 0  ' nulstil tæller
end if


loop

' sikrer at der sendes til alle hvis der f.eks er tilføjet 28 adresser skal de jo også sendes
if i < 50 and i > 0 then
  JMail.Execute
end if

//akj
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 14:05 #16
Hmm, mener, at du skal lave en clear, og derefter genopbygge hele JMail-delen, når du har sendt.
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 14:08 #17
i = 0
do while not send.eof
  if i = 0 then
          Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "din.mail.server"       
        JMail.Sender = "afsenders emailadresse"
        JMail.Subject = request("header")
        JMail.Body = request("tekst")
  end if
  i = i + 1
  JMail.AddRecipient send("email")
 
  if i >= 50 then     
        JMail.Execute
        i = 0
  end if
loop
if i >0 then     
        JMail.Execute
end if
Avatar billede tblaster Nybegynder
17. juli 2003 - 14:57 #18
skal denne:
if i >= 50 then     
Ikke se således ud:
if i = 50 then     

For den skal vel sende dem når der er 50 mails tilføjet.

Hvad er det nu lige koden til BCC er ... mail adresserne skal jo ikke tilføjes som AddRecipient

Vil det ikke være muligt at tilføje et stykke kode så hver gang at mailen er sendt (JMail.Execute) så venter den lige et sek for så at loope.

the bma man ... nu har jeg ikke lige prøvet koderne endnu men vil din ikke bare køre i ring? For når den når ned til loop så starter den vel forfra og sætte i = 0 eller forstår jeg ikke din kode rigtigt?
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 15:23 #19
Nej det gør den ikke.
For i bliver sat=0 UDEN for loopet.
Og så igen inde i loopet - men KUN når der er sendt en mail.

Ang. i=50 eller i>=50.
Det er lige meget i dit tilfælde. Når i bliver 50 er
"i = 50" opfyldt, men det er "i>=50" jo også.
Det er bare en god vane, at når mad VED, det skal gøres, når i er 50 (eller derover) - så check for det, i stedet for check på i=50. (Der er lavet mange uendelige loops på den konto :-))
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 15:28 #20
BCC er
AddRecipientBCC i stedet for.
Avatar billede tblaster Nybegynder
17. juli 2003 - 15:48 #21
Nå ... jeg tror lige at jeg vil lave en prøve database og se om det er noget der virker det her ... hvis I kommer på noget jeg skal være opmærksom på eller noget jeg kan bruge så sig endelig til ...
Avatar billede tblaster Nybegynder
17. juli 2003 - 16:18 #22
Har sat følgende kode sammen med en database:

    Set Conn = Server.CreateObject("ADODB.Connection")
    Set Rs = Server.CreateObject("ADODB.Recordset")
    DBPath = "DBQ=" & server.mappath("mail.mdb")
    Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};Password=1234 ;" & DBPath
    SQL = "SELECT * from mailadresser"
    rs.Open SQL, Conn,1,3

   
i = 0
do while not rs.eof
  if i = 0 then
          Set JMail = Server.CreateObject("JMail.SMTPMail")
        JMail.ServerAddress = "backup-mx.wannafind.dk"       
        JMail.Sender = "Autosender@domæne.dk"
        JMail.AddRecipient "navn@domæne.dk"
        JMail.Subject = "Test af mailsystem"
        JMail.Body = "Sådan skal det bare gøres! Det virker jo"
  end if
  i = i + 1
  JMail.AddRecipientBCC rs("email")
 
  if i >= 50 then     
        JMail.Execute
        i = 0
  end if
loop
if i >0 then     
        JMail.Execute
end if

  rs.close

Hvis jeg køre koden så får jeg en Script timed out. Jeg ved at Script timed out er sat til 180 på min server så der skulle der ikke være nogen problemer. Hvad er der galt?

Min database er en testdatabase med 5 mail adresser i.
Avatar billede tblaster Nybegynder
17. juli 2003 - 16:47 #23
Nu kom der lige en mail igennem ... eller skal jeg sige 100 mails igennem til min mail box ... jeg kan se at den har tilføjet det jeg har stående på pladsen JMail.AddRecipient "navn@domæne.dk" 50 gange ... der står altså navn@domæne.dk 50 gange i min til ... det skal jo kun stå en gang ...

Hvad er der lige gået galt?
Avatar billede nielle Nybegynder
17. juli 2003 - 17:07 #24
Din loop løver simpelthen 50 gange uden at tælle rs frem til næset record.

...
  if i >= 50 then     
        JMail.Execute
        i = 0
  end if

  rs.MoveNext  ' <- Indsæte denne her
loop
Avatar billede tblaster Nybegynder
17. juli 2003 - 17:18 #25
Det hjalp

Tester videre på systemet ...

Damn hvor noget lort ... pga. den fejl så tror jeg sku at jeg får omkring en 50.000 mails eller sådan noget ... det er jo helt vandvigit!
Avatar billede soes Nybegynder
17. juli 2003 - 17:57 #26
hvis du kigger lidt paa www.duplo.se kan du finde et eksempel som maaske kan hjaelpe dig.

Copy/Paste
When sending massive amounts of emails, you will need to use the mail queue instead of sending them at once, or else your ASP will time out. This example shows how you use the nq method instead of the send() method. We only send a single email here, but you will get the picture.


  jmailnq.asp

<%@LANGUAGE="VBSCRIPT" %>
<%


' Example on how to use queueing

' The message is set up as usual...
set Message = Server.CreateObject( "JMail.Message" )

Message.From = "janeway@voyager.com"
Message.Subject = "Testing"
Message.Body = "This is a test mail"
Message.AddRecipient "commander@enterprise.com","Jean Luc"

' Instead of using the Send() method, we use nq
' The email will be placed in the mail queue and sent
' as soon as the mailservice picks it up.
' We do not need to specify a mailserver, as the
' mailservice does all that for us.

' What we do need to do is to specify where the MS pickup
' directory is. If you are running w3 JMail on a
' Windows 2000 server, this is not neccessary, otherwise

' Unless you are running windows 2000 on your webserver,
' you will need to specify where the MS pickup directory
' is (c:\inetpub\mailroot\pickup\).

Message.MSPickupDirectory = "c:\inetpub\mailroot\pickup\"
Message.nq
%>
<HTML>
<BODY>
Email enqued! </BODY>
</HTML>
Avatar billede jonbdk Nybegynder
17. juli 2003 - 18:11 #27
Kræver det ikke jmail i den professionelle udgave (der ikke er gratis) for at bruge queue funktionen
Avatar billede soes Nybegynder
17. juli 2003 - 18:13 #28
jo, det er rigtigt.
Avatar billede the_bma_man Nybegynder
17. juli 2003 - 19:16 #29
Samtidig antages der så ikke også, at man bruger MS mail som smtp?
Avatar billede tblaster Nybegynder
21. juli 2003 - 10:29 #30
For lige at prøve den nq så har jeg kontatket wannafind.dk for at høre om de har den professionelle udgave eller ej og det har de. De har installeret en Windows 2000 server. Derfor statte jeg følgende op:

<%@LANGUAGE="VBSCRIPT" %>
<%

set Message = Server.CreateObject( "JMail.Message" )

Message.From = "test@domæne.dk"
Message.Subject = "Testing"
Message.Body = "This is a test mail"
Message.AddRecipient "mail.domæne.dk"

Message.nq
%>
<HTML>
<BODY>
Email enqued! </BODY>
</HTML>

Dette giver mig følgende fejl:
Enque: Error, no pickupdirectory found.

Og sætter jeg MSPickupDirectory til følgdned:
Message.MSPickupDirectory = "c:\inetpub\mailroot\pickup\"
Så får jeg bare denne fejl:
Enque: File I/O error : Win32 Error. Code: 3. The system cannot find the path specified

Hvad er det der går galt? Hvad skal jeg evt. sætte min MSPickupDirectory til?
Avatar billede tblaster Nybegynder
21. juli 2003 - 11:00 #31
Har lige haft fat i wannafind igen og er belvet klar over at denne løsning desvære ikke kan bruges da de jo køre webserver samt mailserver. Og overstående løsning virker kun hvis mailserveren og webseren køre på samme computer.

Altså er vi tilbage til den gamle løsning. Lad os arbejde videre med den.
Avatar billede tblaster Nybegynder
21. juli 2003 - 11:13 #32
Jeg har prøvet at ændre følgende:
JMail.AddRecipient "navn@domæne.dk"
Til dette:
JMail.AddRecipient "Besked til alle"

Men får derved dennef fejl når jeg køre koden igenne:
Error: 501 The following recipients could not be sent to: Besked til all; 501 Bad address syntax

Den sender fint nok beskeden til de første 6 i min test database men stopper så og giver mig overstående fejl.

Jeg vil gerne have så at jeg kan sætte JMail.AddRecipient til en tekst og ikke til en adresse.
Avatar billede tblaster Nybegynder
21. juli 2003 - 12:58 #33
Den sender ikke kun til de første 6 kan jeg se ... havde bare ikke fået de sidste mails. Den sender til de første 10 og det passer med at jeg har sat den ned til følgende:

if i >= 10 then

Den sender altså kun en mail og så melder den fejlen uden at gå videre til de næste :-(

Skal jeg virkelig skrive en mail adresse i JMail.AddRecipient eller kan jeg gøre noget andet?
Avatar billede tblaster Nybegynder
21. juli 2003 - 13:12 #34
Jeg har prøvet med dette:

JMail.AddRecipientEx "", "Besked til all"

Men det giver bare:
The message was undeliverable. All servers failed to receive the message

Den virker naturligvis hvis jeg bruger:
JMail.AddRecipientEx "et_eller_ander@domæne.dk", "Besked til all"

Men jeg vil gerne have at den ikke skriver en til adresse ...
Avatar billede nielle Nybegynder
21. juli 2003 - 13:43 #35
Det kan du ikke. AddRecipient og AddRecipientEx kræver en email adresse.

Hvorfor ønsker du egentlig at gøre det? Det lyder mere som om at det er en "subject" du er ved at ville lave...
Avatar billede tblaster Nybegynder
21. juli 2003 - 13:46 #36
Nope det er ikke et subject

Men når jeg sende en mail til for eksempel 1000 bruger så vil jeg heller have at der står følgende:
Til: Alle Brugere I databasen
End:
Til: alle@domæne.dk

Den øverste løsning ser jo lidt bedre ud end den nederste!
Avatar billede dk_akj Nybegynder
21. juli 2003 - 13:58 #37
Hvordan skal mailserveren finde ud af hvem "Alle Brugere I databasen" er ??

//akj
Avatar billede the_bma_man Nybegynder
21. juli 2003 - 13:58 #38
Du kan jo lave det som "Alle brugere i databasen" <alle@dit-domæne.dk>

Det vil virke - og det viser samtidig, at du sender til en "mailingliste", som du styrer.
Avatar billede nielle Nybegynder
21. juli 2003 - 14:00 #39
tblaster -> Så bruger du AddRecipient til at adde mail-adressen "alle@domæne.dk" og AddRecipientBCC til at adde alle der andre email adresser.
Avatar billede nielle Nybegynder
21. juli 2003 - 14:01 #40
JMail.AddRecipientEx "alle@domæne.dk", "Besked til all"

- er desværre det bedste du kan få.
Avatar billede jonbdk Nybegynder
21. juli 2003 - 23:25 #41
Jeg er enig i, at du skal have en adresse på, men indeholder jmail ikke funktionen: JMail.SenderName = "Besked til alle"
Standard programmer viser navnet og ikke adressen, men den kan man så slå op
Avatar billede tblaster Nybegynder
28. juli 2003 - 15:38 #42
Mange tak for hjælpen ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester