Программирование на SQL | Отправка html письма через SQL Server

В этом разделе сайта попытаемся разобраться с программированием баз данных. Язык называется SQL. В этом языке нет или почти нет классов, переменных, массивов и циклов. Сравнивать его с языками высокого уровня не имеет смысла. Но без него Вы не сможете написать интерфейс для настольных приложений Windows или интернет сайтов. Для Разработчика надо обязательно надо знать SQL, библиотеки обработки данных на C#, Microsoft Visual Studio, Microsoft SQL Server Management Studio или dbForge Studio for SQL Server

Отправка html письма через SQL Server

Существующие методы отправки писем позволяют отправить письмо в виде текста или html. Гораздо приятнее получить сообщение в котором есть текст, оформленный в виде таблицы. Его читать удобнее, например, если пришел счет. С дугой стороны, отправка таких писем требует от вас знание html разметки и стилей письма. Без них создать такой сообщение достаточно сложно. Особое внимание обратите на тэги html: table,border,h2,tr,td,br Заранее изучите их назначение. Вот пример отправки письма на основе скрипта SQL Server.

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Конюков Виктор Федорович
-- Create date: 19.06.2018
-- Description:	Рассылка почты через SQL Server
/* 
	EXEC SSD_SendAutoEmailSite_SP 'SEND_EMAIL','12345','ivn','ivanov@test.ru','ivanov@test.ru','ivanov@test.ru', @infobar output;
*/
 
ALTER PROCEDURE [dbo].[SSD_SendAutoEmailSite_SP]
	@CommandID AS NVARCHAR(16)= 'SEND_EMAIL',	-- CREATE_INVOICE and SEND_INVOICE
	@num AS NVARCHAR(30),						-- Номер заказа
	@usr AS NVARCHAR(8),						-- Отправитель из 3 букв
	@EmailFrom AS NVARCHAR(256),				-- От кого отправляем
	@EmailTo AS NVARCHAR(256),					-- Кому отправляем
	@EmailCopy AS NVARCHAR(256),				-- Кому отправляем
	@infobar AS NVARCHAR(max) OUTPUT			-- Возврат сообщения выполнения команды
AS
BEGIN
	SET NOCOUNT ON;
	IF @CommandID = 'SEND_EMAIL' --OR @CommandID = 'ALL'
	BEGIN
		
		-- Отправляем почту 
			DECLARE @bodyall AS NVARCHAR(MAX), 
				@mailitem_id1 INT, 
				@BR AS NVARCHAR(32), 
				@date AS datetime, 
				@subject1 AS NVARCHAR(255)
				
		-- Рисуем таблицу в формате html	
			SET @BR = '<br>'
			SELECT @bodyall = 
			'<style>table, th, td { border: 1px solid black; border-collapse: collapse; } th, td {padding: 5px;}</style>' +
			'<h2>1. Файлы </h2>' + 
			'Ссылка на прикрепленный файл: ' + '<a href="' + z.OFFER_URL_DOC + '">'+ z.OFFER_URL_DOC + '</a>'   + 
			'<h2>2. Комментарий </h2>' +  
			z.OFFER_Comment +@BR +
			'<h2>3. Заказчик </h2>' + 
			'ФИО: ' + z.FIO + @BR +
			'Тел.: ' + z.TEL + @BR +
			'Эл.почта: ' + z.Mail + @BR
			, @date = z.OFFER_Data
			FROM [Offers] z WHERE z.Number = @num AND z.NumberLine=1;
		
			-- Создаем курсор для изделий
			DECLARE @item AS NVARCHAR(32), @Desc AS NVARCHAR(256), @Qty AS NVARCHAR(32)
			DECLARE item_cursor CURSOR FOR 
				SELECT  ISNULL(f.OFFER_Num_art,''),
						ISNULL(i.Description,'')
						--convert(nvarchar(25),f.OFFER_Data_end,104),
					AS all_item  
					FROM Offers f   
						INNER JOIN item i   
							ON i.item = f.OFFER_Num_art
								WHERE f.Number = @num ;
								
			-- Открываем курсор
			OPEN item_cursor
				FETCH NEXT FROM item_cursor INTO @item,@Desc,@Qty ;
				
			SET @bodyall = @bodyall + '<table>'
			-- Заголовки таблицы
			SET @bodyall = @bodyall + '<tr><th>Товар</th><th>Описание</th><th>Кол-во</th><th>Резерв</th><th>Срок отгрузки</th><th>Статус</th></tr>'
			WHILE @@FETCH_STATUS = 0
			BEGIN
				-- Данные таблицы
				SET @bodyall = @bodyall + '<tr>'
				SET @bodyall = @bodyall + '<td>' + @item + '</td>' ;
				SET @bodyall = @bodyall + '<td>' + @Desc + '</td>' ;
				SET @bodyall = @bodyall + '<td>' + @Qty + '</td>' ;
				SET @bodyall = @bodyall + '</tr>'
				-- Следующая запись
				FETCH NEXT FROM item_cursor INTO @item,@Desc,@Qty ;
			END 
			SET @bodyall = @bodyall + '</table>'
			CLOSE item_cursor ;
			DEALLOCATE item_cursor ;
		

			SET @subject1 = 'Выгружена заявка № [' + @num + '] от ' + CONVERT(nvarchar(10),@Date,104) ;

			-- Управление профилем
			DECLARE @UsEmail NVARCHAR(255),
					@UsAccount NVARCHAR(255),
					@UsProfile NVARCHAR(255)

			SET @UsEmail = @EmailFrom --'ivanov@test.ru'
			SET @UsAccount = 'Account. ' + @UsEmail
			SET @UsProfile = 'Profile. ' + @UsEmail

			IF NOT EXISTS( SELECT account_id from msdb.dbo.sysmail_account WHERE [NAME]=@UsAccount) 
			BEGIN
				-- 1. Создание аккаунта 
				EXECUTE msdb.dbo.sysmail_add_account_sp  
					@account_name = @UsAccount,  
					@description = 'Авторассылка счетов',  
					@email_address = @UsEmail,  
					@display_name = 'Компания. Авторассылка счетов',  
					@mailserver_name = '111.11.0.11',
					@port='25',
					@password='1',
					@enable_ssl=0,
					@username=@UsEmail ; 
				    
				EXECUTE msdb.dbo.sysmail_add_profile_sp  
					@profile_name = @UsProfile,  
					@description = 'Профиль пользователя для рассылки Email' ;
				 
				EXECUTE msdb.dbo.sysmail_add_profileaccount_sp  
					@profile_name = @UsProfile,
					@account_name = @UsAccount,  
					@sequence_number =1 ;  
				
				WAITFOR DELAY '00:00:03';
			END
			
			-- Отправляем почту
			IF (ISNULL(@num,0) <> 0) AND (@Date > CONVERT(DATETIME,'2019-01-01'))
			BEGIN
				EXEC msdb.dbo.sp_send_dbmail
					@profile_name = @UsProfile, -- 'Профиль. Рассылка счетов', 
					@recipients =  @EmailTo,
					@copy_recipients = '',
					@subject = @subject1,
					@body = @bodyall,
					@file_attachments=NULL, 
					@body_format = 'HTML',
					@mailitem_id = @mailitem_id1 OUTPUT ;
				
				SET @infobar = 'Заявка обработана № ' + @num  + ' от ' + CONVERT(nvarchar(10),@date,104) + ' успешно!'
			END

		END
END

 

Добавить комментарий

Loading