Wenn der Hamster eine Mail von einem Mailclient bekommt und er diese Mail nicht einem lokalen Benutzer zustellen kann, legt er sie im Verzeichnis Hamster\Mails\Mail.Out ab, wo sie dann auf die Versendung wartet. Um diese Mail zu versenden, gibt es 3 Möglichkeiten:
Die einfachste Form dieses Skriptes wäre:
#!hs2 HamSendMailAuth( <server>, ... ) quit
Allerdings empfiehlt es sich, den Ablauf mit Events zu steuern, ein Beispiel dazu steht weiter unten. Wenn der Hamster die Onlineverbindung selbst aufbauen muss,ist das oben angegebene Beispiel nicht verwendbar. In dem Fall ist auch eine Eventsteuerung notwendig, auch dazu gibt es weiter unten ein Beispiel.
Wenn man nicht die Möglichkeit hat, die Mails per SMTP-Auth zu verschicken, sondern nur ein SMTP-after-POP3-Postfach hat, muss man das Postfach vorher erst freischalten:
#!hs2 HamFetchMail HamWaitIdle( 10000 ) HamSendMail( <server>, ... ) quit
Wenn man alleiniger Benutzer des Hamsters ist, mag das obige noch akzeptabel sein. In einem Netzwerk mit mehreren Benutzern könnte das bei größerem Mailaufkommen aber dazu führen, dass der POP3-Server in zu kurzen Intervallen abgefragt wird, womit man sich beim Provider nicht beliebt macht. In dem Fall sollte man auf die Lösung zurückgreifen, die in Selbständiges regelmäßiges Holen und Versenden von News und Mails beschrieben ist.
Hat man nun das Skript, muss man nur noch dafür sorgen, dass es im richtigen Moment aufgerufen wird. Mit dem Hamster geht das sehr komfortabel über den Menü-Dialog Einstellungen → Automatische Abläufe → Aktionen. Unter Wähle Aktion wählt man E-Mails → Verarbeitung → ausgehender E-Mails aus. In dem rechten Teil des Fensters trägt man nun im Feld Starte (hs2-)Skript dieses Skript ein und markiert die Option Auf das Ende des Skripts warten.
Jetzt versendet der Hamster rausgehende Mails sofort. Etwas wichtiges muss man aber noch beachten: Sollte der Versand einer Mail aus irgendeinem Grund nicht funktionieren (z. B. der Mailserver antwortet nicht) wird der nächste Sendeversuch erst unternommen, wenn der Hamster die nächste Mail bekommt, die er rausschicken soll. Wenn der Hamster auf einem Server läuft und ein Benutzer noch schnell eine letzte Mail für diesen Tag abschickt, könnte sie aus den oben angegebenen Gründen erst einmal liegen bleiben. Da man sowieso noch ein Skript benötigt, welches regelmäßig Mails abholt, wäre es ratsam, dass dieses Skript auch regelmäßig prüft, ob noch Mails zum Versenden vorliegen. Damit nicht beide Skripte gleichzeitig versuchen, Mails zu versenden, sollte man Events einsetzen, siehe den FAQ-Beitrag Hamster und Events und die unten stehenden Beispiele.
Für Newsartikel muss man natürlich entsprechende Skriptbefehle verwenden:
#!hs2 HamNewsJobsClear HamNewsJobsPostDef HamNewsJobsStart quit
Um das Skript für den Newsversand aufzurufen, muss man es unter Artikel/Postings → Verarbeitung → ausgehender Artikel eintragen. Hierbei gelten auch die gleichen Anmerkungen wie zum Versenden von Mails.
Eventsteuerung (ohne Verbindungsaufbau durch den Hamster)
Die Eventsteuerung funktioniert in diesem Fall so, dass zwei Skripte, eines zum Versenden (Event_Versenden.hsc) und eines zum Abholen (Event_Abholen.hsc) von Mails, ständig laufen und darauf warten, dass ein Event durch andere Skripte ausgelöst wird.
Das Skript Event_Trigger.hsc sorgt dafür, dass der Event zum Holen von Mails ausgelöst wird, sobald eine Mail zum Versenden bereit liegt, dazu muss dieses Skript im Menü Einstellungen → Automatische Abläufe → Aktionen unter E-Mails → Verarbeitung → ausgehender E-Mails eingetragen werden.
Das Skript Event_Scheduler.hsc läuft auch ständig im Hintergrund und prüft zum einen regelmäßig, ob Mails, die zum Versand anstehen, liegen geblieben sind und zum anderen sorgt es dafür, dass regelmäßig Mails abgeholt werden.
Wenn man die Skripte startet, müssen zuerst Event_Versenden.hsc und Event_Abholen.hsc gestartet werden und erst dann Event_Scheduler.hsc. Um den Startvorgang zu automatisieren, kann man auch das Startskript Event_Start.hsc verwenden. Wenn man dieses Skript im Menü Einstellungen → Automatische Abläufe → Aktionen unter Hamster → Start im Feld Starte (hs2-)Skript einträgt, werden die Skripte automatisch beim Hamsterstart gestartet.
Beenden sollte man die Skripte nicht durch den Menüeintrag Skript → Alle Skripte beenden, sondern mittels des Skriptes Event_Beenden.hsc. Dieses Skript sorgt dafür, dass die Skripte Event_Versenden.hsc und Event_Abholen.hsc innerhalb einer Minute beendet werden. Das Skript Event_Scheduler.hsc beendet sich selbst, wenn es merkt, dass die zwei letztgenannten Skripte nicht mehr aktiv sind.
Falls man die Skripte doch über Skript → Alle Skripte beenden beendet, muss der Hamster neu gestartet werden, bevor man die Skripte wieder verwenden kann.
#--- Event_Start.hsc ---
#!hs2
runscript( HamHscPath + "Event_Versenden.hsc", "", false )
runscript( HamHscPath + "Event_Abholen.hsc", "", false )
sleep( 2000 )
runscript( HamHscPath + "Event_Scheduler.hsc", "", false )
quit
#-----------------------
#--- Event_Versenden.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventVersenden, "Versenden"+$ScriptIdent )
varset( $EventBeendenVersenden, "BeendenVersenden"+$ScriptIdent )
varset( $Handle_EventVersenden, 0 )
varset( $Handle_EventBeendenVersenden, 0 )
varset( $EventFehlercode, 0 )
$Handle_EventVersenden = EventCreate( $EventVersenden, 1, 0 )
$Handle_EventBeendenVersenden = EventCreate( $EventBeendenVersenden, 1, 0 )
do
$EventFehlercode = EventMultipleWait( 60000, $Handle_EventVersenden, $Handle_EventBeendenVersenden )
if( $EventFehlercode = 1 )
HamSendMailAuth( ... )
endif
if( $EventFehlercode = 2 )
beenden
endif
loop
sub beenden
EventClose( $Handle_EventVersenden )
EventClose( $Handle_EventBeendenVersenden )
quit
endsub
#---------------------------
#--- Event_Abholen.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventAbholen, "Abholen"+$ScriptIdent )
varset( $EventBeendenAbholen, "BeendenAbholen"+$ScriptIdent )
varset( $Handle_EventAbholen, 0 )
varset( $Handle_EventBeendenAbholen, 0 )
varset( $EventFehlercode, 0 )
$Handle_EventAbholen = EventCreate( $EventAbholen, 1, 0 )
$Handle_EventBeendenAbholen = EventCreate($EventBeendenAbholen, 1, 0 )
do
$EventFehlercode = EventMultipleWait( 60000, $Handle_EventAbholen, $Handle_EventBeendenAbholen )
if( $EventFehlercode = 1 )
HamFetchMail( ... )
endif
if( $EventFehlercode = 2 )
beenden
endif
loop
sub beenden
EventClose( $Handle_EventAbholen )
EventClose( $Handle_EventBeendenAbholen )
quit
endsub
#-------------------------
#--- Event_Scheduler.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventVersenden, "Versenden"+$ScriptIdent )
varset( $EventAbholen, "Abholen"+$ScriptIdent )
AtAdd( versendenundholen, "00:00", "24:00", "1111111", 15, true )
AtExecute
quit
sub versendenundholen
if( HamGetStatus( 3, 7 ) > 0 )
if( EventSet( $EventVersenden ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet, Mails werden nicht versendet, Scheduler wird beendet.", 5 )
return(1)
endif
endif
if( EventSet( $EventAbholen ) = -1 )
addlog( "Das Abholskript ist nicht gestartet, Mails werden nicht geholt, Scheduler wird beendet.", 5 )
return(1)
endif
endsub
#---------------------------
#--- Event_Trigger.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventVersenden, "Versenden"+$ScriptIdent )
if( EventSet( $EventVersenden ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet, Mails werden nicht versendet.", 5 )
else
addlog( "Event zum Versenden wird ausgelöst.",4 )
endif
quit
#-------------------------
#--- Event_Beenden.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventBeendenVersenden, "BeendenVersenden"+$ScriptIdent )
varset( $EventBeendenAbholen, "BeendenAbholen"+$ScriptIdent )
if( EventSet( $EventBeendenVersenden ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet.", 5 )
else
addlog( "Das Versendeskript wird innerhalb der nächsten 60 Sekunden beendet.",4 )
endif
if( EventSet( $EventBeendenAbholen ) = -1 )
addlog( "Das Abholskript ist nicht gestartet.", 5 )
else
addlog( "Das Abholskript wird innerhalb der nächsten 60 Sekunden beendet.",4 )
endif
quit
#-------------------------
Eventsteuerung (mit Verbindungsaufbau durch den Hamster)
Wenn der Hamster die Onlineverbindung selbst aufbauen soll, dann ist ein zeitgesteuerter Mailaustausch zu bevorzugen, wie es im FAQ-Beitrag Selbständiges regelmäßiges Holen und Versenden von News und Mails beschrieben ist. Wer trotzdem ein eventgesteuertes Skript zum sofortigen Versenden einsetzen möchte, kann folgende Skripte verwenden (es gelten die gleichen Anmerkungen wie bei den Skripten ohne Verbindungsaufbau durch den Hamster):
#--- Event_Start.hsc ---
#!hs2
runscript( HamHscPath + "Event_Versenden_und_holen.hsc", "", false )
sleep( 2000 )
runscript( HamHscPath + "Event_Scheduler.hsc", "", false )
quit
#-----------------------
#--- Event_Versenden_und_holen.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventVersenden, "Versenden"+$ScriptIdent )
varset( $EventAbholen, "Abholen"+$ScriptIdent )
varset( $EventBeenden, "Beenden"+$ScriptIdent )
varset( $Handle_EventVersenden, 0 )
varset( $Handle_EventAbholen, 0 )
varset( $Handle_EventBeenden, 0 )
varset( $EventFehlercode, 0 )
varset( $eingewaehlt, 0 )
varset( $try, 0 )
$Handle_EventVersenden = EventCreate( $EventVersenden, 0, 0 )
$Handle_EventAbholen = EventCreate( $EventAbholen, 0, 0 )
$Handle_EventBeenden = EventCreate( $EventBeenden, 0, 0 )
do
$EventFehlercode = EventWait( $EventVersenden, 60000 )
if( $EventFehlercode = 258 )
if( EventWait( $EventBeenden, 100 ) = 0)
addlog( "Skript soll beendet werden.",4 )
beenden
endif
if( EventWait( $EventAbholen, 100 ) = 0)
if( Verbindungsaufbau != 1)
EventReset( $EventAbholen )
HamFetchMail(...)
if( EventWait( $EventVersenden, 100 ) = 258)
Verbindungsabbau
endif
endif
endif
else
if( Verbindungsaufbau != 1)
while( EventWait( $EventVersenden, 1 ) = 0 )
EventReset( $EventVersenden )
HamSendMailAuth( ... )
if( EventWait( $EventAbholen, 100 ) = 0)
EventReset( $EventAbholen )
HamFetchMail( ... )
endif
endwhile
Verbindungsabbau
else
EventReset( $EventVersenden )
endif
endif
loop
sub Verbindungsaufbau
$try = 1
if( !RasIsConnected )
$eingewaehlt = 1
while( HamRasDial( ... ) != 0 )
if( $try >= 3 )
$eingewaehlt = 0
warning( "Einwahl fehlgeschlagen." )
return(1)
endif
inc( $try )
sleep( 10000 )
endwhile
endif
return(0)
endsub
sub Verbindungsabbau
if( $eingewaehlt = 1 )
HamRasHangup
$eingewaehlt = 0
endif
endsub
sub beenden
EventReset( $EventBeenden )
EventClose( $Handle_EventVersenden )
EventClose( $Handle_EventAbholen )
EventClose( $Handle_EventBeenden )
quit
endsub
#-------------------------------------
#--- Event_Scheduler.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventVersenden, "Versenden"+$ScriptIdent )
varset( $EventAbholen, "Abholen"+$ScriptIdent )
AtAdd( versendenundholen, "00:00", "24:00", "1111111", 15, true )
AtExecute
quit
sub versendenundholen
if( HamGetStatus( 3, 7 ) > 0 )
if( EventSet( $EventVersenden ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet, Mails werden nicht versendet, Scheduler wird beendet.", 5 )
return(1)
else
addlog( "Event zum Versenden wird ausgelöst.",4 )
endif
endif
if( EventSet( $EventAbholen ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet, Mails werden nicht geholt, Scheduler wird beendet.", 5 )
return(1)
else
addlog( "Event zum Holen wird ausgelöst.",4 )
endif
endsub
#---------------------------
#--- Event_Trigger.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventVersenden, "Versenden"+$ScriptIdent )
if( EventSet( $EventVersenden ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet, Mails werden nicht versendet.", 5 )
else
addlog( "Event zum Versenden wird ausgelöst.",4 )
endif
quit
#-------------------------
#--- Event_Beenden.hsc ---
#!hs2
varset( $ScriptIdent, GetProcessIdentifier+"FAQActionScript" )
varset( $EventBeenden, "Beenden"+$ScriptIdent )
if( EventSet( $EventBeenden ) = -1 )
addlog( "Das Versendeskript ist nicht gestartet.", 5 )
else
addlog( "Das Versendeskript wird innerhalb der nächsten 60 Sekunden beendet.",4 )
endif
quit
#-------------------------