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
%>
<% 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
%>
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.
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>
..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
%>
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?
<% 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)
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.
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.
<% 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
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
%>