我用sp_OACreate调用jmail发邮件终于成功,可是但我要测试发邮件的速度,循环发10次后,后面几次就发送失败了,后面一直都发送不了,提示:The message was undeliverable. All servers failed to receive the message这是怎么回事,为什么多发送几次都不行?如果我用给数据库的所有用户发邮件怎么办?
1,出错可能因为你在极短时间内向同一个地址发了n次邮件,被服务器拒绝了或者其它问题。 2,给数据库的所有用户,我不太清楚你这“所有用户”指的是什么. 我估且认为你是指你的用户表里的用户。 设 tb(uid int identity(1,1),uname varchar(20),mailaccount varchar(200)) ..那么在下午我给你的那段语句中加入循环处理就可以了。declare @cnt int,@i int,@toMail varchar(200) select @cnt=count(*),@i=0 from tbexec @error = sp_oacreate 'jmail.message',@jmailobj out ...--从表中循环取得发送地址,使用jmail的addrecipient方法将其加入联系人中. 循环的过程你也可以用游标或临时表。下面的count法效率差了,我只是示意写一下。 while @i<=@cnt begin select @mailaccount=mailaccount,@i=@i+1 from tb where @i=(select count(*) from tb where id<=a.id) exec @error=sp_oamethod @jmailobj,'addrecipient',null,@mailaccount end ... exec .... 'send',null,'smtp.xx.com' .....'destory'...这样,创建一次jmail对象,将多个用户加入到发送列表中,再完成发送, 当然,如果用户量过多,根具服务器设置,一次可能无法同时发送超过n个,这样,就得改一下结构,循环在外部,在循环体内创建jmail对象,每发送一个用户都重建对象。同样,你也可以将发送的那步操作存为存储过程,循环来调用。如果你了解你的邮件服务器一次可以同时发送到人的个数,那么可以写成双重循环减少对象创建次数。
2,给数据库的所有用户,我不太清楚你这“所有用户”指的是什么.
我估且认为你是指你的用户表里的用户。
设
tb(uid int identity(1,1),uname varchar(20),mailaccount varchar(200))
..那么在下午我给你的那段语句中加入循环处理就可以了。declare @cnt int,@i int,@toMail varchar(200)
select @cnt=count(*),@i=0 from tbexec @error = sp_oacreate 'jmail.message',@jmailobj out
...--从表中循环取得发送地址,使用jmail的addrecipient方法将其加入联系人中. 循环的过程你也可以用游标或临时表。下面的count法效率差了,我只是示意写一下。
while @i<=@cnt
begin
select @mailaccount=mailaccount,@i=@i+1 from tb where @i=(select count(*) from tb where id<=a.id)
exec @error=sp_oamethod @jmailobj,'addrecipient',null,@mailaccount
end
...
exec .... 'send',null,'smtp.xx.com'
.....'destory'...这样,创建一次jmail对象,将多个用户加入到发送列表中,再完成发送,
当然,如果用户量过多,根具服务器设置,一次可能无法同时发送超过n个,这样,就得改一下结构,循环在外部,在循环体内创建jmail对象,每发送一个用户都重建对象。同样,你也可以将发送的那步操作存为存储过程,循环来调用。如果你了解你的邮件服务器一次可以同时发送到人的个数,那么可以写成双重循环减少对象创建次数。
EXEC @err = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
EXEC @err=sp_OACreate 'Scripting.FileSystemObject',@fso OUTPUT
exec @error=sp_oacreate 'jmail.message',@jmailObj out 这样创建对象,我怎样才知道是'VBScript.RegExp'、'Scripting.FileSystemObject' 这些名称呢?
对于一些常用的组件,通常网上,或者它自带的手册上都有。如何得到一个陌生组件的声明及接口,这个使用一些工具或者在一些ide中可以得到。
当然也可以自己写方法实现,比如.net中的反射。说一下通常用哪些方式可以得到一个com组件的信息。
在vs.net里,将dll文件加载到项目,这时就可以看到它的信息。
或者在vc6里,#import它,再看.tlh文件,会得到它的ProgID. (也就是你上面说的 VBScript.RegExp之类的这样的字串)
我自己用vs写了一个dll,想自己用sql server调用试试,可是dll连注册都注册不了,提示:没有找到DllRegisterServer输入点
dll就是简单的一个类返回一个字符串的方法