Отправка отформатированного электронного письма Lotus Notes в формате Excel VBA

У меня мало знаний по Lotus Script или Notes/Domino, но у меня есть процедура, скопированная откуда-то очень давно, которая позволяет мне отправлять электронные письма через Notes из VBA. Обычно я использую это только для внутренних уведомлений, где форматирование не имеет большого значения.

Теперь я хочу использовать это для отправки внешних писем клиенту, и корпоративные типы предпочли бы, чтобы электронная почта соответствовала нашему руководству по стилю (шрифт без засечек в основном).

Я собирался сказать им, что код работает только с простым текстом, но затем я заметил, что подпрограмма ссылается на некоторый объект CREATERICHTEXTITEM. Означает ли это, что я мог бы применить какое-то форматирование к строке основного текста после того, как она была передана в почтовую процедуру? Наряду с поддержанием наших драгоценных ценностей бренда, это было бы очень удобно для меня, чтобы выделить некоторые отрывки в электронном письме.

У меня была информация о сети, чтобы увидеть, можно ли адаптировать этот код, но я был незнаком с объектной моделью Notes и тот факт, что онлайн-ресурсы Notes, похоже, отражают самоуверенность приложения, означал, что я не очень далеко.

Код:

 Sub sendEmail (EmailSubject As String, EMailSendTo As String, EMailBody As String, MailServer как String)

    Dim objNotesSession As Object
    Dim objNotesMailFile As Object
    Dim objNotesDocument As Object
    Dim objNotesField As Object
    Dim sendmail As Boolean

    добавлен для интеграции в инструмент отчетности
    Dim dbString As String

    dbString = "mail\" & Application.UserName & ".nsf"

При ошибке GoTo SendMailError
    Установить связь с заметками
    Установите objNotesSession = CreateObject("Notes.NotesSession")
При ошибке возобновить следующее
    Установить соединение с почтовым файлом
    Установите objNotesMailFile = objNotesSession.GETDATABASE(MailServer, dbString)
    Открытая почта
    objNotesMailFile.OPENMAIL
При ошибке GoTo 0

    Создать новое напоминание
    Установите objNotesDocument = objNotesMailFile.createdocument

    Dim oWorkSpace как объект, oUIdoc как объект
    Set oWorkSpace = CreateObject("Notes.NotesUIWorkspace")
    Установите oUIdoc = oWorkSpace.CurrentDocument

    "Создать" поле темы
    Установите objNotesField = objNotesDocument.APPENDITEMVALUE("Тема", EmailSubject)

    Поле "Создать" Отправить
    Установите objNotesField = objNotesDocument.APPENDITEMVALUE("SendTo", EMailSendTo)

    Поле "Создать" Копировать в
    Установите objNotesField = objNotesDocument.APPENDITEMVALUE("CopyTo", EMailCCTo)

    Поле "Создать слепую копию"
    Установите objNotesField = objNotesDocument.APPENDITEMVALUE("BlindCopyTo", EMailBCCTo)

    "Создать" тело "памятки
    Установите objNotesField = objNotesDocument.CREATERICHTEXTITEM("Тело")

    С objNotesField
        .APPENDTEXT emailBody
        .ADDNEWLINE 1
    Конец с

    "Отправить по электронной почте

    Вызовите objNotesDocument.Save(True, False, False)
    objNotesDocument.SaveMessageOnSend = True
    "objNotesDocument.Save
    objNotesDocument.Send (0)

    Выпуск хранения
    Set objNotesSession = Nothing
    Установить objNotesMailFile = Ничего
    Set objNotesDocument = Nothing
    Set objNotesField = Nothing

    Установить код возврата
    sendmail = True

    Exit Sub

SendMailError:
    Дим Мсг
    Msg = "Error # " & Str(Err.Number) & "сгенерировано" _
                & Err.Source & Chr(13) & Err.Description
    MsgBox Msg, "Ошибка", Err.HelpFile, Err.HelpContext
    sendmail = False
End Sub 

3 ответа

Решение

Короткий ответ: да. Длинный ответ мучителен. В Notes нет замечательных классов, которые могли бы манипулировать элементами форматированного текста. Однако некоторые из них, которые можно исследовать, - это NotesRichTextStyle, NotesRichTextParagraphStyle и NotesRichTextTable. Эти классы помогут вам определить некоторые элементы форматированного текста и программно добавить их в поле расширенного текста.

Другой подход, поскольку вы отправляете электронную почту, заключается в использовании классов NotesMIMEEntity и создании электронной почты с использованием HTML (намного проще). Вот пример кода:

Set s = New NotesSession
Dim docMail As NotesDocument
Dim body As NotesMIMEEntity
Dim stream As NotesStream

Set db = s.CurrentDatabase
s.ConvertMIME = False ' Do not convert MIME to rich text

'Create email to be sent
Set docMail = db.CreateDocument

With docMail
        .SendTo = SEND TO ADDRESS
        .From = FROM ADDRESS
        .Principal = FROM ADDRESS
        .ReplyTo = REPLY TO ADDRESS
        .Subject = SUBJECT
        .Form = "Memo"
End With

  Set stream = s.CreateStream
Set body = docMail.CreateMIMEEntity
Call stream.WriteText ("YOUR HTML CODE GOES HERE")

'ENC_IDENTITY_8BIT used because of technote found on notes.net
'http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/aeedaf28e47546ad85256f6a000a4b48?OpenDocument
Call body.SetContentFromText (stream, "text/html;charset=iso-8859-1",ENC_IDENTITY_8BIT) 

Call docMail.Send(False)
Set docMail = Nothing
Set body = Nothing
Set stream = Nothing

s.ConvertMIME = True ' Restore conversion   

По сути, вам нужно отключить параметр ConvertMIME в NotesSession. Затем создайте новый документ, установите свойства почты и т. Д. Эта часть уже есть в вашем коде VBA. Затем создайте MIMEEntity и поток для хранения вашего HTML-текста. Наконец, вызовите метод SetContentFromText для вашего объекта MIMEEntity. Затем отправьте свою электронную почту. Обратите внимание, что последний вызов должен снова включить функцию ConvertMIME для NotesSession.

Я не уверен, что все это будет работать через COM, но это хорошо работает в агентах LotusScript в Notes.

Надеюсь, это поможет!

Мне нравится так, как есть. Однако я должен был изменитьdbString = "mail\" & Application.UserName & ".nsf"вdbString = "mail\" & Application.CurrentUser & ".nsf"

Первый комментарий: Я бы хотел, чтобы во время отправки Lotus Notes не открывался.

Второй комментарий: я хотел бы изменить адрес электронной почты (т. Е. Если я отправляю отчет 50 людям, я хочу, чтобы он был с общего адреса, а не с моего рабочего адреса)

Чтобы изменить, от кого это, создайте общий идентификатор Notes (например, Auto Send/YourCompany) и сохраните агента с этим идентификатором.

Другие вопросы по тегам