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 ClassDie 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 ClassDie 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 ClassHier 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 ClassWer 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.