|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
Здравствуйте! Использую этот форум давно как справочник, несколько раз уже выручал. Но решения по данной теме не нашел. Задача: Нужно сформировать и отправить подписанное (ключом) эл.сообщение через внешний SMTP сервер. Обычные письма без подписи отправлять умею (и с несколькими вложениями и т.д.),но как и куда вставить подпись. Пробовал создавать сообщение %Net.MIMEPart через %Net.MIMEWriter в файл и консольной командой openssl через $zf подписывать - после этого создавался файл в s/mime формате. Просто прикрепив этот файлик желаемого результата не дал и если записывать в BinaryData тоже. Помогите пожалуйста или из Cache это невозможно? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2015, 16:27 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
Добавлю Set msgsend = ##class(%Net.MailMessage).%New() s msgsend.IsMultiPart=1 s msgsend.MultiPartType="signed" ... говорит что сообщение с цифр.подписью,а дальше я не разрыл Т.е. как и куда подпись или подписанное сообщение (из файла) вставить ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2015, 16:41 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
Можете приложить полный пример вашего кода, с вызовом openssl ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2015, 17:01 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
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? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 08:43 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
Может сообщение неправильно формирую,но открывал файл через %Net.MIMEReader - две части сообщения видел. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 10:00 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
В общем, простого способа отправить подписанное сообщение нет стандартный %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) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:07 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
DAiMor, Спасибо большое - будем пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 13:15 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
DAiMor, Работает!!! Исправил Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
С исходным кодом - ругался. Может Cache старая ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 14:31 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
KaIIIuct, Может, я то проверял на 2016.1 версии ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 14:36 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
KaIIIuctС исходным кодом - ругался. Может Cache стараяНе может, а точно: класс %Stream.GlobalBinary есть по крайней мере в версии 5.2.4, а %Stream.FileBinary появился с версии 2008.2 . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 15:32 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
Вот кстати, сегодня выложили на community портале выложили проект под Ensemble для такой же цели подписание smime. посмотри может что найдешь интересного ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2015, 23:15 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
DAiMorпосмотри может что найдешь интересногоНичего нового и соответственно интересного: та же обвязка вокруг d $zf(-1,"openssl smime") PS: в WRC в курсе про S/MIME, но пока планов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2015, 09:16 |
|
Подписать и отправить эл.сообщение
|
|||
---|---|---|---|
#18+
DAiMorВот кстати, сегодня выложили на community портале выложили проект под Ensemble для такой же цели подписание smime. посмотри может что найдешь интересногоПосмотрел внимательней, он там просто файлы с openssl обрабатывает в продукции, без отправки по почте ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2015, 09:16 |
|
|
start [/forum/topic.php?fid=39&msg=39127540&tid=1556543]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 289ms |
total: | 428ms |
0 / 0 |