背景:
email地址存于mssql一用户信息表中,数量上万。
公司自有服务器,集smtp,pop3,www,ftp,mssql,dns等多种服务于一身。
jmail 有mailmerge对象,但是免费版不能用
要求:
用asp+jmail,利用公司smtp向所有用户发送email
思路:
直接读取数据库,多次循环发送,会对本来配置不高的服务器造成很大压力。
最好能对email分批发送,每批发送间隔一段时间,以此来缓解对服务器造成的压力。
实现:
对email分批
读出记录到recordset,利用常见的分页程序,将所有记录分页,每页作为一批,有多少页就分多少批
间隔延迟
在每页执行完毕后用<meta http-equiv="refresh" content="60;url=sendmail.asp?page="&page>来延迟跳转
减少执行时间:
在循环的过程中,循环添加收件人,而不要循环发送,即
for i=1 to rs.pagesize
msg.addrecipient rs("email")
rs.movenext
next
msg.send ("smtp.abc.com")
减小邮件大小
循环添加收件人,会造成一封email的收件人很多,这样一封email的就会很大。
所以,在以上代码的基础上改进一下,在循环内做个判断,当收件人email数量到达
20的时候就发送一次。即:
for i=1 to rs.pagesize
msg.addrecipient rs("email")
if i mod 20 = 0 then '每 20 个收信人作为一封email发送一次
msg.send ("smtp.abc.com")
msg.clearrecipients '清除已发送的收信人
end if
rs.movenext
next
msg.send ("smtp.abc.com") '发送余下的
页面
mail.asp 包含邮件主题、正文的表单,<form action="sendmail.asp" target="send">;一个iframe页面,<iframe name="send" src="sendmail.asp">
sendmail.asp 包含后台发送程序,循环,延迟跳转等。
缺点:
发送过程中不能离开该页面
发送的时间较长,与设置的每批发送数量、网络带宽、smtp服务器性能有关
改进:
可以在mail.asp中包含多个iframe页面,每个页面从不同的page开始发,相当于多线程发送,
对smtp服务器压力会增大,但能缩短发送时间。
可考虑在不同的page中采用不同的smtp服务器,例如包含多个iframe页面,在偶数页用
smtp.abc.com,在奇数页用smtp.123.com。这样既减轻服务器压力,也达到多线程发送
缩短发送时间的目的
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器