html - 使用 Excel 从 Lotus Notes 发送电子邮件并具有附件和 HTML 正文

标签 html email vba attachment lotus

是的,我正在尝试通过 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 中创建 MIME 条目和流,您需要对附件执行相同的操作,您还需要将它们都放在电子邮件本身的 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

关于html - 使用 Excel 从 Lotus Notes 发送电子邮件并具有附件和 HTML 正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501496/

相关文章:

sql - 来自数据库的困难分组报告

html - 如何防止固定布局表格单元格中的断字?

html - 如何防止html页面在特定高度后缩小

具有相同域的电子邮件不会从 postfix 发出

regex - 为基于 Web 的邮件列表存档编码 Gmail 样式 "hide quoted text"

vba - Excel 2016 在 API 计时器启动时崩溃 Workbook.close

html - 使用 Zurb Foundation 创建大型输入文本的正确方法是什么

javascript - 用于多列列表的 JQuery slideToggle

PHP访问Linux服务器上的邮件队列

vba - 线系列可以绘制为半实线、半虚线吗?