我修改了一个我找到的代码来发送带有附件的MIME HTML邮件,当邮件在gmail中打开时,它可以工作,但在Apple Mail或Lotus Notes中,正文中没有任何附件,纯文本部分也没有到达,但我感兴趣的是附件。
这是我的代码。
Set MailDoc = New NotesDocument( mailbox )
session.convertMIME = False
Dim body As NotesMIMEEntity
Dim mimeHeader As NotesMIMEHeader
Dim mimeEntity As NotesMIMEEntity
Dim stream As NotesStream
Set body = mailDoc.CreateMIMEEntity.
Set mimeHeader = body.CreateHeader({MIME-Version})
Call mimeHeader.SetHeaderVal("1.0")
Set mimeHeader = body.CreateHeader("Content-Type")
Call mimeHeader.SetHeaderValAndParams({multipart/alternative;boundary="=NextPart_="})
' create another MIME part for the attachment. (repeat as needed)
If (docEval.HasItem("$File")) Then
Dim AttachmentsField As NotesRichTextItem
Set AttachmentsField = docEval.GetFirstItem( "fc_adjunto" )
If IsArray(AttachmentsField.EmbeddedObjects) Then ' Isarray validates for attachments ignoring embedded text
ForAll att In AttachmentsField.EmbeddedObjects
If att.Type = EMBED_ATTACHMENT Then
Call errorLog.LogAction("Inicio attch: " + att.Name())
Set mimeEntity = body.CreateChildEntity( )
Set mimeHeader = mimeEntity.CreateHeader("Content-Disposition")
aliasFilename = CStr(att.Name())
Call mimeHeader.SetHeaderValAndParams(|attachment; filename=| & aliasFilename)
Set stream = session.CreateStream
attachFilename = AttachToFile(session, docEval, CStr(att.Name())) 'Call o.ExtractFile(Attachfoldername & "\" & o.Name())
Call errorLog.LogAction("Inicio attch name: " + attachFilename)
stream.Open attachFileName, "binary"
Call mimeEntity.SetContentFromBytes(stream, "application/octet-stream", ENC_IDENTITY_BINARY)
mimeEntity.EncodeContent(ENC_BASE64)
Kill attachFilename
End If
End ForAll
End If
End If
'Send the plain text part first (this never work for me!!)
Set mimeEntity = body.createChildEntity()
Set stream = session.createStream()
Call WritePlainText(stream)
Call mimeEntity.setContentFromText(stream, {text/plain;charset="iso-8859-1"}, ENC_IDENTITY_8BIT)
'Send the HTML part.
Call stream.Truncate()
'Send the HTML part.
Set mimeEntity = body.createChildEntity()
Call WriteHTML(stream, elHtml)
Call mimeEntity.setContentFromText(stream, {text/html;charset="iso-8859-1"},ENC_IDENTITY_8BIT)
'Close the stream and Send it
Call stream.Truncate()
Call stream.Close()
Call maildoc.Closemimeentities(True)
Call MailDoc.ReplaceItemValue("EncryptOnSend" , True )
Call MailDoc.ReplaceItemValue("PostedDate" , Now )
Call MailDoc.ReplaceItemValue("From" , Remitente )
Call MailDoc.ReplaceItemValue("SendFrom" , Remitente )
Call MailDoc.ReplaceItemValue("Principal" , Remitente )
Call MailDoc.ReplaceItemValue( "SendTo" , sendTo )
Call MailDoc.ReplaceItemValue( "CopyTo" , copyTo )
Call MailDoc.ReplaceItemValue( "BlindCopyTo" , bccTo )
Call MailDoc.ReplaceItemValue( "Subject" , Subject )
Call MailDoc.save( True , False ) 'Send it
session.convertMIME = True
知道我错过了什么吗?
在我看来,你只使用了一个多段式的部分。我没有看到一个多段混合的部分。我相信,你需要有一个这样的嵌套结构。
multipart/mixed
application/octet-stream
application/octet-stream (etc...)
multipart/alternative
text/plain
text/HTML
给自己发一封手工制作的邮件,看起来是你想要的样子,并验证收到的邮件中的MIME头,以确定我的做法是正确的(Notes客户端中的 "查看-显示-页面来源 "或gmail中的 "显示原件"),但我在自己的收件箱中看了几封带附件的邮件,它们都有这样的结构。
我用的顺序是
multipartmixed multipartalternative textplain textHTML applicationoctet-stream applicationoctet-stream (etc...)谢谢 @Richard。
首先,我已经改变了
SetHeaderValAndParams({multipart/alternative;boundary="=NextPart_="})
至。
SetHeaderValAndParams({multipart/mixed;boundary="=NextPart_="})
然后是纯文本。
setContentFromText(stream, {text/plain}, ENC_NONE)
然后是html。
setContentFromText(stream, {text/html;charset="iso-8859-1"}, ENC_NONE)
最后是: 根据需要重复... (附件)
stream.Open attachFileName, "binary" (attachFileName full path)
mc.SetContentFromBytes(stream, "application/octet-stream", ENC_IDENTITY_BINARY)
IMHO更好的代码你可以在。http:/www.codestore.netstore.nsfunidBLOG-20091022-0419