Lotusscript MIME电子邮件

问题描述 投票:0回答:1

我修改了一个我找到的代码来发送带有附件的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

知道我错过了什么吗?

lotus-notes lotusscript
1个回答
2
投票

在我看来,你只使用了一个多段式的部分。我没有看到一个多段混合的部分。我相信,你需要有一个这样的嵌套结构。

 multipart/mixed
   application/octet-stream
   application/octet-stream (etc...)
   multipart/alternative
     text/plain
     text/HTML

给自己发一封手工制作的邮件,看起来是你想要的样子,并验证收到的邮件中的MIME头,以确定我的做法是正确的(Notes客户端中的 "查看-显示-页面来源 "或gmail中的 "显示原件"),但我在自己的收件箱中看了几封带附件的邮件,它们都有这样的结构。


1
投票

我用的顺序是

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)

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.