Files
sql-scripts/TPDT-268 - ACP in task sequence/dba_storedProcedures/aps_Send_Mail_with_template.sql
2024-03-07 16:52:14 +01:00

385 lines
14 KiB
Transact-SQL

IF EXISTS (SELECT * FROM sys.objects where object_id = OBJECT_ID(N'[dbo].[aps_Send_Mail_with_template]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[aps_Send_Mail_with_template]
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[aps_Send_Mail_with_template]
@in_job_type int = 1,
@in_param_sender varchar(8000)= null,
@in_param_sender_name varchar(8000) = null,
@in_param_recipient varchar(8000) = null,
@in_param_priority varchar(15) = null,
@in_param_subject varchar(8000) = null,
@in_param_message varchar(8000) = null,
@in_param_message_file varchar(8000) = null,
@in_param_attachments varchar(8000) = null,
@in_param_server varchar(255) = null,
@in_param_dbmail_profile_name varchar(255) = null,
@in_param_varchar_1 varchar (8000) = null,
@in_param_varchar_2 varchar (8000) = null,
@in_param_varchar_3 varchar (8000) = null
AS
/*===========================================================================
Procedure pour envoi d'un email
Parametres:
@in_param_sender = adresse email de l'expediteur (ex: "cm@bmc.ch") (--> version SQL 2000 only)
@in_param_sender_name (or NULL) = nom de l'expediteur (ex: "Christophe Marchand") (--> version SQL 2000 only)
@in_param_recipient = adresse email du destinataire (ex: "info@bmc.ch")
@in_param_priority (or NULL) = priorite (valeurs possibles: "LOW, NORMAL, HIGH")
@in_param_subject (or NULL) = sujet du message
@in_param_message (or NULL) = corps du message
@in_param_message_file (or NULL) = corps du message contenu dans un fichier
@in_param_attachments (or NULL) = pieces jointes (file1;file2;file3)
@in_param_server = nom du serveur par lequel doit transiter l'email (--> version SQL 2000 only)
@in_param_dbmail_profile_name = nom du profil de "Database Mail" a utiliser (--> version SQL 2005 only)
@in_job_type = 0 -> envoi d'email sans template
1/NULL -> envoi d'email pour echec de job
2 -> envoi d'email pour succes de job
3 -> envoi d'email pour warning de job
4 -> envoi d'email pour message de job
10 -> envoi d'email pour infos du processus en cours
@in_param_varchar_1 = contenu qui depend du template choisi ; nom du job SI job_type = 1 ou 2
@in_param_varchar_2 = contenu qui depend du template choisi ; liste(s) de diffusion SI job_type = 1 ou 2
@in_param_varchar_3 = contenu qui depend du template choisi ; ajout au corps du mail SI job_type = 1 ou 2
Creation: 06.03.12 / PDE
Modifications :
06.03.2012 / PDE : Creation
13.07.2012 / PDE : Utilisation de la table DBA_Mailing_list
03.12.2012 / PDE : modif liste emails de secours #pde01#
13.12.2012 / PDE : Remplacement des ; par des , dans les destinataires, sinon ca echoue dans SQL 20005 #pde03#
13.12.2012 / PDE : Debuggage de la modification precedente #pde04#
22.08.2013 / PDE : #TFS19397# Ajout adresse IP dans le message #pde05#
07.12.2013 / PDE : Mise en commentaire des TRY/CATCH, pour permettre l'appel depuis un trigger.
07.12.2013 / PDE : Ajout job_type = 10 (mouchard)
12.12.2013 / PDE : #TFS21035# Remise en place des TRY/CATCH, car sinon la SP echoue dans les environnements sans Arizona
31.03.2015 / DVE : suppression du email de PDE #dve01#
15.07.2015 / FLA : correction bug quand un @DML_Code est identique à une adresse mail contenue dans @recipients #fla01#
28.07.2015 / FLA : correction bug afin de pouvoir ajouter un _ devant l'adresse mail #fla02#
01.12.2015 / FLA : modification de l'adresse d'envoi par défaut en _hci_dba@hcisolutions.ch #fla03#
21.11.2016 / AFL : #TFS35792# Add cvSpecificCustomer 124 (coop)
17.03.2020 / FLA : Suppression version SQL 2000
09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM
16.03.2022 / FLA : Standardisation des mails
13.07.2023 / SPE : OCTPDBA-690: Replace xp_cmdshell in [dbo].[aps_Send_Mail_with_template] stored procedure
17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible
============================================================================*/
SET NOCOUNT ON
DECLARE @result_sp INT,
@errno INT,
@cpt_boucle INT,
@posPV_01 INT,
@posPV_02 INT,
@attachments VARCHAR(MAX),
@message_file VARCHAR(MAX),
@subject VARCHAR(MAX),
@message VARCHAR(MAX),
@recipients VARCHAR(MAX),
@recipients_temoin VARCHAR(MAX),
@DML_Recipients VARCHAR(MAX),
@EAD_email_address VARCHAR(MAX),
@cmd NVARCHAR(255),
@job_name VARCHAR(255),
@DML_Code VARCHAR(255),
@errmsg VARCHAR(255),
@dbmail_profile_name VARCHAR(255),
@priority VARCHAR(30),
@jobid UNIQUEIDENTIFIER
/* BUILD DETAILS OF THE EMAIL */
/* Get default mailbox profile name */
DECLARE @defaultprofilname varchar(100)
SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1
SET @in_param_dbmail_profile_name = @defaultprofilname
/* SET RECIPIENTS */
SELECT @recipients = isnull (@in_param_recipient, isnull (@in_param_varchar_2, ''))
IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Mailing_list]') AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1)
BEGIN
/* DECRYPTAGE DES DESTINATAIRES */
SET @recipients_temoin = ''
SET @cpt_boucle = 0
WHILE @recipients_temoin <> @recipients and @cpt_boucle < 10
BEGIN
/* COMPTEUR DE BOUCLE, POUR COURT-CIRCUITER LES BOUCLES INFINIES */
SET @cpt_boucle = @cpt_boucle + 1
/* TEMOIN DU CHAMP DESTINATAIRE, POUR CONTINUER A FAIRE DES REMPLACEMENTS TANT QU'AU MOINS UN REMPLACEMENT A ETE EFFECTUE */
SET @recipients_temoin = @recipients
/* BOUCLE SUR LA TABLE DE CORRESPONDANCE DES LISTES DE DIFFUSION */
DECLARE c_DML CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT DML_Code, isnull(DML_Recipients, '') + ';' /*#pde04#*/
FROM DBA_Mailing_list with (nolock)
OPEN c_DML
FETCH NEXT FROM c_DML
INTO @DML_Code, @DML_Recipients
WHILE @@fetch_status <> -1
BEGIN
IF @@fetch_status <> -2
BEGIN
/*#fla01# */
IF(CHARINDEX (@DML_Code,@recipients) <> 0)
IF(SUBSTRING (@recipients,CHARINDEX (@DML_Code,@recipients)+LEN(@DML_Code),1) <> '@')
SET @recipients = replace (@recipients, @DML_Code, @DML_Recipients)
SET @recipients = replace (@recipients, ',', ';') /*#pde04#*/
SET @recipients = replace (@recipients, ';;', ';')
SET @recipients = replace (@recipients, ' ', '')
END /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_DML
INTO @DML_Code, @DML_Recipients
END /* while @@fetch_status <> -1 */
CLOSE c_DML
DEALLOCATE c_DML
END /* @recipients_temoin <> @recipients and @@cpt_boucle < 10 */
END /* If exists (DBA_Mailing_list) */
/* EN CAS D'ABSENCE DE DESTINATAIRE, OU EN CAS D'ABSENCE DE CARACTERE @, ECRITURE D'ADRESSES EN DUR */
IF charindex ('@', @recipients) = 0
BEGIN
SET @recipients = 'Gal_SE_DBA@galenica.com' /*#pde01#, #dve01# #fla03#*/
END
IF @in_job_type in (1, 2, 3, 4)
BEGIN
/* EMAIL D'ECHEC/SUCCES DE JOB */
IF @in_param_varchar_1 is not null
SET @job_name = @in_param_varchar_1
ELSE
BEGIN
SET @cmd = 'set @guid = cast(' + isnull (substring(app_name(), 30, 34), '') + ' as uniqueidentifier)'
/* ATTENTION, CETTE LIGNE DE CODE PEUT GENERER UN WARNING QUAND ELLE N'EST PAS EXECUTEE PAR UN JOB */
/* ERREUR TYPIQUE DANS UN LANCEMENT AVEC SQL STUDIO : Incorrect syntax near 'Studio'. */
EXEC sp_executesql @cmd, N'@guid uniqueidentifier out', @guid = @jobid OUT
IF @jobid is not null
BEGIN
SELECT @job_name = name
FROM msdb..sysjobs
WHERE job_id = @jobid
END
ELSE
SET @job_name = 'job inconnu ou appel hors d''un job'
END
END
/* JOB FAILURE */
IF @in_job_type = 1
BEGIN
SELECT @priority = isnull (@in_param_priority, 'HIGH'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' has failed.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has failed.')
END
/* JOB SUCCESS */
ELSE IF @in_job_type = 2
BEGIN
SELECT @priority = isnull (@in_param_priority, 'LOW'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' successfull.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has succeeded.')
END
/* JOB WARNING */
ELSE IF @in_job_type = 3
BEGIN
SELECT @priority = isnull (@in_param_priority, 'HIGH'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' : warning.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has sent a warning.')
END
/* JOB MESSAGE */
ELSE IF @in_job_type = 4
BEGIN
SELECT @priority = isnull (@in_param_priority, 'LOW'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' : message.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + '.')
END
/* SPY MESSAGE */
ELSE IF @in_job_type = 10
BEGIN
SELECT @subject = isnull (@in_param_subject,'Spy message')
SELECT @message = 'This email is being sent by ' + char(10) + char(13) + 'the SPID ['
+ convert (varchar (10), isnull(p.session_id, 'NULL'))
+ '], ' + char(10) + char(13) + 'of the instance ['
+ @@SERVERNAME
+ '], ' + char(10) + char(13) + 'run by the program ['
+ ltrim(rtrim(isnull(p.program_name, 'NULL')))
+ '] ' + char(10) + char(13) + 'on the host ['
+ ltrim(rtrim(isnull(p.host_name, 'NULL')))
+ '] ' + char(10) + char(13) + 'as user ['
+ ltrim(rtrim(isnull(p.login_name, 'NULL')))
+ '] ' + char(10) + char(13) + 'on the database ['
+ ltrim(rtrim(isnull(db.name, 'NULL')))
+ '].'
from master.sys.dm_exec_sessions p with (nolock)
left join sysdatabases db with (nolock)
on db.dbid = p.database_id
where p.session_id = @@spid
END
ELSE /* UNKNOWN JOB TYPE */
BEGIN
SELECT @priority = isnull (@in_param_priority, 'NORMAL'),
@subject = isnull (@in_param_subject, 'Message'),
@message = isnull (@in_param_message, 'Message sent by [' + @@SERVERNAME + '].')
END
/* ADDITIONAL INFO FOR EMAIL MESSAGE */
IF ISNULL(@in_param_varchar_3, '') <> ''
BEGIN
SET @message = isnull (@message , '') + char(13) + char(13) + isnull (@in_param_varchar_3, '')
END
SET @message = isnull (@message, '') + '
/*------------------------- */
Destinataires de l''email :
' + replace (isnull (@recipients, ''), ';', ' ' + CHAR(13)) +
'
'
/* SEND EMAIL */
SELECT @recipients = isnull (@in_param_recipient, @recipients),
@priority = isnull (@in_param_priority, @priority),
@subject = isnull (@in_param_subject, @subject),
@message_file = isnull (@in_param_message_file, @message_file),
@attachments = isnull (@in_param_attachments, @attachments),
@dbmail_profile_name = isnull (@in_param_dbmail_profile_name, @dbmail_profile_name)
SET @recipients = REPLACE(@recipients, ',', ';') /*#pde04#*/
SET @recipients = REPLACE(@recipients, ' ', '') /*#pde04#*/
/* Nettoyage de liste d'emails */
BEGIN /*#pde04#*/
DECLARE @Email_address TABLE
(
Email_address_id int identity,
EAD_email_address varchar (1000)
)
SET @posPV_01 = 0
SET @posPV_02 = 0
WHILE @recipients is not null
AND @posPV_02 < LEN (@recipients)
BEGIN
SET @posPV_01 = @posPV_02
SET @posPV_02 = charindex (';',@recipients, @posPV_02+1)
IF @posPV_02 is null OR @posPV_02 = 0
SET @posPV_02 = LEN (@recipients)
INSERT INTO @Email_address
VALUES(substring(@recipients, @posPV_01+1, @posPV_02-@posPV_01))
END /*while*/
/* NETTOYAGE */
UPDATE @Email_address
SET EAD_email_address = replace (EAD_email_address, ';', '')
/* #fla02# */
DELETE @Email_address
WHERE EAD_email_address not like '[_a-z0-9]%[a-z0-9]@[a-z0-9]%[a-z0-9].[a-z09]%[a-z0-9]'
UPDATE @Email_address
SET EAD_email_address = EAD_email_address + ';'
/* CONSTRUCTION DE LA CHAINE DE CARACTERES AVEC LES ADRESSES EMAILS */
SET @recipients = ''
DECLARE c_EAD CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT EAD_email_address
FROM @Email_address
ORDER BY Email_address_id
OPEN c_EAD
FETCH NEXT FROM c_EAD
INTO @EAD_email_address
WHILE @@fetch_status <> -1
BEGIN
IF @@fetch_status <> -2
BEGIN
SET @recipients = @recipients + @EAD_email_address
END /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_EAD
INTO @EAD_email_address
END /* while @@fetch_status <> -1 */
CLOSE c_EAD
DEALLOCATE c_EAD
END
SET @message = isnull (@in_param_message, @message)
BEGIN TRY
EXEC @result_sp = aps_Send_Mail
@in_recipient = @recipients,
@in_priority = @priority,
@in_subject = @subject,
@in_message = @message,
@in_message_file = @message_file,
@in_attachments = @attachments,
@in_dbmail_profile_name = @dbmail_profile_name
END TRY
BEGIN CATCH
SET @result_sp = -1
END CATCH
/* ---- VERSION LA PLUS SIMPLE POUR L'ENVOI DE MAIL ---- */
IF @result_sp <> 0
BEGIN
SET @subject = @subject + ' - [' + @@SERVERNAME + ']'
EXEC @result_sp = msdb.dbo.sp_send_dbmail
@profile_name = @dbmail_profile_name,
@recipients = @recipients,
@subject = @subject,
@body = @message,
@importance = @priority,
@file_attachments = @attachments
END
IF @result_sp <> 0
BEGIN
SET @errno = 70003
SET @errmsg = '(APS) Error executing aps_Send_Mail in aps_Send_Mail_with_template.'
GOTO error_99
END
/*------------------------- Retour a la SP appelante ------------------------*/
RETURN(@@error)
/*-------------------------- Traitement des erreurs -------------------------*/
error_99:
RAISERROR (@errno, -1, -1, @errmsg);
RETURN(@errno)
GO