背景:
Email地址存于MSSql一用戶(hù)信息表中,數(shù)量上萬(wàn)。
公司自有服務(wù)器,集SMTP,POP3,WWW,FTP,MSSql,DNS等多種服務(wù)于一身。
jmail 有MailMerge對(duì)象,但是免費(fèi)版不能用
要求:
用asp+JMAIL,利用公司SMTP向所有用戶(hù)發(fā)送EMAIL
思路:
直接讀取數(shù)據(jù)庫(kù),多次循環(huán)發(fā)送,會(huì)對(duì)本來(lái)配置不高的服務(wù)器造成很大壓力。
最好能對(duì)EMAIL分批發(fā)送,每批發(fā)送間隔一段時(shí)間,以此來(lái)緩解對(duì)服務(wù)器造成的壓力。
實(shí)現(xiàn):
對(duì)EMAIL分批讀出記錄到recordset,利用常見(jiàn)的分頁(yè)程序,將所有記錄分頁(yè),每頁(yè)作為一批,有多少頁(yè)就分多少批間隔延遲在每頁(yè)執(zhí)行完畢后用<meta http-equiv="refresh" content="60;URL=SendMail.asp?page="&page>來(lái)延遲跳轉(zhuǎn)減少執(zhí)行時(shí)間:
在循環(huán)的過(guò)程中,循環(huán)添加收件人,而不要循環(huán)發(fā)送,即
for i=1 to rs.pagesize
msg.AddRecipient rs("Email")
rs.movenext
next
msg.Send ("smtp.abc.com")
減小郵件大小循環(huán)添加收件人,會(huì)造成一封Email的收件人很多,這樣一封Email的就會(huì)很大。
所以,在以上代碼的基礎(chǔ)上改進(jìn)一下,在循環(huán)內(nèi)做個(gè)判斷,當(dāng)收件人Email數(shù)量到達(dá)20的時(shí)候就發(fā)送一次。即:
for i=1 to rs.pagesize
msg.AddRecipient rs("Email")
if i mod 20 = 0 then '每 20 個(gè)收信人作為一封Email發(fā)送一次
msg.Send ("smtp.abc.com")
msg.ClearRecipients '清除已發(fā)送的收信人
end if
rs.movenext
next
msg.Send ("smtp.abc.com") '發(fā)送余下的
頁(yè)面
Mail.asp 包含郵件主題、正文的表單,<form action="SendMail.asp" target="Send">;一個(gè)iframe頁(yè)面,<iframe name="Send" src="SendMail.asp">
SendMail.asp 包含后臺(tái)發(fā)送程序,循環(huán),延遲跳轉(zhuǎn)等。
缺點(diǎn):
發(fā)送過(guò)程中不能離開(kāi)該頁(yè)面發(fā)送的時(shí)間較長(zhǎng),與設(shè)置的每批發(fā)送數(shù)量、網(wǎng)絡(luò)帶寬、SMTP服務(wù)器性能有關(guān)
改進(jìn):
可以在Mail.asp中包含多個(gè)iframe頁(yè)面,每個(gè)頁(yè)面從不同的page開(kāi)始發(fā),相當(dāng)于多線程發(fā)送,對(duì)smtp服務(wù)器壓力會(huì)增大,但能縮短發(fā)送時(shí)間。
可考慮在不同的page中采用不同的smtp服務(wù)器,例如包含多個(gè)iframe頁(yè)面,在偶數(shù)頁(yè)用smtp.abc.com,在奇數(shù)頁(yè)用smtp.123.com。這樣既減輕服務(wù)器壓力,也達(dá)到多線程發(fā)送縮短發(fā)送時(shí)間的目的。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注