Problemer med doc.send() fra Notes klienten

Jeg bruger ofte doc.send() til at sende en mail fra Lotus Script. Hvis dette gøres fra klienten og brugeren benytter “Recent Contacts” og “Exhaustively check all address books” så kan der opstå Ambigious names (dupletter med forskellige email adresse).

Hvis der sendes til én modtager og navnet er ambigious – så kommer der en fejl, der kan fanges med ‘On error 4295 goto…’ Hvis der derimod sendes til flere modtagere og blot en af adressene virker – så bliver alle ambigious names ignoreret! Dvs. modtagerne får ingen mail – og afsenderen får ingen fejl.

Dette kan dog løses ved at appende et @domain navn til alle email adresser. Dermed bliver navnet ikke resolvet på klienten, men først på serveren hvor problemet ikke findes.

I stedet for doc.send false så kan vi bruge doc.send false, fixRecipients( doc.sendto )

%REM
                 Due to a bug in Notes, Technote 1153854 and the SPR# EMMS2YMU3J:
                 - https://www-304.ibm.com/support/docview.wss?uid=swg21316108
%END REM
Function fixRecipients( source As Variant ) As Variant
                 Dim session As New NotesSession
                 If session.Isonserver Then GoTo done 'not nessesary on the server (client fix only)
                 Dim i As Integer
                 If Not IsArray( source ) Then source = Split( source, "!#¤%&" )
                 
                 Dim s As String
                 
                 For i = 0 To UBound( source )
                                   s = source( i )
                                   s = session.Createname(s).Abbreviated
                                   If InStr( 1, s, "/DomainName", 5 ) > 0 And InStr( s, "@" ) = 0 Then
                                                    s = s & "@DomainName"
                                                    source( i ) = s
                                   End If
                 Next
                 
done:
                 fixRecipients = source
End Function

Links

Lotus Script observationer

Vær opmærksom på at retur værdier fra funktionskald kan blive recyklet. I nedenstående eksempel returnerer funktionen GetArray et array:

Forall entry in GetArray()
   print entry
End Forall

Men koden virker ikke altid idet retur værdien fra getArray bliver recyklet (og ‘print entry’ vil give en Type Mismatch fejl). Gem i stedet returværdien i en lokal variable:

v = GetArray()
Forall entry in v
    print entry
End Forall

Ligeledes bør funktions parameter altid være variable. F.eks. vil nedenstående eksempel fejle i linirn ‘Print db.title’ med en ‘Object Variable not set’:

Call foo( nothing )
Function foo( db as notesDatabase )
    Set db = Session.currentDatabase
    Print db.title
End Function

Brug i stedet en lokal variable:

Set v = nothing
Call foo( v )

 

 

 

 

Åben mail uden at der indsættes en signatur

Hvis du via Lotus Script opretter en ny mail og åbner den i UI – så bliver brugerens email signatur automatisk indsat. Hvis du ikke ønsker dette, så kan det undgåes med dette lille hack som Kenneth Badensø fandt på :

Call memo.ReplaceItemValue(“$IMTranscript”, “1”)

Dim uidoc As NotesUIDocument

Set uidoc = ws.Editdocument(True, memo)

Call uidoc.Document.removeItem(“$IMTranscript”)

 

RichText håndtering

Med AbstractRichText klassen er det nemt at håndtere richtext felter. Jeg bruger selv klassen til at skrive pænt formateret tekst i body feltet på emails.

Eksempel

 Set mail = db.createDocument
 mail.form = “Memo”
 mail.subject = “Eksempel på mail oprettet med AbstractRichText klassen” 

 Dim body As New AbstractRichText( mail, “body” ) ‘create a New body Field On the mail
 Call body.append( “Hej, \n\nHer er et link til databasen: “ )
 Call body.append( db ) '
 Call body.append( body.getStyle( “bold=True;color=GRAY” ))
 Call body.append( “\n\n\nMed venlig hilsen\n\n” )
 Call body.append( body.getStyle( “bold=False;” ))
 Call body.append( session.commonUsername )
 Call body.update() ‘update before showing In UI 

 Dim ws As New NotesUIWorkspace
 Call ws.Editdocument(True, mail )

Resultatet bliver en mail som vist i figuren:

Med  AbstractRichText.AppendTable kan du med få linjers kode indsætte en tabel (med indhold) i dit body felt – se dette eksempel på hvor du kan lave @Command([CopySelectedAsTable]) i LotusScript

Links