SMTP Email Setup for SQL Server Cluster Server | Database Journal

SMTP Email Setup for SQL Server Cluster Server

Feb 19, 2003
2 minute read


by Muthusamy Anantha Kumar

SQL Mail (MAPI) is not cluster
aware. However, Email/Pager messages are very important for Technology Administrators,
especially when a job fails or an alert is triggered. In a Non-Cluster environment,
it would be a straightforward process to set up SQLMail. To set mail up on an SQL
Server Cluster Server, we need a work-a-round.

Process:

You will need SMTPSEND.EXE. If you don’t have it, check with
your network admin, check the Windows
NT Resource Kit, or search the internet. Then, in any node of your clustered
server, copy this file to the Storage array usually E: or F: (depending on the
setup), by creating a folder \SMTP.

Get the SMTP relay IP address for sending SMTP email, from
your Network Administrator.

Create the Email Table for sending email to groups and
individuals. Open Query Analyser, and run the following command to create the
table and rows.

Table

use master
go
create table EmailGroups
(Groupname varchar(100),EmailID varchar(100))
insert into EmailGroups
(Groupname ,EmailId) values (“DBA
Group”,”mak_999@yahoo.com”)
insert into EmailGroups
(Groupname ,EmailId) values
(“mak_999@yahoo.com”,”mak_999@yahoo.com”)
insert into EmailGroups
(Groupname ,EmailId) values (“DBA
Group”,”you@yahoo.com”)
go

Remember to create one row for groups and another row with
same email Id for individual emails. On occasion, you may need to send email to
entire groups and other times to individual users.

Now, create the following procedure by changing the path (eg:
E:\SMTP) and by changing the SMTP relay IP address (eg: 171.21.81.51)

Procedure

use master
go
CREATE PROCEDURE USP_SENDMAIL @SENDER VARCHAR(100),
@RECEIVER VARCHAR(100),@SUBJECT VARCHAR(300),
@filename varchar(100) =AS
–CREATED BY :MAK
–CREATED DATE :JUNE 25,2002
–OBJECTIVE :CLUSTER SERVER SQL MAIL SETUP ISSUE.
–ALTERNATIVE NOTIFICATION PROCEDURE
–NOTES :CREATED A FOLDER E:\SMTP AND COPIED SMTPSEND.EXE UNDER.
SET QUOTED_IDENTIFIER OFF
DECLARE @QUERY VARCHAR(1000)
DECLARE @EMAILID VARCHAR(100)
DECLARE EMAIL CURSOR FORWARD_ONLY FOR SELECT EMAILID
FROM EMAILGROUPS WHERE replace(GROUPNAME,” “,””) = replace(@RECEIVER,” “,””)
OPEN EMAIL
–print @receiverSELECT EMAILID FROM EMAILGROUPS WHERE
–replace(GROUPNAME,” “,””) = replace(@RECEIVER,” “,””)
FETCH NEXT FROM EMAIL INTO @EMAILID
WHILE (@@FETCH_STATUS =0)
BEGIN
–print @emailid
if @filename =begin
SET @QUERY =EXEC MASTER..XP_CMDSHELL “E:\SMTP\SMTPSEND.EXE -t’
+LTRIM(RTRIM(@EMAILID))+-f’+@sender+-h171.21.81.51+-s’
+@SUBJECT++AT+CONVERT(VARCHAR,GETDATE())++'”‘
PRINT @QUERY
EXEC (@QUERY)
end
else
begin
SET @QUERY = ‘EXEC MASTER..XP_CMDSHELL “E:\SMTP\SMTPSEND.EXE -t’
+LTRIM(RTRIM(@EMAILID))+’ -f’+@sender+’ -a’ + @filename + ‘ -h171.21.81.51′
+’ -s’+@SUBJECT++’ AT ‘+CONVERT(VARCHAR,GETDATE())+”+'”‘
PRINT @QUERY
EXEC (@QUERY)
end
FETCH NEXT FROM EMAIL INTO @EMAILID
END
CLOSE EMAIL
DEALLOCATE EMAIL

TEST Email

Execute the following
commands to test the SMTP email that we have set up.

New statement
Backup database master to
disk = ‘g:\mssql2000\backup\master.bak’ with
init
If @@error = 0
Begin
exec master.dbo.USP_SENDMAIL @@servername,
“DBA Group”,”Backup: Master
database Succesful”,”c:\mytext,txt”
End
Else
Begin
exec master.dbo.USP_SENDMAIL @@servername,
“DBA Group”,”Backup: Master
database Failed”,”c:\mytext,txt”
End

Update jobs with
this email procedure

If you like all the SQL
Jobs to be updated with SMTP email notification , the following are examples on
‘How to update the Jobs and Alerts.’

Old statement

Backup database master to disk = ‘g:\mssql2000\backup\master.bak’ with init

New statement

Backup database master to disk = ‘g:\mssql2000\backup\master.bak’ with init
If @@error = 0
Begin
exec master.dbo.USP_SENDMAIL @@servername,”DBA Group”,
	“Backup: Master database Succesful”,”c:\mytext,txt”
End
Else
Begin
exec master.dbo.USP_SENDMAIL @@servername,”DBA Group”,
	“Backup: Master database Failed”,”c:\mytext,txt”
End

Note: @@Servername
returns the current servername. You can replace it with some logical text.

Alerts

For alerts, create a
job for every alert type. In the alert response tab [Double click on a particular
alert], check “Execute job,” and select the corresponding job that you have
created.

Eg: This will create a
job for the Alert MSDB FULL.

BEGIN TRANSACTION
  DECLARE @JobID BINARY(16)
  DECLARE @ReturnCode INT
  SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories
WHERE name = N’[Uncategorized (Local)]’) < 1
  EXECUTE msdb.dbo.sp_add_category @name = N’[Uncategorized (Local)]’
  — Delete the job with the same name (if it exists)
  SELECT @JobID = job_id
  FROM   msdb.dbo.sysjobs
  WHERE (name = N’MSDB FULL’)
  IF (@JobID IS NOT NULL)
  BEGINCheck if the job is a multi-server job
  IF (EXISTS (SELECT  *
              FROM    msdb.dbo.sysjobservers
              WHERE   (job_id = @JobID) AND (server_id <> 0)))
  BEGIN
    — There is, so abort the script
    RAISERROR (N’Unable to import job ”MSDB FULL” since there is
already a multi-server job with this name.’, 16, 1)
    GOTO QuitWithRollback
  END
  ELSEDelete the [local] job
    EXECUTE msdb.dbo.sp_delete_job @job_name = N’MSDB FULLSELECT @JobID = NULL
  END 
BEGINAdd the job
  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N’MSDB FULL’, @owner_login_name = N’amuthusamy’,
@description = N’No description available.’,
@category_name = N’[Uncategorized (Local)]’,
@enabled = 1, @notify_level_email = 0,
@notify_level_page = 0, @notify_level_netsend = 0,
@notify_level_eventlog = 2, @delete_level= 0
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  — Add the job steps
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
 @step_id = 1, @step_name = N’MSDB FULL’,
 @command = N’exec master.dbo.USP_SENDMAIL @@servername,
“DBA Group”,”Alert: MSDB FULL”,”c:\mytext,txt”‘,
@database_name = N’master’, @server = N”, @database_user_name = N”,
@subsystem = N’TSQL’, @cmdexec_success_code = 0, @flags = 0,
@retry_attempts = 0, @retry_interval = 1, @output_file_name = N”,
@on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0,
@on_fail_action = 2
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID,
@start_step_id = 1 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  — Add the Target Servers
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver
@job_id = @JobID, @server_name = N'(local)’
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
END
COMMIT TRANSACTION
GOTO   EndSave
QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

Conclusion:

Until Microsoft makes
MAPI cluster aware, the only choice we have is to use SMTP emails.

Database Journal Logo

DatabaseJournal.com publishes relevant, up-to-date and pragmatic articles on the use of database hardware and management tools and serves as a forum for professional knowledge about proprietary, open source and cloud-based databases--foundational technology for all IT systems. We publish insightful articles about new products, best practices and trends; readers help each other out on various database questions and problems. Database management systems (DBMS) and database security processes are also key areas of focus at DatabaseJournal.com.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.