ToDo: Kontrolle

FAQ - Sofortiges Versenden Von E-Mails

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:

  1. Man versendet sie manuell entweder über das Menü „Online“ oder über ein Skript.
  2. Ein Skript, das regelmäßig nachschaut, ob Mails zum Versenden vorliegen und diese dann versendet. Ein Beispiel eines solchen Skriptes findet man in der FAQ unter „Selbständiges regelmäßiges Holen und Versenden von News und Mails“.
  3. Man versendet die Mail sofort, nachdem sie vom Hamster in „Mail.Out“ abgelegt wurde. Dazu muss man zum einen ein Skript haben, das die Mail versendet, zum anderen muss man den Hamster so konfigurieren, dass das Skript aufgerufen wird, sobald eine Mail in „Mail.Out“ abgelegt wurde.

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
#-------------------------