使用CreateMIMEEntity与stream.writeText时邮件图片无法显示求助
LotusScript邮件嵌入图片解决方案
核心问题分析
你当前用<img src="/database.nsf/images/imageName.jpg">引用图片,本质是让收件人访问你的数据库资源,一旦收件人无数据库访问权限,图片就会加载失败。最可靠的解决方式是将图片直接嵌入到邮件MIME内容中,无需依赖外部权限。
1. 使用CreateMIMEEntity嵌入图片
这是标准且推荐的方案,通过MIME的multipart/related结构将图片作为内嵌资源关联到HTML内容,具体代码示例如下:
Dim session As New NotesSession Dim db As NotesDatabase Dim mailDoc As NotesDocument Dim bodyMIME As NotesMIMEEntity Dim htmlPart As NotesMIMEEntity Dim imagePart As NotesMIMEEntity Dim stream As NotesStream Dim imageStream As NotesStream Dim imageResource As NotesResource Set db = session.CurrentDatabase Set mailDoc = db.CreateDocument() mailDoc.Form = "Memo" mailDoc.Subject = "带内嵌图片的测试邮件" mailDoc.SendTo = "收件人邮箱" ' 启用邮件MIME支持 session.ConvertMIME = False ' 创建主MIME实体,设置为multipart/related类型(用于关联HTML和内嵌资源) Set bodyMIME = mailDoc.CreateMIMEEntity() Call bodyMIME.SetContentFromText("", "multipart/related; boundary=""boundary1""", ENC_NONE) ' 创建HTML内容部分 Set htmlPart = bodyMIME.CreateChildEntity() Set stream = session.CreateStream() Call stream.WriteText("<html><body>") Call stream.WriteText("<p>这是内嵌图片测试:</p>") ' 引用内嵌图片的Content-ID(注意cid格式:cid:后面跟自定义标识,要和图片部分的Content-ID一致) Call stream.WriteText("<img src=""cid:image001"" alt=""测试图片"" />") Call stream.WriteText("</body></html>") Call htmlPart.SetContentFromText(stream, "text/html; charset=utf-8", ENC_NONE) Call stream.Close() ' 读取数据库Resources\Images中的图片资源 Set imageResource = db.GetResource("Images/imageName.jpg") If Not imageResource Is Nothing Then Set imagePart = bodyMIME.CreateChildEntity() Set imageStream = session.CreateStream() Call imageResource.ExtractFile(imageStream) ' 设置图片MIME实体属性 Dim header As NotesMIMEHeader Set header = imagePart.CreateHeader("Content-ID") Call header.SetHeaderVal("<image001>") ' 这里的标识要和HTML里的cid对应 Set header = imagePart.CreateHeader("Content-Disposition") Call header.SetHeaderVal("inline; filename=""imageName.jpg""") ' 设置图片内容类型,JPG对应image/jpeg Call imagePart.SetContentFromBytes(imageStream, "image/jpeg", ENC_BASE64) Call imageStream.Close() End If ' 恢复MIME转换 session.ConvertMIME = True ' 发送邮件 Call mailDoc.Send(False)
2. 能否通过stream.writetext实现?
可以,但stream.writetext仅负责编写HTML内容,无法直接嵌入图片二进制数据。你需要先通过CreateMIMEEntity创建图片的内嵌资源实体,然后在stream.writetext编写的HTML中通过cid:引用该实体的Content-ID,本质和上面的方案是配合使用,而非单独用stream.writetext完成嵌入。
3. 是否需要将图片放到外部服务器?
不需要。将图片嵌入邮件本身是最优方案:
- 无需依赖外部服务器的可用性
- 避免收件人访问外部资源的权限/网络问题
- 邮件内容独立性更强,转发后图片依然能正常显示
只有当图片需要频繁更新、或文件体积过大(超过邮件附件限制)时,才考虑使用外部外链,但显然你的场景不适用。
内容的提问来源于stack exchange,提问作者RoyRumaner
相关产品推荐
相关产品推荐

