Odesílání HTML e-mailů z LN je docela problém, LN to “přežvejkají” a skoro vždy z toho je nečitelný paskvil.

Na oblíbeném CodeStore je článek HTML Emails The Easy Way, který nabízí řešení pomocí metody SetContentFromText třídy NotesMIMEEntity.

Pro našeho zákazníka jsme řešili odesílání HTML mailů z dokumentu, ve kterém zadávají emailovou adresu, předmět a BODY. Do BODY si ze dříve vytvořené šablony nakopírují obsah zprávy v HTML formátu a jako přílohy použité obrázky. Po stisku tlačítka Send se odešle email na požadovanou adresu.

Použití

Funkci CreateHtmlMail (viz níže) se jako parametry dávají:

  • mailDoc – mail dokument
  • text – textová verze e-mailu
  • html – HTML verze e-mailu
  • images – seznam obrázku (images(”soubor.xxx”) = “C:\adresar\soubor.xxx”)

V HTML se na obrázky odkazujeme <img src="cid:soubor.xxx">

Ukázka BODY v dokumentu – HTML

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<TABLE border=0 cellSpacing=0 cellPadding=0 width=548 align=center>
  <TBODY>
  <TR>
    <TD colSpan=5>
      <img src="cid:mail-head.gif">
    </TD></TR>
  <TR>
    <TD width=30> </TD>
    <TD width=488 colSpan=3>
      <img src="cid:mail-corner-1.gif">
    </TD>
    <TD width=30> </TD></TR>
  <TR>
    <TD style="FONT-SIZE: 1px; OVERFLOW: hidden" height=10 width=30> </TD>
    <TD style="BACKGROUND: #f0f0f0; FONT-SIZE: 1px; OVERFLOW: hidden"
    bgColor=#f0f0f0 height=10 width=488 colSpan=3> </TD>
    <TD style="FONT-SIZE: 1px; OVERFLOW: hidden" height=10
  width=30> </TD></TR>
  <TR>
    <TD width=30> </TD>
    <TD style="BACKGROUND: #f0f0f0" bgColor=#f0f0f0 width=20> </TD>
    <TD style="BACKGROUND: #f0f0f0" bgColor=#f0f0f0 width=448>
      <P style="FONT-FAMILY: Arial, Helvetica, sans-serif; FONT-SIZE: 12px">Dear
      Sir or Madam,<BR><BR>Thank you for your interest in ONREA Multiposting,
      the fastest online recruitment system in Central and Eastern Europe.</P></TD>
    <TD bgColor=#f0f0f0 width=20> </TD>
    <TD width=30> </TD></TR>
  <TR>
...

Příklad návrhu formuláře pro posílání HTML emailu

sendHtmlEmail

Dokument s BODY obsahující HTML obsah mailu a obrázky jako přílohy. Tlačítkem Send se spustí následující script.

LotusScript

  Dim ws As New Notesuiworkspace
  Dim uidoc As Notesuidocument
  Dim doc As NotesDocument, mailDoc As NotesDocument
  Dim session As New NotesSession
  Dim maildb As New NotesDatabase( "", "" )
  Dim text As String
  Dim images List As String
  Dim item As NotesItem, html As String
 
  Dim db As NotesDatabase
 
  Set db=session.CurrentDatabase
  Set uidoc=ws.CurrentDocument
  Set doc=uidoc.Document
 
  Call maildb.OpenMail
 
  Set mailDoc=New NotesDocument(db)
  mailDoc.form="Memo"
  Set item = doc.GetFirstItem( "Body" )
 
  ' HTML mail z Body, odkazy na image ve speciálním formátu
  html = item.Values
 
  ' Zobrazí se v případě, kdy není povolen html v mailech
  text="Textová verze"
 
  ' Ziskani obrazku z attachments, ulozeni do tempu a
  ' nachystani jeho seznamu
  Call Prilohy(doc, images)
  Call CreateHtmlMail( mailDoc, text, html, images)
 
  mailDoc.subject=doc.subject
  mailDoc.sendto=doc.sendto
  mailDoc.copyto=doc.copyto
  mailDoc.blindcopyto=doc.blindcopyto
  mailDoc.deliveryreport=doc.deliveryreport
  mailDoc.deliverypriority=doc.deliverypriority
  mailDoc.returnreceipt=doc.returnreceipt
  mailDoc.From = UserName.Canonical
 
  Call mailDoc.send (False)
 
Sub Prilohy(doc As NotesDocument,  images List As String)
  Dim Body As Variant
  Dim embO As NotesEmbeddedObject
  Dim tmpPath As String, fullPath As String
 
  ' Cesta do tempoveho adresare
  tmpPath=Environ("Temp")+"\" ' pouze pro Windows
  Set Body = doc.GetFirstItem( "Body")
 
  If( Isarray( Body.EmbeddedObjects)) Then
    Forall o In Body.EmbeddedObjects
      Set embO = o
      fullPath = tmpPath + o.Name
      ' ExtractFile to disk
      Call o.ExtractFile( fullPath)
      images(o.Name) = fullPath
    End Forall
  End If
End Sub
 
Sub CreateHtmlMail(mailDoc As NotesDocument, text As String, html As String, images List As String)
  Dim session As New NotesSession
  Dim multiRelated As NotesMIMEEntity
  Dim multiAlternative As NotesMIMEEntity
  Dim stream As NotesStream
  Dim header As NotesMimeHeader
 
  session.convertMIME = False
  'Vytvori telo e-mailu
  Set multiRelated = mailDoc.CreateMIMEEntity
 
  'Vytvori zakladni MIME hlavicky
  Set header = multiRelated.CreateHeader({MIME-Version})
  Call header.SetHeaderVal("1.0")
  Set header = multiRelated.CreateHeader("Content-Type")
  Call header.SetHeaderValAndParams({multipart/related;boundary="----=_NextPart_001";type="multipart/alternative"})
 
  'Vytvori cast e-mailu pro obsah
  Set multiAlternative = multiRelated.CreateChildEntity()
  Set header = multiAlternative.CreateHeader("Content-Type")
  Call header.SetHeaderValAndParams({multipart/alternative;boundary="----=_NextPart_002"})
 
  'Vytvori plain-text cast obsah
  Dim textPlain As NotesMimeEntity
  Set textPlain = multiAlternative.CreateChildEntity()
  Set stream = session.CreateStream()
  Call stream.WriteText(text)
  Call textPlain.SetContentFromText(stream, {text/plain;charset="utf-8"}, ENC_NONE)
 
  'Vytvori HTML cast obsah
  Dim textHTML As NotesMimeEntity
  Set textHTML = multiAlternative.CreateChildEntity()
  Set stream = session.CreateStream()
  Call stream.WriteText(html)
 
  Call textHTML.SetContentFromText(stream, {text/html;charset="utf-8"}, ENC_NONE)
 
  'Vytvori prilohy
  Dim attachment As NotesMimeEntity
  Dim contentType As String
 
  Forall image In images
    Set stream = session.CreateStream()
 
    If stream.Open(image) Then
      Set attachment = multiRelated.CreateChildEntity()
 
      Set header = attachment.CreateHeader("Content-Disposition")
      Call header.SetHeaderVal({inline; filename="} + Listtag(image) + {"})
 
      Set header = attachment.CreateHeader("Content-ID")
      Call header.SetHeaderVal({})
 
      Select Case Lcase(Strright(image, ".") )
        Case "gif"
          contentType = "image/gif"
        Case "jpeg", "jpg"
          contentType = "image/jpeg"
        Case Else
          contentType = "application/octet-stream"
      End Select
 
      Call attachment.SetContentFromBytes(stream, contentType, ENC_IDENTITY_BINARY)
    End If
  End Forall
 
  Call stream.close()
End Sub