powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отправить html-email, при этом оформить его как RE на другое письмо (.eml, во входящих)
2 сообщений из 2, страница 1 из 1
Отправить html-email, при этом оформить его как RE на другое письмо (.eml, во входящих)
    #39262465
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжении старой темы:
Нарисовать стандартное письмо email

Сразу оговорюсь, никаких Outlook (который Office).
Делаю для себя, а мне нравится Почта Windows (аналог доброго OE).
Надо чтоб письмо клеилось по шаблону, при этом оказалось в "Исходящие" (с возможностью чуть взглянуть его, чуть подправить если надо, подписать и т.п.) Ну а после лежало в "Отправленные" (т.е. автоматика типа CDO/.Net.Mail не нужна, особое причесывание под Win-стандарты тоже не нужно).

Первую задачу я решил.
Т.е. есть некий html-шаблон, я его правлю, подставляя %CustomerName%, и т.п., можно вставлять текст, можно "куски html",
в общем в итоге это письмо с htmlBody уходит в "Исходящие" вот таким простым кодом (с использованием древнего VB6-ocx):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  Public Sub SendMapiEmailHtml(ByVal m_EmailAddr As String, ByVal m_CustomerName As String, _
   ByVal m_Subject As String, ByVal m_HTMLBody As String, Optional ByVal m_Show As Boolean = False)
    Dim o_MAPISession As New MSMAPI.MAPISession
    With o_MAPISession
      .DownLoadMail = False
      .LogonUI = True
      .NewSession = False
      .SignOn()
    End With

    Dim o_MAPIMessages As New MSMAPI.MAPIMessages
    o_MAPIMessages.SessionID = o_MAPISession.SessionID
    With o_MAPIMessages
      .Compose()
      .RecipIndex = 0
      .RecipAddress = m_EmailAddr
      .RecipDisplayName = m_CustomerName
      .RecipType = MSMAPI.RecipTypeConstants.mapToList
      .MsgSubject = m_Subject
      .AttachmentPathName = m_HTMLBody
      .Send(m_Show)
    End With
    o_MAPISession.SignOff()
  End Sub


И заметим, уходит в HTML-формате, хотя SimpleMAPI этого типа не умеет (трюк: .MsgNoteText -пустой, а HTMLBody это вложение).

Но встала другая задача:
Надо "Ответить" (либо "Ответить Всем") т.е. создать RE на письмо которое пришло во "Входящие".
Причем сделать это в формате HTML (то на которое отвечаю суть HTML - и должно цитироваться в HTML
ну и мой шаблон в HTML в ответ).

Грубо, надо получить HTML-страницу пришедшего письма в RE-формате (как это делают почтовики), ну и в нее сверху дописать свой шаблон.
Нужны идеи как и какими средствами это сделать.

Ковырять могу так:
1) SimpleMAPI:
есть доступ к "Входящие",
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    With o_MAPIMessages
      .FetchSorted = True
      .Fetch()
      If .MsgCount > 0 Then
        For i As Integer = .MsgCount - 1 To 0 Step -1
          .MsgIndex = i
           Dim the_str As String = Replace(.MsgNoteText, vbLf, vbCrLf)
           str_Subject = Trim(.MsgSubject)
           str_Body = the_str
        Next
      End If
    End With


Скажем запихнуть заголовки в ListView, ткнуть в нужное,
дальше можно даже сделать методы
.Reply .ReplyAll
сверху дописать текст
и "отправить" - вроде то что надо, но это PlainText
а мне надо HTML -не годится.
Как вариант можно конечно из этого метода выдрать PlainText-RE и адресатов
и воткнуть в свой HTML-шаблон вниз, его и отправить,
но решение половинчатое - та часть что я "цитирую" (на что отвечаю) будет TEXT.
2) CDO.Message
Ну в принципе путь к папке Inbox я знаю, там лежит набор .eml.
Можно письмо мышкой DragDrop из входящих перенести и будет тоже .eml
Смысл в том что вычислить путь/получить .eml на который отвечать я допустим смогу.
Дальше ковырять его через CDO.
Исходный HTML допустим вытащу, но он будет не в RE - формате.
И я не уверен что CDO.Message умеет делать генерить .Reply

Ну вот такие предварительные идеи.

М.б. кто подаст еще идей?

Плохо конечно что в Почта Windows (OE) нет своих API (как в Outlook Office).
Вернее они есть:
Windows Mail (formerly Outlook Express)
но не для средних умов, при этом глючные и плохо программируются через VB/.Net.
Овчинка в данном случае выделки не стоит.
Посему что угодно, только не их. Проще думаю смухлевать из подручных средств.
...
Рейтинг: 0 / 0
Отправить html-email, при этом оформить его как RE на другое письмо (.eml, во входящих)
    #39263264
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сгенерить HTML-Reply на исходный .eml вроде удалось через CDO.Message.
Вполне-таки сносно.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
  Private Sub ButtonReply_Click(sender As Object, e As EventArgs) Handles ButtonReply.Click
    Dim v_Conf As String = "http://schemas.microsoft.com/cdo/configuration/"
    Dim o_Mess As CDO.Message = LoadMessageFromFile("test_orig.eml") ' As Object
    With o_Mess.Configuration.Fields
      .Item(v_Conf & "usemessageresponsetext").Value = True
      .Item(v_Conf & "languagecode").Value = "en-us" 'Original Message/From/To и т.п. на английском при цитировании
      .Update()
    End With

    ' Assume we want to reply to all recipients.
    Dim o_Mess2 As New CDO.Message
    o_Mess2 = o_Mess.Reply '.ReplyAll
    o_Mess2.BodyPart.Charset = "utf-8"
    o_Mess2.TextBodyPart.Charset = "utf-8"

    If o_Mess2.HTMLBody <> "" Then
      o_Mess2.HTMLBodyPart.Charset = "utf-8"
      ' сохранить страницу как html
      o_Mess2.HTMLBodyPart.GetDecodedContentStream.SaveToFile("reply.htm", ADODB.SaveOptionsEnum.adSaveCreateOverWrite)
    Else ' сохранить страницу как txt
      o_Mess2.TextBodyPart.GetDecodedContentStream.SaveToFile("reply.txt", ADODB.SaveOptionsEnum.adSaveCreateOverWrite)
    End If

    'save "Reply" to .eml
    Dim oDsrc As CDO.IDataSource
    oDsrc = o_Mess2

    Dim Stm As New ADODB.Stream
    Stm.Type = o_Mess2.GetStream().Type
    Stm.Charset = o_Mess2.GetStream().Charset
    Stm.Open()
    oDsrc.SaveToObject(Stm, "_Stream")
    Stm.SaveToFile("test_res.eml", ADODB.SaveOptionsEnum.adSaveCreateOverWrite)
    'o_Mess.Send()
  End Sub

  Private Function LoadMessageFromFile(ByVal Path As String) As CDO.Message 'As Object
    Dim Stm As New ADODB.Stream '= CreateObject("ADODB.Stream")
    Stm.Open()
    Stm.Type = ADODB.StreamTypeEnum.adTypeBinary
    'Stm.Charset = "utf-8"
    Stm.LoadFromFile(Path)
    Dim iMsg As New CDO.Message '= CreateObject("CDO.Message")
    'Dim iDsrc As Object = iMsg.DataSource ' get IDataSource interface
    Dim iDsrc As CDO.IDataSource = iMsg.DataSource ' get IDataSource interface
    iDsrc.OpenObject(Stm, "_Stream")
    LoadMessageFromFile = iMsg
  End Function
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Отправить html-email, при этом оформить его как RE на другое письмо (.eml, во входящих)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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