使用SQL Server作业计划程序的自动SMTP(不是MAPI)电子邮件

时间:2009-10-25 10:08:21

标签: sql sql-server sql-server-2000

在SQL Server 2000上工作。我希望向生日与当天生日匹配的所有客户发送生日祝福。我创建了一个数据库客户,其中包含一个名为CustomerDetails的表,其中包含以下字段

  1. ID

  2. 名称

  3. 出生日期

  4. 电子邮件

  5. 我编写了如下所示的SQL脚本。 SQL脚本循环遍历CustomerDetails表,并将出生日和出生月的所有记录与当前日期和月份进行匹配。如果两个匹配,则它会向特定客户发送一封电子邮件,其中包含存储在表格中的电子邮件地址。

    DECLARE 
    @out_desc VARCHAR(1000),
    @out_mesg VARCHAR(10)
    
    DECLARE @name VARCHAR(20),
    @birthdate datetime,
    @email NVARCHAR(50)
    
    DECLARE @body NVARCHAR(1000)
    
    DECLARE C1 CURSOR READ_ONLY
    FOR
    SELECT [name], [birthdate], [email]
    FROM Customers
    
    OPEN C1
    FETCH NEXT FROM C1 INTO 
    @name, @birthdate, @email
    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF DATEPART(DAY,@birthdate) = DATEPART(DAY,GETDATE())
        AND DATEPART(MONTH,@birthdate) = DATEPART(MONTH,GETDATE())
        BEGIN
            SET @body = '<b>Happy Birthday ' + @name + '</b><br />Many happy returns of the day'
            + '<br /><br />Customer Relationship Department'
            EXEC sp_send_mail 
            'shamim@sew.com', --- add your Email Address here
            'shamim007',       ----add your Password here
            @email,
            'Birthday Wishes', 
            @body,
            'htmlbody', @output_mesg = @out_mesg output, @output_desc = @out_desc output
    
            PRINT @out_mesg
            PRINT @out_desc
        END 
        FETCH NEXT FROM C1 INTO 
        @name, @birthdate, @email
    END
    CLOSE C1
    DEALLOCATE C1
    

    存储过程

    CREATE PROCEDURE [dbo].[sp_send_mail]
            @from varchar(500) ,
            @password varchar(500) ,
            @to varchar(500) ,      
            @subject varchar(500),
            @body varchar(4000) ,
            @bodytype varchar(10),
            @output_mesg varchar(10) output,
            @output_desc varchar(1000) output
    AS
    DECLARE @imsg int
    DECLARE @hr int
    DECLARE @source varchar(255)
    DECLARE @description varchar(500)
    
    EXEC @hr = sp_oacreate 'cdo.message', @imsg out
    
    --SendUsing Specifies Whether to send using port (2) or using pickup directory (1)
    EXEC @hr = sp_oasetproperty @imsg,
    'configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").value','2'
    
    --SMTP Server
    EXEC @hr = sp_oasetproperty @imsg, 
      'configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").value', 
      'smtp.mail.me.net' 
    
    --UserName
    EXEC @hr = sp_oasetproperty @imsg, 
      'configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").value', 
      @from 
    
    --Password
    EXEC @hr = sp_oasetproperty @imsg, 
      'configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").value', 
      @password 
    
    --UseSSL
    EXEC @hr = sp_oasetproperty @imsg, 
      'configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl").value', 
      'True' 
    
    --PORT 
    EXEC @hr = sp_oasetproperty @imsg, 
      'configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport").value', 
      '465' 
    
    --Requires Aunthentication None(0) / Basic(1)
    EXEC @hr = sp_oasetproperty @imsg, 
      'configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").value', 
      '1' 
    
    EXEC @hr = sp_oamethod @imsg, 'configuration.fields.update', null
    EXEC @hr = sp_oasetproperty @imsg, 'to', @to
    EXEC @hr = sp_oasetproperty @imsg, 'from', @from
    EXEC @hr = sp_oasetproperty @imsg, 'subject', @subject
    
    -- if you are using html e-mail, use 'htmlbody' instead of 'textbody'.
    
    EXEC @hr = sp_oasetproperty @imsg, @bodytype, @body
    EXEC @hr = sp_oamethod @imsg, 'send', null
    
    SET @output_mesg = 'Success'
    
    -- sample error handling.
    IF @hr <>0 
        SELECT @hr
        BEGIN
            EXEC @hr = sp_oageterrorinfo null, @source out, @description out
            IF @hr = 0
            BEGIN
                --set @output_desc = ' source: ' + @source
                set @output_desc =  @description
            END
        ELSE
        BEGIN
            SET @output_desc = ' sp_oageterrorinfo failed'
        END
        IF not @output_desc is NULL
                SET @output_mesg = 'Error'
    END
    EXEC @hr = sp_oadestroy @imsg
    GO
    

    为什么邮件不发送,问题是什么......如何解决。

1 个答案:

答案 0 :(得分:2)

在SQL Server 2000上如果我无法使用MAPI / xp_sendmail,我会使用xp_smtp_sendmail (IE only!)来使用SMTP而不是使用sp_OA%编写自己的。

您没有给我们任何错误消息或日志条目等,所以我只能尝试这个久经考验的扩展存储过程。