Блог

    Caché (Кашэ́) — промышленная высокопроизводительная, объектная система управления базами данных, интегрированная с технологией разработки веб-приложений. Единая архитектура данных Caché позволяет разработчикам использовать одновременно объектный, реляционный (SQL) и прямой (NoSQL) доступ к одним и тем же данным, хранение которых обеспечивается ориентированным на транзакции многомерным ядром СУБД.

    http://www.intersystems.ru/cache/

Последние записи


Теги

Информация

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

добавлено: 19 фев 13
понравилось:0
просмотров: 1914
комментов: 1

теги:

Автор: servit

Этот же пост доступен и на хабре.

Нередко возникает необходимость в автоматической генерации и отправке электронных писем на основе данных из БД. Это могут быть различные отчёты с таблицами, диаграммами или уведомления о наступлении каких-то событий.
Всё это можно реализовать непосредственно в самой СУБД 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"
  
set part.InlineAttachment=1    // иначе по умолчанию будет attachment.   graphic inside html
  
do part.Headers.SetAt("id1","Content-ID")

  
set part=msg.Parts.GetAt(2)
  
set part.ContentType="image/gif"
  
set part.InlineAttachment=1    // иначе по умолчанию будет attachment.   graphic inside html
  
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"
  
set part.InlineAttachment=1    // иначе по умолчанию будет attachment.   graphic inside html
  
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'>a</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>")

  
//...

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

UPD: спасибо Николю Жохову за замечание относительно
    set part.InlineAttachment=1    // иначе по умолчанию будет attachment.   graphic inside html

В этом случае будет

Content-Type: image/png; name="test.png"
Content-Transfer-Encoding: base64
Content-ID: <part2.4FB07DB1.63968A6D@intersystems.com>
Content-Disposition: inline; filename="test.png"

Если же не сделать InlineAttachment, то будет

Content-Type: image/png; name="test.png"
Content-Transfer-Encoding: base64
Content-ID: <part2.4FB07DB1.63968A6D@intersystems.com>
Content-Disposition: attachment; filename="test.png"

и картинка будет отображена во вложении письма, а не внутри html-тела письма.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии