首页 > 解决方案 > 如何使用 lotusscript 在电子邮件中嵌入图像?

问题描述

我有一个类,它有一种使用 HTML 发送电子邮件的方法。此方法将图像(如附件)包含到电子邮件中。

我有一个带有富文本字段的表单,用户将在其中附加图像。

我有一个问题:

发送 HTML 邮件的方法

' Sub to send an email with attachments
Public Sub SendEmailHTMLAttachments()

    ' General variables
    Dim ws As New NotesUIWorkspace
    Dim ns As New NotesSession
    Dim maildoc As NotesDocument
    Dim doc As NotesDocument
    Dim body As NotesMIMEEntity
    Dim mh As NotesMIMEHeader
    Dim mc As NotesMIMEEntity
    Dim stream As NotesStream
    Dim link As New Link

    Set maildoc = ws.Currentdocument.Document
    Set doc = ws.Currentdocument.Document

    ' Dont convert text to rich text
    ns.ConvertMIME = False

    ' Configure the mail
    maildoc.Form = "Memo"
    maildoc.Subject = me.m_subject
    maildoc.SendTo = me.m_sendto
    maildoc.CopyTo = me.m_sendtocc
    maildoc.blindCopyTo = me.m_sendtobcc

    ' Create the MIME headers
    Set body = maildoc.Createmimeentity
    Set mh = body.Createheader({MIME-Version})
    Call mh.Setheaderval("1.0")
    Set mh = body.Createheader("Content-Type")
    Call mh.Setheadervalandparams({multipart/alternative})

    ' Send the plain text part first
    Set mc = body.Createchildentity()
    Set stream = ns.Createstream()
    Call mc.Setcontentfromtext(stream, {text/plain}, ENC_NONE)

    ' Now send the HTML part. Order is important!
    Set mc = body.Createchildentity()
    Set stream = ns.Createstream()
    Call stream.Writetext(|<html lang="es">|)
    Call stream.Writetext(|<head>|)
    Call stream.Writetext(|<meta name="viewport" content="width=device-width, initial-scale=1.0">|)
    Call stream.Writetext(|<meta http-equiv="X-UA-Compatible" content="ie=edge">|)
    Call stream.Writetext(|</head>|)
    Call stream.Writetext(|<body>|)
    Call stream.Writetext(|<div style="background-color: #897d7d; border-radius: 0.5em; width: auto; height: 50px;">
                        <h1 style="color: white; text-align: center; padding: 0.1em;
                        font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;">| & me.m_header & |</h1>
                        </div>|)
    Call stream.Writetext(|<p>| & me.m_body & |</p>|)
    Call stream.Writetext(|<a href="| & link.GetLink() & |" target="_blank"
                        style="background-color: #A01314; color: white; padding: 14px 25px; text-align: center;
                        text-decoration: none; display: inline-block; border-radius: 1em;">Link to Form</a>|)
    Call stream.Writetext(|</body>|)
    Call stream.Writetext(|</html>|)
    Call mc.Setcontentfromtext(stream, {text/html;charset="utf-8"}, ENC_NONE)

    ' Close the stream
    Call stream.Close()

    ' Send it
    Call maildoc.Send(False)

    Delete link

End Sub

发送电子邮件的事件(按钮)

Sub Click(Source As Button)

    Dim subject As String
    Dim header As String
    Dim body As String
    Dim sendto(1 To 9) As String
    Dim sendtocc(1 To 3) As String
    Dim sendtobcc(1 To 3) As String
    Dim alert As String
    Dim flagalert As Boolean

    subject = "Form Lotus Notes: Test"
    header = "Form Lotus Notes: Test"
    body = "This is an example email using <b>HTML</b>."
    body = body + "<p>Url: <a href='www.google.es'>Google</a></p>."
    sendto(1) = "people"
    alert = ""

    Dim msj As New Mensaje(subject, header, body, sendto, "", "", alert, False)

    Call msj.SendEmailHTMLAttachments

    Delete msj

End Sub

收到电子邮件时的示例

在此处输入图像描述

我究竟做错了什么?

标签: lotus-noteslotusscriptlotus

解决方案


您做错的是您正在创建一个没有图像数据的多部分/替代消息,并且您依靠 Domino 以某种方式找出您真正想要做的事情。它不能。

您必须创建整个 MIME 消息,其中包含 multipart/related 和 multipart/alternative 部分的 multipart/mixed 部分。

multipart/related 部分必须包含具有 Content-disposition: Embedded 的图像/gif(或其他一些有效的图像格式)部分;filename=xxx,并且您需要将图像的编码字节流式传输到该部分——这并不容易,而且我没有代码来向您展示如何做到这一点。我认为 DXL 可能是大多数人处理这个问题的方式,尽管我很确定 MIDAS 富文本 API(不是免费的)使它更容易。

multipart/alternative 部分是您所拥有的,因为它包含您的 text/plain 和 text/html 部分,但您的 text/hteml 部分需要包含一个 img 标签,该标签正确引用了 multipart/related 内部的图像数据src=cid:xxx,其中 xxx 与您在 filename=xxx 中为图像输入的内容相匹配。


推荐阅读