Отправка электронной почты из Lotus Notes с использованием Excel и с вложением и текстом HTML - PullRequest
2 голосов
/ 23 марта 2010

Правильно. Я пытаюсь отправить электронное письмо из таблицы Excel, хотя в лотосных заметках есть вложение, а тело должно быть в формате HTML.

У меня есть некоторый код, который из всего, что я прочитал, должен позволять мне делать это, но это не так. Без тела HTML, которое будет отправлять вложение, когда я добавляю тело HTML, которое электронная почта все еще отправляет, но вложение исчезает, я попытался изменить порядок кода, вырезая биты, которые могут быть не нужны, но все равно.

(Вам нужно обратиться к объектам Lotus Domino для запуска этого кода. strEmail это адреса электронной почты strAttach - строка расположения вложения. strSubject является темой текста strBody - основной текст )

Sub Send_Lotus_Email(strEmail, strAttach, strSubject, strBody)

Dim noSession As Object, noDatabase As Object, noDocument As Object
Dim obAttachment As Object, EmbedObject As Object

Const EMBED_ATTACHMENT As Long = 1454

Set noSession = CreateObject("Notes.NotesSession")
Set noDatabase = noSession.GETDATABASE("", "")

'If Lotus Notes is not open then open the mail-part of it.
If noDatabase.IsOpen = False Then noDatabase.OPENMAIL

'Create the e-mail and the attachment.
Set noDocument = noDatabase.CreateDocument
Set obAttachment = noDocument.CreateRichTextItem("strAttach")
Set EmbedObject = obAttachment.EmbedObject(EMBED_ATTACHMENT, "", strAttach)

'Add values to the created e-mail main properties.
With noDocument
    .Form = "Memo"
    .SendTo = strEmail
    '.Body = strBody ' Where to send the body if HTML body isn't used.
    .Subject = strSubject
    .SaveMessageOnSend = True
End With

noSession.ConvertMIME = False
Set Body = noDocument.CreateMIMEEntity("Body") ' MIMEEntity to support HTML
Set stream = noSession.CreateStream
Call stream.WriteText(strBody) ' Write the body text to the stream
Call Body.SetContentFromText(stream, "text/html;charset=iso-8859-1", ENC_IDENTITY_8BIT)
noSession.ConvertMIME = True

 'Send the e-mail.
With noDocument
    .PostedDate = Now()
    .Send 0, strEmail
End With

 'Release objects from the memory.
Set EmbedObject = Nothing
Set obAttachment = Nothing
Set noDocument = Nothing
Set noDatabase = Nothing
Set noSession = Nothing

End Sub

Если бы Сомона могла направить меня в правильном направлении, я был бы очень признателен.

Edit: Я провел немного больше расследований и обнаружил странность: если я посмотрю на отправленную папку, у всех писем будет значок скрепки с вложением, даже если вы входите в электронное письмо, даже в отправленных HTML-сообщениях нет не показывать вложение.

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

Мне удалось решить собственную проблему.

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

    Sub Send_Lotus_Email(Addresses, Attach, strSubject, strBody)

'Declare Variables
 Dim s As Object
 Dim db As Object
 Dim body As Object
 Dim bodyChild As Object
 Dim header As Object
 Dim stream As Object
 Dim host As String
 Dim message As Object

 ' Notes variables
 Set s = CreateObject("Notes.NotesSession")
 Set db = s.CurrentDatabase
 Set stream = s.CreateStream

 ' Turn off auto conversion to rtf
 s.ConvertMIME = False

 ' Create message
 Set message = db.CreateDocument
 message.Form = "memo"
 message.Subject = strSubject
 message.SendTo = Addresses
 message.SaveMessageOnSend = True

 ' Create the body to hold HTML and attachment
 Set body = message.CreateMIMEEntity

'Child mime entity which is going to contain the HTML which we put in the stream
 Set bodyChild = body.CreateChildEntity()
 Call stream.WriteText(strBody)
 Call bodyChild.SetContentFromText(stream, "text/html;charset=iso-8859-1", ENC_NONE)
 Call stream.Close
 Call stream.Truncate

 ' This will run though an array of attachment paths and add them to the email
 For i = 0 To UBound(Attach)
    strAttach = Attach(i)
    If Len(strAttach) > 0 And Len(Dir(strAttach)) > 0 Then
        ' Get the attachment file name
        pos = InStrRev(strAttach, "\")
        Filename = Right(strAttach, Len(strAttach) - pos)

        'A new child mime entity to hold a file attachment
        Set bodyChild = body.CreateChildEntity()
        Set header = bodyChild.CreateHeader("Content-Type")
        Call header.SetHeaderVal("multipart/mixed")

        Set header = bodyChild.CreateHeader("Content-Disposition")
        Call header.SetHeaderVal("attachment; filename=" & Filename)

        Set header = bodyChild.CreateHeader("Content-ID")
        Call header.SetHeaderVal(Filename)

        Set stream = s.CreateStream()
        If Not stream.Open(strAttach, "binary") Then
            MsgBox "Open failed"
        End If
        If stream.Bytes = 0 Then
            MsgBox "File has no content"
        End If

        Call bodyChild.SetContentFromBytes(stream, "application/msexcel", ENC_IDENTITY_BINARY)' All my attachments are excel this would need changing depensding on your attachments.
    End If
 Next

 'Send the email
 Call message.Send(False)

 s.ConvertMIME = True ' Restore conversion

End Sub
1 голос
/ 22 июля 2010

Вот мой фактический код. Я даже не использую сильный тип.

 Dim mobjNotesSession As Object      ' Back-end session reference'
 Dim bConvertMime As Boolean
 Dim stream As Object
 Dim mimeHtmlPart As Object
 Const ENC_QUOTED_PRINTABLE = 1726

 mobjNotesSession = CreateObject("Lotus.NotesSession")
 mobjNotesSession.Initialize()

 mobjNotesDatabase = mobjNotesSession.GetDatabase("HQ2", "tim4")
 mobjNotesDocument = mobjNotesDatabase.CreateDocument

 bConvertMime = mobjNotesSession.ConvertMime
 mobjNotesSession.ConvertMime = False
 stream = mobjNotesSession.CreateStream()
 Call stream.WriteText(txtBody.Text)

 mobjNotesBody = mobjNotesDocument.CreateMIMEEntity("Body")
 mimeHtmlPart = mobjNotesBody.CreateChildEntity()  'This returns "Type Mismatch" error'
 Call mimeHtmlPart.SetContentFromText(stream, "text/html; charset=""iso-8859-1""", ENC_QUOTED_PRINTABLE)

 Call stream.Close()
 mobjNotesSession.ConvertMime = bConvertMime
 Call mobjNotesDocument.CloseMIMEEntities(True, "Body")
0 голосов
/ 22 июля 2010

Нет, извините, я не запускал это в VBA, который не является строго типизированным, так что я могу обойтись без знания фактического типа переменной для идентификатора тела. я не смог проверить это, но я верю, что вам нужно сбросить декларации на

Dim bodyChild As NotesMIMEEntity

у вас проблемы с теми, что ниже, вы также можете найти проблемы

Dim s As New NotesSession

Dim db As NotesDatabase 

Dim body As NotesMIMEEntity 

Dim header As NotesMIMEHeader 

Dim stream As NotesStream 

Dim host As String 

Dim message As NotesDocument

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

...