Domino 9 und frühere Versionen > ND6: Entwicklung
Mail aus DB an viele Empfänger senden
koehlerbv:
"Irgendwie klappt das nicht" ist immer eine wenig hilfreiche Nullaussage. Machst Du doch auch sonst nicht ...
Und ja: Natürlich klappt das. Du hast allerdings noch mindestens ein Problem in Deinem Code: Was ist den "profile" (ich weiss zwar, was Du meinst, aber Notes stellt sich hier zu recht stur ;D Und Du kannst darauf erstmal ganz locker verzichten.).
Bernhard
ata:
... der Agent lässt sich nicht so ohne weiteres portieren, denn wenn du dir den Code dort anschaust, wirst du sehen, daß er sich Profildokumente zieht, die es im persönlichen Adressbuch und in deiner Mail-DB gibt, bei dir in deiner selbstgestrickten Datenbank aber nicht - daher meine Frage, ob es sich bei deiner Anwendung um ein privates Adressbuch handelt oder eine selbstgestrickte Anwendung. Ich hatte es vermutet, da du von einem Feld "EMail" gesprochen hast - das gibt es so im Adressbuch nicht...
Wie Bernhard schon gezeigt hat, mit Call dbMail.OpenMail kannst du aus einer initialisierten NotesDatanbank deine Mail-DB öffnen. Maßgeblich ist dein Arbeitsumgebungsdokument. Damit bekommst du das Profildokument "CalendarProfile" zu fassen - jetzt mußt dich um das Profildokument der Adress-Datenbank kümmern, daß dir in deiner Anwendung gar nicht so zur Verfügung steht...
Das ist nach meiner persönlichen Meinung mehr Aufwand den Agenten und dessen Library anzupassen, als den Code direkt zu programmieren...
Du warst doch schon auf einem guten Weg. Mit UnprocessedDocuments erhälst du die markierten Dokumente, aus denen du das Feld "EMail" in eine Array übernimmst und es dann in einem neuen Dokument deiner MAilDB ins Feld "SendTo" schreibst...
So auf die schnelle...
--- Code: ---' # Initialisierungen
Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim vSendTo As Variant
Dim ws As New NotesUIWorkspace
Dim dbMail As New NotesDatabase( "" , "" )
Dim docMail As NotesDocument
Dim sDummy( 0 ) As String
Set dbThis = session.CurrentDatabase
'
Call dbMail.OpenMail
If Not dbMail.IsOpen Then
' # Abbruchbedingung, da die Mail-DB nicht geöffnet werden konnte...
' # ggf. Medlung im Frontend, warum abgebrochen wird...
Exit Sub ' oder Exit Function - je nachdem...
End If
Set dc = dbThis.UnprocessedDocument
If dc.Count = 0 Then
' # Abbruchbedingung, da keine Dokument markiert waren...
' # ggf. Medlung im Frontend, warum abgebrochen wird...
Exit Sub ' oder Exit Function - je nachdem...
End If
vSendTo = sDummy
Set doc = dc.GetFirstDocument
While not doc Is Nothing
' # zusammentragen des Feldes "EMail" in eine Array-Variable
vSendTo = ArrayAppend( vSendTo , doc.EMail )
Set doc = dc.GetNextDocument
Wend
' # Bereinigen des Arrays um leere und doppelte Werte, eventuell in sortierter Reihenfolge
vSendTo = ArraySort( ArrayUnique( FullTrim( vSendTo ) ) )
Set docMail = dbMail.CreateDocument
docMail.Form = "Memo"
docMail.SendTo = vSendTo
' # ... und all die Parameter, die du diesem Dokument geben willst
'...
Call ws.EditDocument( True , docMail ) ' # öffnen der neuen Mail im Frontend...
--- Ende Code ---
... und nach all den manuellen Inhalten dann noch den Senden-Button drücken...
- Zu deinem Code sei noch bemerkt, daß man GetNthDocument() nur dann nimmt, wenn man weiß, daß man genau das 20.000ste Dokument benötigt, ohne die anderen vorher anzuschauen. Je mehr Dokumente du in deiner Collection hälst, um so schlechter die Performance. Bei ein paar Dokumenten fällt das hier nicht besonders ins Gewicht - aber leicht wird daraus eine schlechte Angewohnheit...
- Zur Überprüfung der Collection genügt die Abfrage nach dc.Count = 0, da UnprocessedDocument eine Collection mit Count = 0 zurückgibt, falls keine Dokumente markiert waren...
- beim sammeln der E-Mail-Adressen verwendest du in deiner Schreibweise Arrays, denn du greifst nicht auf den ersten Wert von "EMail" zu, sondern auf das gesamte Feld - das geht so auf jeden Fall schief => type mismatch könnte eine Fehlermeldung an der Stelle sein, da dein Feld vom Typ "Textliste" ist, auch wenn nur ein Wert drin steht. Du erhälst ein mehrdimensionales Array mit Empfängeradressen. Bei meiner Methode spilt es keine Rolle, ob in dem Feld ein oder auch mehrere Adressen enthalten sind. Sollte es eine Rolle spielen, dann musst du eben docMail.EMail(0) verwenden...
- zudem hilft "Option Explicit" um alle Variablen vor deren Benutzung zu deklarieren - das scheint hier zu fehlen
- profile.Owner(0) ist ein Überbleibsel aus dem Agentencode. Gemeint war damit das Profildokument deiner Mail-Datenbank namens "CalendarProfile". Dort steht im Feld "Owner" dein Mailname drin, der hier als Principal verwendet wird. Das Profildokument ist weder deklariert, noch wird es irgendwo initialisiert - zumindest nicht in deinem Codeschnipsel... ;)
Ansonsten könnte das im Rätselraten eine Rolle gespielt haben... :D
Toni
iukhdh:
Hallo Toni,
erstmal vielen Dank für deine Mühe und deine umfangreiche Antwort. (den anderen natürlich auch)
Jetzt hats geklappt und ich denk mal dass ich dank deiner Hinweise auch wieder ein wenig mehr von der Sache verstanden habe.
Es ist halt doch einfach was anderes, wenn man einen Code-Hintergrund auch ein wenig erklärt bekommt, und nicht nur an Beispielen aus der Designer-Hilfe rumprobiert, oder, wie oben, einen Code aus einer anderen DB kopiert und die Hälfte garnicht versteht.
Deshalb mag ich euch alle so ;D
Viele Grüße und ein dreifach kräftiges "HELAU"
Thomas
ata:
... narri narrooh und Allaaf ;D
Toni
Aladdin Sane:
Hallo zusammen,
Ich habe bei mir eine ähnliche Funktion.
Die Mail ist im Frontend geöffnet und es stehen meinetwegen 10 Empfänger drin.
Nun möchte ich die Mail an die 10 Empfänger senden - aber jeder einzelne soll nicht die 10 Adressen zu
sehen bekommen.
Gibt es da eine Option beim versenden?
danke & Gruß
pASCAL
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln