VB.NET - Mit Lotus Notes E-Mails versenden

Vor etwas mehr als zwei Jahren (wie die Zeit vergeht :-() habe ich hier einen Artikel namens "VB .NET - Mit Lotus Notes E-Mails und Dateianhängen arbeiten" veröffentlicht, der beschreibt, wie man mit Lotus Notes E-Mails aus der Inbox arbeiten kann.

Heute musste ich nun etwas ähnliches bewerkstellen, und zwar E-Mails über unseren Domino Server versenden. Im Prinzip benötigt man dazu keinen COM-Verweis auf das Domino Mail Objekt, da man (sofern SMTP auf dem Domino Server freigegegeben ist) das ganze auch schön mit .NET Bordmitteln, sprich Net.Mail.MailMessage usw. lösen kann.

Doch wir wollten auch Faxe über Lotus Notes versenden, und dazu benötigt der Domino Server eine Authentifizierung, was man theoretisch über die .NET Credentials lösen könnte. Leider bekam ich beim Faxversenden immer wieder den Fehler, dass die Benutzerrechte nicht korrekt seien.

Laut Rechereche im Internet hat das auch noch keiner hinbekommen, also blieb mir nichts anderes übrig, als wieder auf das Domino COM-Objekt zu verweisen und damit zu arbeiten.

Herausgekommen dabei sind einige Klassen, mit denen man relativ einfach E-Mails und Faxe über den Server verschicken kann.

Zuerst einmal die Helfer-Klassen:

Hier die Anhangs-Klasse für Dateianhänge:

Public Class LotusNotesMailAttachment
 
  Public FullFilename As String
  Public DisplayName As String
 
  Public Sub New()
  End Sub
 
  Public Sub New(ByVal aFullFilename As String)
    Me.FullFilename = aFullFilename
  End Sub
 
  Public Sub New(ByVal aFullFilename As String, ByVal aDisplayName As String)
    Me.FullFilename = aFullFilename
    Me.Displayname = aDisplayName
  End Sub
 
End Class

Die Liste der Anhänge:

Public Class LotusNotesMailAttachmentList
 
  Inherits List(Of LotusNotesMailAttachment)
 
End Class

Die Klase LotusNotesMailData enthält einfach nur Absender, Empfänger, Betreff usw.
Diese Daten werden später an die Factory zum Versenden weitergereicht.

Public Class LotusNotesMailData
 
  Public Subject As String
 
  Private _To As List(Of String)
  Public Property [To]() As List(Of String)
    Get
      If _To Is Nothing Then
        _To = New List(Of String)
      End If
      Return _To
    End Get
    Set(ByVal value As List(Of String))
      _To = value
    End Set
  End Property
 
  Public From As String
 
  Private _CC As List(Of String)
  Public Property CC() As List(Of String)
    Get
      If _CC Is Nothing Then
        _CC = New List(Of String)
      End If
      Return _CC
    End Get
    Set(ByVal value As List(Of String))
      _CC = value
    End Set
  End Property
  Public Body As String
 
  Private _Attachments As LotusNotesMailAttachmentList
  Public Property Attachments() As LotusNotesMailAttachmentList
    Get
      If _Attachments Is Nothing Then
        _Attachments = New LotusNotesMailAttachmentList
      End If
      Return _Attachments
    End Get
    Set(ByVal value As LotusNotesMailAttachmentList)
      _Attachments = value
    End Set
  End Property
 
End Class

Die folgende Klasse "MailAccount" beinhaltet einfach die "Login-Daten" für den Domino-Server und Infos über das Postfach, das zum Senden verwendet werden soll.

Klasse Mailaccount:

Public Class MailAccount
 
  ''' <summary>
  ''' Hostname of the Domino Server
  ''' </summary>
  ''' <remarks></remarks>
  Public Host As String
 
  ''' <summary>
  ''' Filename with Path of the Notes Mail File
  ''' </summary>
  ''' <remarks>e.g. 'mail\user.nsf'</remarks>
  Public DatabaseFilename As String
 
  Public Password As String
 
  Public Sub New()
  End Sub
 
  Public Sub New(ByVal aHost As String, ByVal aDatabaseFilename As String, ByVal aPassword As String)
    Me.Host = aHost
    Me.DatabaseFilename = aDatabaseFilename
    Me.Password = aPassword
  End Sub
 
End Class

Hier nun meine Notes Factory, die das eigentliche Versenden der E-Mails und Faxe bewerkstelligt. Faxe werden dabei wie E-Mails gehandhabt. Bei unserer Fax-Software für Domino (Ferrari-Fax (übrigens sehr zu empfehlen)) wird statt der E-Mail Adresse einfach die Faxnummer mit dem Zusatz "@Fax" angegeben. Die Faxsoftware wandelt daraufhin alle Anhänge in TIFF um und sendet diese als Fax an den/die Empfänger.

Man erhält zudem das versendete Fax in Form einer E-Mail im "Gesendet" Ordner von Lotus Notes.

Public Class LotusNotesMailFactory
 
  Public Shared Function SendMail(ByVal aMailAccount As MailAccount, ByVal aMaildata As LotusNotesMailData) As Boolean
 
    ' Die Session starten
    Dim Session As New Domino.NotesSession
    Session.Initialize(aMailAccount.Password)
 
    ' Datenbank öffnen
    Dim MailDB As Domino.NotesDatabase
    Dim MailServer As String = Session.GetEnvironmentString("MailServer", True)
    MailDB = Session.GetDatabase(MailServer, aMailAccount.DatabaseFilename)
 
    If Not MailDB.IsOpen Then
      MailDB.Open()
    End If
 
    Dim MailDoc As Domino.NotesDocument = MailDB.CreateDocument
    Dim Body As Domino.NotesRichTextItem = MailDoc.CreateRichTextItem("Body")
 
    MailDoc.ReplaceItemValue("Form", "Memo")
 
    For Each toadr As String In aMaildata.To
      MailDoc.ReplaceItemValue("SendTo", toadr)
      'MailDoc.AppendItemValue("SendTo", aMaildata.To)
    Next
 
    MailDoc.ReplaceItemValue("Subject", aMaildata.Subject)
    'MailDoc.AppendItemValue("Subject", aMaildata.Subject)

    ' CC (Carbon Copy)
    For Each ccadr As String In aMaildata.CC
      MailDoc.AppendItemValue("CopyTo", ccadr)
    Next
 
    ' Create and set the Body content
    Body.AppendText(String.Empty)
    Body.AppendText(aMaildata.Body)
 
    ' Attachment
    For Each lnma As LotusNotesMailAttachment In aMaildata.Attachments
      Body.AddNewLine(2)
      Body.EmbedObject(1454, String.Empty, lnma.FullFilename, lnma.DisplayName)
    Next
 
    ' Example to save the message (optional)
    MailDoc.SaveMessageOnSend = True
 
    ' Send the document
    ' Gets the mail to appear in the Sent items folder
    MailDoc.ReplaceItemValue("PostedDate", Now)
    MailDoc.Send(False)
 
    ' Clean Up
    MailDB = Nothing
    MailDoc = Nothing
    Body = Nothing
    Session = Nothing
 
    Return True
 
  End Function
 
End Class

Wer Verbesserungen hat, oder gar weiß, wie man über die .NET Bordmittel das ganze bewerkstellingen kann, ist herzlich eingeladen, zu kommentieren.

Sollte ich dazukommen, werde ich das ganze noch etwas besser dokumentieren, aufräumen und verbessern.


2 Antworten zu VB.NET - Mit Lotus Notes E-Mails versenden

  1. 4049 Volker 07.11.2012 15:05

    Hallo,
    erst einmal vielen Dank für den Super Code.

    Prinzipiell funktioniert auch alles.
    Nur, was muss ich denn tun, um eine Mail als HTML formatierte Mail, also mit den ganzen Tags usw., zu versenden?

    Ich hab zwar schon mal den Body als 'Domino.NotesMIMEEntity'-Typ deklariert und auch ein Stream-Object (Domino.NotesStream) mit hinzgefügt, jedoch kann VB.NET den Typ String nicht in einen NotesMIMEEntity-Typ konvertieren.

    Könntest du mir da evtl. helfen?

    Viele Grüße,
    Volker

  2. 4050 dahead 07.13.2012 1:47

    Hallo Volker,

    also da muss ich wohl passen, da ich das noch nicht probiert habe.
    Ich würde ehrlich gesagt auch möglichst davon abraten, falls es nicht unbedingt sein muss, da Notes bzw. E-Mails allgemein mit HTML-Code Probleme verursachen können. Plain-Text sieht zwar nicht so hübsch aus, aber funktioniert dafür immer.

    Hier gibt es einige Infos wie es evtl. dennoch geht:
    http://stackoverflow.com/questions/368587/sending-html-emails-that-renders-correctly-in-notes-7
    http://atnotes.de/index.php?topic=51529.0

    Da ich gerade auch kein Notes zur Hand habe (nicht auf Arbeit), kann ich das leider auch nicht selber testen, aber hast du einfach mal probiert, den Mailbody mit HTML-Tags zu schmücken?

    Achso: fast vergessen, via .NET MailMessage kannst du mit den Views ganz gut HTML-Mails zusammenstellen, die dann auch ordentlich versendet werden (also mit den .NET Bordmitteln, als SMTP Server geht dann natürlich auch der Domino Server, die Mail landet dann aber nicht automatisch in einem User Postfach (außer man nimmt ein CC oder BCC dafür)).

    Gruß
    dh

    PS: Danke für deinen Kommentar, freut mich, dass dir der Eintrag hilfreich war.

Antwort hinterlassen

Notice: Indirect modification of overloaded property FormUI::$cf_commenter has no effect in user/themes/k2_dh/theme.php line 128
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 128
Notice: Indirect modification of overloaded property FormUI::$cf_commenter has no effect in user/themes/k2_dh/theme.php line 129
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 129
Notice: Indirect modification of overloaded property FormUI::$cf_email has no effect in user/themes/k2_dh/theme.php line 130
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 130
Notice: Indirect modification of overloaded property FormUI::$cf_email has no effect in user/themes/k2_dh/theme.php line 131
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 131
Notice: Indirect modification of overloaded property FormUI::$cf_url has no effect in user/themes/k2_dh/theme.php line 132
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 132
Notice: Indirect modification of overloaded property FormUI::$cf_url has no effect in user/themes/k2_dh/theme.php line 133
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 133
Notice: Indirect modification of overloaded property FormUI::$cf_content has no effect in user/themes/k2_dh/theme.php line 134
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 134
Notice: Indirect modification of overloaded property FormUI::$cf_submit has no effect in user/themes/k2_dh/theme.php line 135
Strict Notice: Creating default object from empty value in user/themes/k2_dh/theme.php line 135
You do not have permission to comment on this site.