Нередко возникает необходимость в автоматической генерации и отправке электронных писем на основе данных из БД. Это могут быть различные отчёты с таблицами, диаграммами или уведомления о наступлении каких-то событий.
Всё это можно реализовать непосредственно в самой СУБД 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>, <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