2009-10-25 16 views
1

在SQL Server 2000.i上工作要將生日祝福發送給所有生日匹配當天的客戶。我創建了一個數據庫客戶使用名爲CustomerDetails的表以下字段使用SQL Server Job Scheduler的自動化SMTP(不是MAPI)電子郵件

  1. ID

  2. 名稱

  3. 出生日期

  4. 電子郵件地址

我寫了如下所示的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 
     '[email protected]', --- 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 

爲什麼郵件無法發送,有什麼問題......如何解決它。

回答

2

在SQL Server 2000上,如果我不能使用MAPI/xp_sendmail,我會使用xp_smtp_sendmail (IE only!)來使用SMTP,而不是使用sp_OA%寫我自己的。

你沒有給我們任何錯誤信息或日誌條目等,所以我只能說你嘗試了這個久經考驗的擴展存儲過程。