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

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

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

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

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

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

<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 is a functional web development platform on a narrow stack MS SQL/Bootstrap. Falcon Space Gettting started
{sp-shortDemostandLinks}

Falcon Space Platform

This is a reduction in the cost of ownership

at the expense of fewer people to support

This is a quick change

while using the program

This is a modern interface

full adaptation for mobile devices

Note