webForumDet fria alternativet

Jmail 100 i taget

ASPur ASP

29 svar · 2 380 visningar · startad av timedia

timediaMedlem sedan maj 2001420 inlägg
Frågan#1

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
%>
LR^evil.sids avatarLR^evil.sidMedlem sedan maj 2002560 inlägg
#2

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
#3

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.

LR^evil.sids avatarLR^evil.sidMedlem sedan maj 2002560 inlägg
#4

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
#5

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
#6

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
#7

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
#8

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
#9

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
#10

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
#11

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

%>
Jörgen HPMedlem sedan feb. 20012 412 inlägg
#12

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.

timediaMedlem sedan maj 2001420 inlägg
#13

Hur gör jag det då? :r

Jörgen HPMedlem sedan feb. 20012 412 inlägg
#14

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
kristofferMedlem sedan juni 20001 257 inlägg
#15

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
#16

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
#17

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
#18

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
#19

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
#20

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

148 ms totalt · 3 externa anrop · v20260731065814-full.58439ac5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
146 ms — hämta tråd, inlägg och bilagor (db)