Domino 9 und frühere Versionen > ND8: Entwicklung

Mailversand über Agent und Script Library klappt nicht

(1/3) > >>

ThomasHB:
Hallo Zusammen,

wenn ich eine Mail über einen Agenten versenden will, dann klappt das bei mir irgendwie nicht richtig...
Das der eigentliche Code zum versenden funktionierrt konnte ich schon über das PostSave Event eines Forms gegen testen...

Also ich hab den Code zum versenden in einer Script Library stehen...

Der Agent geht dann hin und macht folgendes:

In den Options steht:


--- Code: ---Option Public
Option Declare
Use "MailSend"
--- Ende Code ---

Use MailSend ruft demnach wenn ich hier nicht falsch liege die Scribt Library auf.

Im Initialize steht folgendes:


--- Code: --- Dim s As New NotesSession
Dim agent As NotesAgent
Dim doc As NotesDocument

Set agent = s.CurrentAgent
Set doc = db.Getdocumentbyid(agent.Parameterdocid)

Call NewCallMailSend(doc)
--- Ende Code ---

Aus dem Form heraus wird das Dokument an den Agenten übergeben...


--- Code: --- Dim agent As NotesAgent
Set agent = db.GetAgent("(SendMailCall)")

If Not (agent Is Nothing) Then
If Not agent.Run(Source.Document.NoteID) = 0 Then
Messagebox "Agent did not run",48, "Failure"
End If
Else
Messagebox "Agent not found.",48,"Failure"
End If
--- Ende Code ---

Und scheinbar läuft der Agent auch, denn keine Fehlermeldung geht auf.

Und die Library hat dann folgendes:


--- Code: ---Sub NewCallMailSend(doc As NotesDocument)
Dim s As New NotesSession
Set db = s.Currentdatabase
Set firstdoc = doc

Set Maildoc = New NotesDocument(db)
Set Body = New NotesRichTextItem(Maildoc, "Body")
Maildoc.SendTo = firstdoc.Getitemvalue("SendTo")
Maildoc.Subject = "Neuer Info wurde erzeugt"
Maildoc.Form = "Memo"
Call Body.Appendtext("Hallo " & firstdoc.Getitemvalue("n_call_creator")(0) & ",")
Call Body.Addnewline(2)
Call Body.Appendtext("Ihre Information wurde in der Datenbank aufgenommen und an das Info Team weitergeleitet.")
Call Body.Addnewline(3)
Call Body.Appendtext("Link zu Ihrem Informationsdokument: ")
Call Body.Appenddoclink(firstdoc, "Information")
Call Maildoc.Send(False)
Call firstdoc.Replaceitemvalue("n_MailStatus", 1)
Call firstdoc.Save(0,0)
End Sub
--- Ende Code ---

Da des Debugging hier unheimlich schwer ist und nicht ausschließen kann, das mir durchaus noch Know How fehlt trotz der Schulungen der letzten Zeit möchte ich gerne mal hier nachfragen...

Was mach ich denn falsch?

Im PostSave wird die Mail prima versendet.  :)

LG,
Thomas

Driri:
Warum machst Du das überhaupt über einen Agenten ? Du kannst doch direkt die Scriptfunktion aus der Library aufrufen, wenn Du sie in der Maske mit Use eingebunden hast.

Oder wie wird der Agent gestartet ?

Du prüftst im Agenten auch nicht ab, ob das Dokument überhaupt existiert. Das würde ich auf jeden Fall noch mit einbauen.

In der Sub NewCallMailSend fehlt mind. eine Deklaration für das Objekt "Body". Das ist mindestens unsauber. Man sollte sich auf jeden Fall angewöhnen, jedes Objekt auch zu deklararieren. Andernfalls sind die Objekte dann vom Typ Variant.

Außerdem würde ich empfehlen, generell mit Option Declare zu arbeiten. Dann wird man auf solche Dinge schon direkt beim Speichern hingewiesen.


Ich kann jetzt so auch nur vermuten, daß zum Zeitpunkt des Agentenaufrufes das NotesDocument (doc) noch nicht existiert und der Agent deswegen die Grätsche macht. Im PostSave hingegen wurde das Dokument ja bereits gespeichert und existiert.


Schwer ist das Debugging an der Stelle aber auch nicht ;-)

ThomasHB:

--- Zitat ---Schwer ist das Debugging an der Stelle aber auch nicht ;-)
--- Ende Zitat ---

Da kommt so ein bisschen dann fehlendes Know-How durch. Ist zwar blöd aber ich kann es auch nur durch probieren, machen und Schulungen versuchen auszugleichen.  ;)

Mir ist nicht klar, wie ich das ganze debuggen soll...


--- Zitat ---Ich kann jetzt so auch nur vermuten, daß zum Zeitpunkt des Agentenaufrufes das NotesDocument (doc) noch nicht existiert und der Agent deswegen die Grätsche macht. Im PostSave hingegen wurde das Dokument ja bereits gespeichert und existiert.
--- Ende Zitat ---

Der Agent wird ja im PostSave aufgerufen... Also müsste das Dokument da auch schon existieren.

Das Item Body wird in den Declarations definiert:


--- Code: --- Dim db As NotesDatabase
Dim firstdoc As NotesDocument
Dim Maildoc As NotesDocument
Dim Body As NotesRichTextItem
--- Ende Code ---

Peter Klett:
Wie auch Driri schon geschrieben hat, ist mir das ganze viel zu kompliziert.

Ersetze das gepostete PostOpen durch


--- Code: ---Call NewCallMailSend(Source.Document)

--- Ende Code ---

Mehr brauchst Du nicht. Dann kommst Du auch definitiv mit dem Debugger ran, ein Agent.Run wird m.E. nicht (immer) debuggt.

Den Agent kannst Du dann in die Wüste schicken ...

Andrew Harder:
Wenn Du einen Grund für einen Agenten hast, dann würde ich auf jeden Fall

--- Code: ---Set notesDocument = notesSession.DocumentContext
--- Ende Code ---
nutzen.

Wenn es keinen Grund hierfür gibt, dann natürlich so wie oben gesagt direkt in der ScriptLib.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln