我用sp_OACreate调用jmail发邮件终于成功,可是但我要测试发邮件的速度,循环发10次后,后面几次就发送失败了,后面一直都发送不了,提示:The message was undeliverable. All servers failed to receive the message这是怎么回事,为什么多发送几次都不行?如果我用给数据库的所有用户发邮件怎么办?

解决方案 »

  1.   

    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.   

    我就是把发送邮件程序了存储过程,然后在外面循环调用了这个存储过程,就循环10次,就有发送不出去了,结果到现在都发不了了还有我看了你的几个帖子
    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' 这些名称呢?
      

  3.   

    一般是 工程名.类名你自己写个com组件试下就知道了。如何获得一个com组件的声明:
    对于一些常用的组件,通常网上,或者它自带的手册上都有。如何得到一个陌生组件的声明及接口,这个使用一些工具或者在一些ide中可以得到。
    当然也可以自己写方法实现,比如.net中的反射。说一下通常用哪些方式可以得到一个com组件的信息。
    在vs.net里,将dll文件加载到项目,这时就可以看到它的信息。
    或者在vc6里,#import它,再看.tlh文件,会得到它的ProgID. (也就是你上面说的 VBScript.RegExp之类的这样的字串)
      

  4.   

    我这方面的基础不好。。
    我自己用vs写了一个dll,想自己用sql server调用试试,可是dll连注册都注册不了,提示:没有找到DllRegisterServer输入点
    dll就是简单的一个类返回一个字符串的方法
      

  5.   

    你用vs.net写的应该是托管代码,我没有试过sql2k能否来调用,理论上应该是不可能直接调的。你可以用 vc6或vb6来写一个试试。