Как сделать механизм отправки различных писем по шаблону с возможностью редактирования перед отправкой

В системе часто возникает отправки типовых писем различных контрагентам, например, согласование договора, отправка акта по этапу и т.д.

При этом желательно иметь возможность подцепить сразу нужные файлы, а также отредактировать текст письма, сформированного по шаблону. 

Так выглядит базовая форма отправки сообщения: 

Одна и та же форма используется из разных мест для отправки писем с различной целью и шаблоном. 

На входе мы имеем шаблон письма и идентификатор (кнопка вызова модальной формы): 

<a href="#" class="as-form-modal" 
data-code="sendEmail" 
data-itemid="sendds_3806" 
data-btntext="Отправить ДС" 
data-big="1" data-title="Отправить ДС клиенту">Отправить ДС клиенту</a>

В данном случае мы планируем отправить письмо с ДС контрагенту с ID=3806. 

У формы sendEmail следующие поля: body, subject, to, cc, attach. 

Разметка формы:

{form-title}
<div class="row">
  <div class="col-12 col-md-6">
    {collabel-to}
    {colcontrol-to}    
    {colexample-to}
  </div>
  <div class="col-12 col-md-6">
    {collabel-cc}
    {colcontrol-cc}
    {colexample-cc}
  </div>
</div>
<div class="row">
  <div class="col-12">{colcontrol-subject}</div>
  <div class="col-12">
    
    {collabel-attach}
    {colcontrol-attach}
  </div>
  <div class="col-12">
    {colexample-body}
    {colcontrol-body}
  </div>
</div>

GetItem:

CREATE PROCEDURE [dbo].[fm_sendEmail_getItem]
    @itemID nvarchar(128),	
	@username nvarchar(256)

AS
BEGIN
	declare @emailTemplate nvarchar(128) = dbo.str_splitPart(@itemID, '_', 1)
    declare @elementID nvarchar(128)  = dbo.str_splitPart(@itemID, '_', 2)
    
    declare @parameters ExtendedDictionaryParameter 
    insert into @parameters([Key], Value2)
    select 'itemid', @elementID
    union
    select 'templateCode', @emailTemplate
    
    declare @t1 table ([to] nvarchar(128), cc  nvarchar(128), 
                       subject nvarchar(256), body  nvarchar(max), title nvarchar(128), attach nvarchar(max))
	insert into @t1
    exec mailing_getEmail 
    	@parameters = @parameters,
        @username = @username
    
    select [to], cc, subject, body, 
    	(select email from as_users where username=@username) example_to,
        'post@mail.ru' example_cc,
        '' example_body, 
        attach
    from @t1    
    
    select title Title
  	from @t1
END

Здесь мы обращаемся к кастомной процедуру mailing_getEmail, где получаем шаблон и заполняем реальными данными по пришедшему itemID. 

Также здесь мы можем заложить вставку подсказок в сс и to, email текущего менеджера.

SaveItem: 

CREATE PROCEDURE [dbo].[fm_sendEmail_saveItem]
   @username nvarchar(256), 
   @itemID nvarchar(128),
   @parameters ExtendedDictionaryParameter READONLY	  
AS
BEGIN	
	declare @pbody nvarchar(max)
	select @pbody = Value2 from @parameters where [key]='body'
	declare @psubject nvarchar(max)
	select @psubject = Value2 from @parameters where [key]='subject'
	declare @pto nvarchar(max)
	select @pto = Value2 from @parameters where [key]='to'
	declare @pcc nvarchar(max)
	select @pcc = Value2 from @parameters where [key]='cc'
    declare @pattach nvarchar(max)
	select @pattach = Value2 from @parameters where [key]='attach'
    
    declare @emailTemplate nvarchar(128) = dbo.str_splitPart(@itemID, '_', 1)
    declare @elementID nvarchar(128)  = dbo.str_splitPart(@itemID, '_', 2)
    
    declare @templateID int = (select id from as_mailing_templates where lower(code)= lower(@emailTemplate))
    if(@templateID is not null) begin 
    	INSERT INTO [dbo].[as_mailing_log] ([templateID],[created],[createdBy],[to],[cc],[bcc],[body],[subject])
		VALUES (@templateID, getdate(), @username, @pto, @pcc, '', @pbody + isnull('attach: '+ @pattach, ''), @psubject)
    end

	-- SELECT 1 (Result, Msg, SuccessUrl, HideFormAfterSubmit, RefreshContainer)
	select 1 Result, 'Отправлено' Msg, '' SuccessUrl, 0 HideFormAfterSubmit, '' RefreshContainer

	-- SELECT 2
	select 'email' type,
    	   @pto [to],
           @pcc [cc],
           @psubject subject,
           @pbody body, 
           @pattach attach

END

Отправляем email и записываем в лог факт отправки. 

Как выглядит процедура mailing_getEmail: 

CREATE OR ALTER PROCEDURE [dbo].[mailing_getEmail]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(256)
as
begin
	declare @t1 table ([to] nvarchar(128), cc  nvarchar(128), 
		subject nvarchar(256), body  nvarchar(max), 
		title  nvarchar(128), attach nvarchar(max))
	
	declare @templateCode nvarchar(max) = (select Value2 from @parameters where lower([Key]) = 'templatecode')
	declare @itemID int = (select try_cast(Value2 as int) from @parameters where lower([Key]) = 'itemid')

	declare @subject nvarchar(256), @body nvarchar(max), @to nvarchar(128)

	select @subject = subject, @body=body from as_mailing_templates where lower(code) = lower(@templateCode)
	declare @attach nvarchar(max) = ''   	
	
	declare @num nvarchar(128), @project nvarchar(128)
		
	if (lower(@templateCode)='sendds') begin	
		declare @dsID int = @itemID
		select @num = num, 
			@to = ctr.email, 
			@project = (select top 1 name from projects where id = doc.projectID),
			@attach = link
		from docs doc 
		inner join contragents ctr on ctr.id = doc.contragentID 
		where doc.id = @dsID

		set @subject = replace(replace(@subject, '{num}' , @num), '{project}', @project)

		declare @invLink nvarchar(256) = (select top 1 link from docs doc  
                    where parentID = @dsID and typeID = 4) 		
		set @attach = isnull(@attach, '') + iif(len(@invLink)> 0, '||' +  @invLink, '')
	end 
	
	if (lower(@templateCode)='sendact') begin	
	    -- по аналогии обрабатываем другой тип
	end 

	insert into @t1
	select isnull(@to , '') [to],
			'my@mail.ru' cc, 
			isnull(@subject, 'Нет шаблона письма') subject,
			isnull(@body, 'Нет шаблона письма') body , 
			'Согласование дополнительного соглашения' title,
			isnull(@attach, '') attach

	select * from @t1
end
	

В данной процедуре мы извлекаем шаблон письма, затем заполняем его данными от текущему itemID. 

В итоге получаем письмо по шаблону с конкретикой по данному контрагенту. Далее его можно по необходимости подправить и затем отправить нужным адресатам. 

 

Falcon Space - функциальная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы