timediaMedlem sedan maj 2001420 inlägg Har ett fungerande script, men gissar att jag får problem med att skicka 1400 mail.
Finns det någon som kan bistå med att skriva om så den skickar 100 i taget? ...eller finns det något annat sätt att undvika timeout (som digikom accepterar)?
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("mindb.mdb"))
sql="SELECT * FROM list "
set rs=conn.execute(sql)
body = request.form("text")
subject = "Nyhetsbrev från mig"
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "smtp.digikom.net"
JMail.Sender = "t.m@moviemix.nu"
JMail.Subject = subject
JMail.AddRecipient "t.m@moviemix.nu"
JMail.LazySend = true;
Do Until rs.EOF
JMail.addrecipientbcc rs("Email")
rs.MoveNext
Loop
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.Execute
%>
så här kanske
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("mindb.mdb"))
sql = " SELECT * FROM list "
set rs = Server.CreateObject("ADODB.recordset")
rs.open sql, con, 1, 3
if rs.eof then
response.write "Det finns ingen i maillistan."
set rs = nothing
set con = nothing
else
rs.pageSize = 100
do while not rs.eof
for x = 1 to rs.pagesize
if rs.eof then
exit for
else
JMail.addrecipientbcc [b]= JMail.addrecipientbcc &[/b] rs("Email")
rs.movenext
end if
next
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.Execute
rs.absolutePage = rs.absolutePage + 1
loop
set rs = nothing
set con = nothing
end if
%>
har inte testat det...
[edit] fetade upp det som jag har ändrat
ElMacoMedlem sedan juni 2000161 inlägg Mailmerge with ResultSet
Det finns möjlighet att skicka e-post genom att ange recordsetet som inparameter snarare än att lägga alla i BCC. Du kanske har lite prestanda att vinna i detta.
http://www.dimac.se/websites/dimac/website/products/w3JMail/{C7EFB42E-5C6C-49D4-91B7-00C7E9388A96}?exId={C1B2EA51-4C4A-4E7D-B111-C6E3BBE31130}
Eller titta under w3 JMail Exempel.
/M.
Bara lite flum...
är inte bekant med jmail... bara flummade lite i en logisk lösning
direktlänk till ElMaco's exempel
timediaMedlem sedan maj 2001420 inlägg Hur kombinerar jag?
Tack för exemplen. Någon duktig :r som kan hjälpa mig kombinera koden med den längst upp på sidan?
MailMergeRS.asp
<% @LANGUAGE="VBSCRIPT" %>
<html>
<body>
<%
' First we will create a message object that will serve as a
' template for the merge.
' The merge fields are marked with %% in the front and in the
' end.
' Note how we use merge fields even in the addRecipient method
set msgTemplate = Server.CreateObject( "JMail.Message" )
msgTemplate.From = "me@myDomain.com"
msgTemplate.FromName = "Mailinglist info!"
msgTemplate.AddRecipient "%%EMail%%", "%%Name%%"
msgTemplate.Subject = "Hi %%Name%%"
msgTemplate.Body = "Hello %%Name%%, you are my favorite website visitor!"
' There, our message template is done. Next we create the mailmerge object.
set mMerge = Server.CreateObject( "JMail.MailMerge" )
' Now, tell mailMerge to use the template we created earlier
mMerge.MailTemplate = msgTemplate
' Before we start emailing thousands of recipients, we make testrun.
' The line below tells MailMerge to process only 10 recipients
' and to send the emails to "myEMail@company.com" instead.
' This way we can see if our template is as expected. When we
' are ready to go live, just remove the line below.
mMerge.SetDebugMode( "myEMail@company.com", 10 )
' Okay lets do the merge. As we do an ADO resultset merge, we do not need to
' specify each merge variable.
' The myRS is assumed to hold a ADO recordset.
' If we didn't have to many recipients, we wouldn't have to enque the emails,
' instead we would have to specify the mailserver like this
' MailMerge.BulkMerge( myRS, false, "mail.myDomain.com" )'
' However, we will now enque it and therefore sets the second parameter to
' true and instead of supplying the mailserver address, we specify where
' our MS pickup directory is (if you run windows 2000 this is optional).
' The BulkMerge() method automatically sends/enques our emails, so we
' do not need to use the send() method.
mMerge.BulkMerge myRS, true, "c:\inetpub\mailroot\pickup"
' Thats it! One template, a workload of emails.
%>
Mailmerge complete!
</body>
</html>
timediaMedlem sedan maj 2001420 inlägg En annan möjlighet vore kanske...?
..om man lägger till ett fält i db där skickad mail markeras med en etta. Då kan man väl fortsätta där man fick script.timeout? Någon som förstår vad jag menar och kan skriva koden rätt? Nu uppdateras inte fältet 'skickad'. Vad är fel?
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("min.mdb"))
sql="SELECT * FROM list "
set rs=conn.execute(sql)
body = request.form("text")
subject = "Nyhetsbrev från Moviemix"
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "smtp.digikom.net"
JMail.Sender = "t.m@moviemix.nu"
JMail.Subject = subject
JMail.AddRecipient "t.m@moviemix.nu"
Do Until rs.EOF
if not rs("skickad") = 1 then
JMail.addrecipientbcc rs("Email")
rs("skickad") = 1
rs.MoveNext
end if
Loop
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.Execute
%>
timediaMedlem sedan maj 2001420 inlägg jag funderar vidare
Har uppdaterad db med ett fält jag kallar skickad När ett mail har gått i väg vill jag ändra värdet 0 till 1. (så kan jag fortsätta där när utskicket av nyhetsbrevet avbryts)
Do Until rs.EOF
if not rs("skickad") = 1 then
JMail.addrecipientbcc rs("Email")
end if
rs.MoveNext
Loop
Vet att jag är tjatig nu, men hur får jag detta att fungera?
PatrikBMedlem sedan mars 20002 836 inlägg Denna tråd kanske kan vara ngt att kika igenom (den som söker skall finna :e ).
Hjälpte Jörgen HP med en sådan lösning för ett bra tag sedan
http://www.webforum.nu/showthread.php?s=&postid=334904#post334904
variabeln varEmails är en 2-dimensionell array som plockas ut med .GetRows()
mail-koden ska vara där det finns en kommentering om den
Vid ev. fler frågor ...... fråga :o
cya,
PatrikB
timediaMedlem sedan maj 2001420 inlägg Tack PatrikB, men...
...det är inte helt som förväntad :q
Nu ser det ut så här:
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("mindb.mdb"))
sql="SELECT * FROM list "
set rs=conn.execute(sql)
body = request.form("text")
subject = "Nyhetsbrev från Moviemix"
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "smtp.digikom.net"
JMail.Sender = "t.m@moviemix.nu"
JMail.Subject = subject
JMail.AddRecipient "t.m@moviemix.nu"
intSentLetters = 50 * intTimes
intTimes = intTimes + 1
If Not intSentLetters > UBound(varEmails,2) Then
For N = intSentLetters TO UBound(varEmails,2)
intCounter = intCounter + 1
Do Until rs.EOF
if not rs("skickad") = 1 then
JMail.addrecipientbcc rs("Email")
end if
rs.MoveNext
Loop
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.Execute
If intCounter = 49 Then Exit For
Next
strURL = "skicka.asp?times=" & intTimes
Response.Redirect strURL
Else
Response.Write "Alla mail har skickats."
End If
%>
Tyvärr får jag error:
Microsoft VBScript runtime error '800a000d'
Type mismatch: 'UBound'
/admin/send_ebrev.asp, line 16
Varför?...och så undrar jag hur jag får markerat ivägskickad mail till 1. (finns ett fält som heter skickad där standardvärdet är 0)
solbulleMedlem sedan mars 20015 287 inlägg timedia:
variabeln varEmails är en 2-dimensionell array som plockas ut med .GetRows()
Jag ser inte att du gör detta(?)
timediaMedlem sedan maj 2001420 inlägg Nu funkar det, men inte som det skall :q
Verkar som jag själv får en kopia av varje mail (50?) och vet inte riktigt hur många som gick i väg :x
Finns det inget sätt att optimera koden så att jag har bättre koll på hur många som har gått i väg??
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../min.mdb"))
sql="SELECT * FROM list "
set rs=conn.execute(sql)
varEmails = rs.Getrows()
intSentLetters = 50 * intTimes
intTimes = intTimes + 1
If Not intSentLetters > UBound(varEmails,2) Then
For N = intSentLetters TO UBound(varEmails,2)
intCounter = intCounter + 1
body = request.form("text")
subject = "Nyhetsbrev från Moviemix"
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "smtp.digikom.net"
JMail.Sender = "Moviemix"
JMail.Subject = subject
JMail.AddRecipient "t.m@moviemix.nu"
Do Until rs.EOF
JMail.addrecipientbcc rs("Email")
rs.MoveNext
Loop
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.Execute
If intCounter = 49 Then Exit For
Next
strURL = "skicka.asp?times=" & intTimes
Response.Redirect strURL
Else
Response.Write "Alla mail har skickats."
End If
%>
Det beror på att du inte använder array. Värdet är satt till 50 st åt gången men du avslyútar efter 49. Anledningen till att det stod 49 innan var att index böjar på 0 i en array och inte 1.
Typ, något sådant här:
OBS! Jag vet ej om ditt fält i tabellen heter strEmail.
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("mindb.mdb"))
sql="SELECT [b]strEmail[/b] FROM list "
set rs = conn.execute(sql)
[b]if not rs.eof then varEmails = rs.getrows()[/b]
intSentLetters = 50 * intTimes
intTimes = intTimes + 1
If Not intSentLetters > UBound(varEmails,2) Then
For N = intSentLetters TO UBound(varEmails,2)
[b] strEmail = varEmails(0,N)[/b]
intCounter = intCounter + 1
'## -- skicka mailet --
If intCounter = 49 Then Exit For
Next
strURL = "skicka.asp?times=" & intTimes
Response.Redirect strURL
Else
Response.Write "Alla mail har skickats."
End If
Alltså, nu vet jag inte om jag har missat något, för jag orkar inte läsa igenom exakt allt. Men, du skall använda det exemplet du postar i http://www.webforum.nu/showthread.php?s=&postid=419827#post419827 och du måste använda JMail Professional. Då kan du hur många mail som helst utan timeout eftersom du quear mailen.
PatrikBMedlem sedan mars 20002 836 inlägg för att det ska funka måste du väl ha tillgång till dina "mail-kataloger" ... såsom: Pickup, Queue etc mapparna
cya,
PatrikB
PS....återkommer med lite mer kod snart ...... DS
PatrikBMedlem sedan mars 20002 836 inlägg ngt sådant här:
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
intTimes = request.QueryString("times")
If intTimes = "" Then intTimes = 0
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../min.mdb"))
sql="SELECT [b]EmailField[/b] FROM list "
set rs=conn.execute(sql)
varEmails = rs.Getrows()
set rs = Nothing
Set conn = Nothing
'## -- hur många mail ska skickas i stöten --
intSentLetters = 50 * intTimes
intTimes = intTimes + 1
If Not intSentLetters > UBound(varEmails,2) Then
body = request.form("text")
subject = "Nyhetsbrev från Moviemix"
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "smtp.digikom.net"
JMail.Sender = "Moviemix"
JMail.Subject = subject
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
'## -- loopa igenom alla mailadresser som hämtats från db och sparats i arrayen --
For N = intSentLetters TO UBound(varEmails,2)
intCounter = intCounter + 1
JMail.AddRecipientBCC varEmail(0,N)
If intCounter = 49 Then Exit For
Next
JMail.Execute
strURL = "skicka.asp?times=" & intTimes
Response.Redirect strURL
Else
Response.Write "Alla mail har skickats."
End If
%>
denna är otestad.
Du behöver byta ut den fetmarkerade texten i sql-frågan så att det blir rätt fältnamn, dvs det fältnamnet som emailadresserna finns lagrade i
cya,
PatrikB
timediaMedlem sedan maj 2001420 inlägg Tack för hjälpen, men nåt är fortfarande lite tokigt :q
Jag kommer aldrig till sidan skicka.asp så jag vet inte om utskicket fungerar? (den stannar alltså på sidan send_ebrev.asp utan att ge något felmeddelande) Förslag till förbättringar?
send_ebrev.asp
<% Server.ScriptTimeout = 1600 %>
Du lyckades!!
<%
intTimes = request.QueryString("times")
If intTimes = "" Then intTimes = 0
Session.LCID = 1053
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../min.mdb"))
sql="SELECT email FROM list "
set rs=conn.execute(sql)
varEmail = rs.Getrows()
set rs = Nothing
Set conn = Nothing
'## -- hur många mail ska skickas i stöten --
intSentLetters = 50 * intTimes
intTimes = intTimes + 1
If Not intSentLetters > UBound(varEmail,2) Then
body = request.form("text")
subject = "Nyhetsbrev från Moviemix"
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "smtp.digikom.net"
JMail.Sender = "red@moviemix.nu"
JMail.Subject = subject
jmail.Body = Body
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
'## -- loopa igenom alla mailadresser som hämtats från db och sparats i arrayen --
For N = intSentLetters TO UBound(varEmail,2)
intCounter = intCounter + 1
JMail.AddRecipientBCC varEmail(0,N)
If intCounter = 49 Then Exit For
Next
JMail.Execute
strURL = "skicka.asp?times=" & intTimes
Response.Redirect strURL
Else
Response.Write "Alla mail har skickats."
End If
%>
timediaMedlem sedan maj 2001420 inlägg ingen som ser felet?
Scriptet fungerar nu, men skickar bara första 50. Är det ingen som ser var det är fel?
Följdfråga: Hur får jag fram id på sista vällyckade mail. Går det?
PatrikBMedlem sedan mars 20002 836 inlägg Varför det endast skickar 50 mail vet jag inte ... men, kan ju lätt anta att det är ngt som inte e som det ska i redirecten.
Blir lite svårt att felsöka "vad det kan vara" då man inte har möjlighet att köra "just ditt" script.
Ändra detta:
Response.Redirect strURL
till:
Response.Write "URL: " & strUrl
Response.AddHeader "REFRESH", "10;" & strUrl
så du ser att urlen ser rätt ut, dvs att du har en querystring med ett värde i
eller .... du kanske inte har fler än 50 mail :e ... och därför som det inte skickas fler
cya,
PatrikB