【问题标题】:Sending Email from Lotus Notes using Excel and having Attachment & HTML body使用 Excel 从 Lotus Notes 发送电子邮件并具有附件和 HTML 正文
【发布时间】:2011-01-30 21:13:57
【问题描述】:

是的,我正在尝试通过 lotus notes 发送一个 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

结束子

如果有人能指出我正确的方向,我将不胜感激。

编辑: 我做了更多调查,发现了一个奇怪的地方,如果我查看已发送的文件夹,电子邮件都带有带有附件的回形针图标,即使当您进入电子邮件时,即使在已发送的 HTML 中也没有'不显示附件。

【问题讨论】:

    标签: html email vba attachment lotus


    【解决方案1】:

    我已经设法解决了我自己的问题。

    以同样的方式创建一个 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
    

    【讨论】:

      【解决方案2】:

      对不起,我没有在 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
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        这是我的实际代码。我什至没有使用强类型。

         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")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 1970-01-01
          • 1970-01-01
          • 2017-05-23
          • 1970-01-01
          相关资源
          最近更新 更多