Примеры генерации и отправки Email средствами СУБД Caché

в 5:54, , рубрики: cache, dbms cache, email, intersystems cache, smtp, Блог компании InterSystems, субд Caché, метки: , , , , ,

Нередко возникает необходимость в автоматической генерации и отправке электронных писем на основе данных из БД. Это могут быть различные отчёты с таблицами, диаграммами или уведомления о наступлении каких-то событий.
Всё это можно реализовать непосредственно в самой СУБД Caché, выступающей здесь и как почтовый сервер приложений.

Далее рассмотрим следующие примеры:

  • создание текстового письма
  • создание письма в формате HTML
  • добавление вложений
  • добавление изображений в само тело письма
  • другие примеры


Для работы с почтой существует несколько классов пакета %Net.
В документации достаточно подробно описана работа с email, поэтому сразу приступим к примерам.

Обычное текстовое письмо

  #dim ex As %Exception.SystemException
  
try{
    
    
set msg=##class(%Net.MailMessage).%New()

    set msg.Subject="Тема письма"

    set msg.From="from@domain.com"

    do msg.To.Insert("to@domain.com")

    do msg.TextData.Write("Привет, Хабр!")
  
    
set smtp=##class(%Net.SMTP).%New()
    
set smtp.smtpserver="123.145.167.189"

    $$$ThrowOnError(smtp.Send(msg))

  }catch ex {
    
write $system.Status.GetErrorText(ex.AsStatus(),"ru"),!
  
}

Поскольку для тестов использовалась Unicode-версия Caché, то кодировка письма по умолчанию равна utf-8, что нам вполне подходит.
Если у вас 8-битная версия, то необходимо дополнительно установить нужную кодировку.
Например, так:
set msg.Charset="utf-8"

Заголовки письма (важность, пометка, др.)

Добавим к примеру выше следующие строчки:

  do msg.Headers.SetAt("Company-Confidential","Sensitivity")

  do msg.Headers.SetAt("Low","X-Priority")
  
do msg.Headers.SetAt("Low","X-MSMail-Priority")
  
do msg.Headers.SetAt("Low","Importance")

Схожим образом можно добавлять и другие заголовки в ваши письма.
Для заголовка Sensitivity (пометка) доступны следующие значения:

  • Normal — обычное
  • Personal — личное
  • Private — частное
  • Company-ConfidentialДСП

Для X-Priority, X-MSMail-Priority и Importance (важность) доступны следующие значения или их числовые коды:

  • Low — низкая (5)
  • Normal — обычная (3)
  • High — высокая (1)

Аутентификация на SMTP сервере

Если SMTP-сервер требует аутентификацию, то необходимо воспользоваться классом %Net.Authenticator:

  do msg.To.Insert("to@domain.com")
  
do msg.Cc.Insert("cc@domain.com")
  
do msg.Bcc.Insert("bcc@domain.com")

  do msg.TextData.Write("Привет, Хабр!")

  set auth=##class(%Net.Authenticator).%New()
  
set auth.UserName="логин"
  
set auth.Password="пароль"

  set smtp=##class(%Net.SMTP).%New()
  
set smtp.smtpserver="123.145.167.189"
  
set smtp.authenticator=auth

Письмо с вложением

Для добавления вложений существует несколько методов: AttachFile, AttachStream, AttachEmail, AttachNewMessage.

Добавим в наш пример файл с фотографией:
do msg.AttachFile("c:Photo","test.jpg")

Письмо в формате HTML

Для этого присвоим истину свойству IsHTML:

  //…

  do msg.To.Insert("to@domain.com")

  set msg.IsHTML=1

  do msg.TextData.Write("<b>Привет</b>, <font color='red'>Хабр</font>!")
  
do msg.TextData.Write("<br/>Нажмите на <a href='http://intersystems.ru/cache/index.html'>Caché</a>, чтобы перейти на сайт <u>InterSystems</u>.")
  
  
set smtp=##class(%Net.SMTP).%New()

  //...

Изображение в теле письма

Вариант 1: несколько изображений из файлов

  //…

  set msg.IsHTML=1
    
  
set msg.MultiPartType="related"

  do msg.AttachFile("c:Photo","test1.jpg")
  
do msg.AttachFile("c:Photo","test2.gif")

  set part=msg.Parts.GetAt(1)
  
set part.ContentType="image/jpeg"
  
do part.Headers.SetAt("id1","Content-ID")

  set part=msg.Parts.GetAt(2)
  
set part.ContentType="image/gif"
  
do part.Headers.SetAt("id2","Content-ID")

  do msg.TextData.Write("<b>Привет</b>, <font color='red'>Хабр</font>!")
  
do msg.TextData.Write("<br/><img src='cid:id1'>")
  
do msg.TextData.Write("<br/><img src='cid:id2'>")

  //...

Вариант 2: изображение из «памяти»

  //…

  set msg.IsHTML=$$$YES

  set msg.MultiPartType="related" 
    
  
set stream=##class(%GlobalBinaryStream).%New()
  
do stream.Write($system.Encryption.Base64Decode(
    
"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD"_$$$NL_
    
"UUlEQVR42lWTWUwTURSGaUtIKY5QweISTUzceDGu0Rj1xURjTNQEE+ODGn0hPhBEQdqZztahBbrA"_$$$NL_
    
"tFih1Fprh9IBiVLLErZSU7BUoS7VqNH44ovx0S0ovdfO4Ez04cw9Ofec7/5zzr15NEnkUxSVFx8O"_$$$NL_
    
"bZ1x7nzHN6z9nOhnzOFwWCnECcKoEFbBRrrp6iF/XRvD0BoplkdTuAiIhtt3P3Fu+jJlKlkM1WoX"_$$$NL_
    
"LFjVeSnpXrC94gV3ciJp1X0L1K7+NtDfvXdpj1TmmUwm8QTfLa867T+ceWTSwO5r5b87XNaDEoBr"_$$$NL_
    
"v3p2Ai+AU1Qh5OiDGS4UXi4roAisQHBiYfJS2obAVPMyELYcGxViOIaKcLaNLXzadej5nBUBPXW6"_$$$NL_
    
"hdYW0z4RQOYUXK2tUfr8QeXL0Kn4JKEBk7QWdtrrLggJJEmoCBxVCf50qIaaa0HABFkEPZaLNnGf"_$$$NL_
    
"wPNFGV0u05Y554bvMQoBPLbxs9t9QydJpHP/KayRbsf+pG1NdgTTgDuGXa8dbS41ZtArxaQYT1Wl"_$$$NL_
    
"HVqYaloGOcvJIan4X2MdViTl3vExbS+GPfXlvzzutj1LPch9HrYea59t0YIRtAAO+PQuIWYwNKik"_$$$NL_
    
"Yty41Iuk/3TvMzsCB9HcQR7msgzgjZs7Z5rLQPR6PojeJW2d3oDCoG/IlwAYqlexbp/i9eB19ziu"_$$$NL_
    
"BoMoAlrR03YZ0G8+0JFhS8EjuhD6zWfuCTEjppcBOKYX1bwaqA5MM2oYZ4pBy7XjrAyY7sPqU01F"_$$$NL_
    
"cNZW/jtwZeXXVpt5u1RM4JhYzHFBddqz5/28fUU2NwngtVUbZUCE79o6x67/MYiXLiSbS8D9xp1v"_$$$NL_
    
"I7znkLvDK07A5/MiT7mzdxMMAsdMqxaiWDHkgzePigBUXy9KTfdWeVKNSjjPrvv5uKkYxszlIHX7"_$$$NL_
    
"eDLeVfkgbt30bt5eAlOOtT9nLRrI03szrOumOtcb4SrTSj2KKfr4nuUZ7kR8HFPAYXLlYqxRl43T"_$$$NL_
    
"GjjTWAhHCC1MNK/+lWA0cJLRgfsh95G/N1H136z7+BCSuHMuMEGVLo4a1XCKKcuO0WXZBw1FcNig"_$$$NL_
    
"hmPWbe8jIeeJpdFiCrkHguWUyM92NBKseBut8T92bfsw66z49IyrHH2T5CvlqeCYUvL/ANIZ7+oh"_$$$NL_
    
"XSdWAAAAAElFTkSuQmCC"))
  
do msg.AttachStream(stream,"id1")
    
  
set part=msg.Parts.GetAt(1)
  
set part.ContentType="image/png"
  
do part.Headers.SetAt("id1","Content-ID")

  do msg.TextData.Write("<html><body>")
  
do msg.TextData.Write("<b>Привет</b>,&nbsp;<font color='red'>Хабр</font>!")
  
do msg.TextData.Write("<ul><li>asd</li><li>qwe</li><li>zxc</li></ul>")
  
do msg.TextData.Write("<img src='cid:id1'>")
  
do msg.TextData.Write("<br><span style='color:red;font-weight:bold'>B</span>un<span style='color:green;font-weight:bold'>ă</span> ziua!")
  
do msg.TextData.Write("<br><table border=1 cellpadding=2 cellspacing=2><tr BGCOLOR=#22ffdd><td>Столбец №1</td><td>Столбец №2</td></tr><tr><td>Row (1,1)</td><td BGCOLOR=#ddff22>Row (1,2)</td></tr><tr><td>Row (2,1)</td><td>Row (2,2)</td></tr></table>")
  
do msg.TextData.Write("</body></html>")

  //...


Скачать исходный класс со всеми примерами.

Автор: servitRM

Источник

Поделиться

* - обязательные к заполнению поля