powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подписать и отправить эл.сообщение
13 сообщений из 13, страница 1 из 1
Подписать и отправить эл.сообщение
    #39127523
KaIIIuct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Использую этот форум давно как справочник, несколько раз уже выручал. Но решения по данной теме не нашел.
Задача: Нужно сформировать и отправить подписанное (ключом) эл.сообщение через внешний SMTP сервер.
Обычные письма без подписи отправлять умею (и с несколькими вложениями и т.д.),но как и куда вставить подпись.
Пробовал создавать сообщение %Net.MIMEPart через %Net.MIMEWriter в файл и консольной командой openssl через $zf подписывать - после этого создавался файл в s/mime формате. Просто прикрепив этот файлик желаемого результата не дал и если записывать в BinaryData тоже.
Помогите пожалуйста или из Cache это невозможно?
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39127540
KaIIIuct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю
Set msgsend = ##class(%Net.MailMessage).%New()
s msgsend.IsMultiPart=1
s msgsend.MultiPartType="signed" 
...
говорит что сообщение с цифр.подписью,а дальше я не разрыл
Т.е. как и куда подпись или подписанное сообщение (из файла) вставить
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39127561
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете приложить полный пример вашего кода, с вызовом openssl ?
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128042
KaIIIuct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,
 S msg=##class(%Net.MIMEPart).%New()
 S msg.ContentType="multipart/mixed; boundary=""NextPart12345678987654321"""
 S writer=##class(%Net.MIMEWriter).%New()
 S status=writer.OutputToFile("/.../Testtest.txt")
 
 S msg1=##class(%Net.MIMEPart).%New()
 s file=##class(%Stream.FileBinary).%New()
 s file.Filename="/.../DK011618.txt"
 s msg1.ContentType="application/octet-stream; Content-Disposition=attachment; filename=DK011618.txt"
 s msg1.ContentTransferEncoding="base64"
 S msg1.Body=##class(%GlobalBinaryStream).%New()
 D msg1.Body.Write($System.Encryption.Base64Encode(file.Read()))
 
 S msg2=##class(%Net.MIMEPart).%New()
 s msg2.ContentType="text/plain"
 s msg2.ContentCharset="utf-8"
 s msg2.ContentTransferEncoding="7bit"
 S msg2.Body=##class(%GlobalCharacterStream).%New()
 D msg2.Body.Write("Hello")
 
 d msg.Parts.Insert(msg1)
 d msg.Parts.Insert(msg2)
 
 Set status=writer.WriteMIMEMessage(msg)
 
 d $zf(-1," openssl smime -sign -in /.../Testtest.txt -text -signer mycert.pem -inkey private_key.pem > /.../Testtestsign.txt")
Первая часть $zf до символа ">" точно правильная - дальше по синтаксису точно не помню - искать долго,но главное получается сообщение в s/mime формате в текстовом виде (в файле).

Вот дальше как распарсить этот файл и сформировать сообщение через %Net.MailMessage?
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128118
KaIIIuct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может сообщение неправильно формирую,но открывал файл через %Net.MIMEReader - две части сообщения видел.
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128413
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, простого способа отправить подписанное сообщение нет
стандартный %Net.SMTP такое не поддерживает

у тебя есть ошибки в формировании MIME Parts, вот как это работает у меня, сравнивай  SET msg=##class(%Net.MIMEPart).%New()
  set msg.Boundary="NextPart"_$zstrip($random(100000)/17,"<>W")
  SET msg.ContentType="multipart/mixed; boundary="""_msg.Boundary_""""
  
  SET msg1=##class(%Net.MIMEPart).%New()
  set file=##class(%Stream.FileBinary).%New()
  set file.Filename="test.txt"
  set msg1.ContentType="application/octet-stream"
  do msg1.SetHeader("Content-Disposition", "attachment; filename=""test.txt""")
  set msg1.ContentTransferEncoding="base64"
  SET msg1.Body=##class(%Stream.GlobalBinary).%New()
  DO msg1.Body.CopyFrom(file)

  SET msg2=##class(%Net.MIMEPart).%New()
  set msg2.ContentType="text/plain"
  set msg2.ContentCharset="utf-8"
  set msg2.ContentTransferEncoding="7bit"
  SET msg2.Body=##class(%Stream.GlobalCharacter).%New()
  DO msg2.Body.Write("Hello")

  do msg.Parts.Insert(msg2)
  do msg.Parts.Insert(msg1)

  SET writer=##class(%Net.MIMEWriter).%New()
  SET status=writer.OutputToFile("Testtest.txt")
  Set status=writer.WriteMIMEMessage(msg)
с openssl тоже ошибочка вышла, стоял флаг -text, который принимал входящий файл как текстовый и неважно что там уже multipart

d $zf(-1,"openssl smime -sign -in Testtest.txt -signer mail.crt -inkey mail.key -passin pass:laimon -out Testtestsign.txt")

ну и то что у тебя не вышло это отправка сообщений
Возможно это и можно решить на стандартном %Net.SMTP, но мне было проще переопределить один из его методов - SendMessagePart, чтобы в нем вывести полностью как есть результат от opensslClass Net.SMTP Extends %Net.SMTP
{

Method SendMessagePart(msg As %Net.MailMessagePart) [ Internal, Private ]
{
  set mailmsg=msg.Parts.GetAt(1)
  if mailmsg.%IsA("%Stream.Object") {
    do mailmsg.OutputToDevice()
  } else {
    do ##super(msg)
  }
}

}
и собственно сама отправка сообщения, с использованием нашего Net.SMTP  set s=##class(Net.SMTP).%New()
  set s.smtpserver="smtp server"
  set m=##class(%Net.MailMessage).%New()
  set m.From="test@mail.ru"
  do m.To.Insert("test@mail.ru")

  set auth=##class(%Net.Authenticator).%New() ; use default authentication list
  set auth.UserName="userlogin"
  set auth.Password="password"
  set s.authenticator=auth
  
  set m.Subject="Sent by Cache' mail"

  // вот тут добавляем поток на файл полученный от openssl
  SET signedData=##class(%Stream.FileBinary).%New()
  set signedData.Filename="Testtestsign.txt"
  // и он будет выводится как есть в сообщение
  do m.Parts.SetAt(signedData, 1)
  set m.IsMultiPart=0 // важно поставить в 0
  
  set sc=s.Send(m)
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128426
KaIIIuct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

Спасибо большое - будем пробовать.
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128589
KaIIIuct
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

Работает!!!
Исправил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SET msg1.Body=##class(%Stream.GlobalBinary).%New()
...
SET msg2.Body=##class(%Stream.GlobalCharacter).%New()

на

SET msg1.Body=##class(%GlobalBinaryStream).%New()
...
SET msg2.Body=##class(%GlobalCharacterStream).%New()

С исходным кодом - ругался. Может Cache старая
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128599
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KaIIIuct,

Может, я то проверял на 2016.1 версии
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39128678
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KaIIIuctС исходным кодом - ругался. Может Cache стараяНе может, а точно: класс %Stream.GlobalBinary есть по крайней мере в версии 5.2.4, а %Stream.FileBinary появился с версии 2008.2 .
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39136606
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кстати, сегодня выложили на community портале выложили проект под Ensemble для такой же цели подписание smime. посмотри может что найдешь интересного
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39136738
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorпосмотри может что найдешь интересногоНичего нового и соответственно интересного: та же обвязка вокруг

d $zf(-1,"openssl smime")

PS: в WRC в курсе про S/MIME, но пока планов нет.
...
Рейтинг: 0 / 0
Подписать и отправить эл.сообщение
    #39136739
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMorВот кстати, сегодня выложили на community портале выложили проект под Ensemble для такой же цели подписание smime. посмотри может что найдешь интересногоПосмотрел внимательней, он там просто файлы с openssl обрабатывает в продукции, без отправки по почте
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подписать и отправить эл.сообщение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]