Hook für IMAP Komandos

Status
Für weitere Antworten geschlossen.

nalemi1207

Benutzer
Mitglied seit
28. Jan 2010
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Hallo Leute,
nach dem ich dieses Forum nun schon von oben nach unten und zurück gelesen habe und nichts gefunden habe hier mein Problem:

Ich nutze die mailstation als lokalen mail storage, soll heisen ich hole meine pop3 konten via cron und getmail auf die diskstation und stelle sie lokal per IMAP zur Verfügung. Der Weg dahin war lang und steinig aber dank der vielen Forenbeiträge und des Wikis am Ende doch kein Problem. Was jetzt noch bleibt ist, dass ich meinen cron job nicht unbedingt minütlich ausführen will (hoch lebe die Vodafon-Fair-Flat für umts).

Sprich ich suche nach einer Möglichkeit getmail jedesmal auszuführen wenn ich im Mailclient (Thunderbird) auf Abrufen klicke, bzw. wenn das dort eingestellte Updateintervall dran ist. Was ich bis jetzt versucht habe ist der Weg über mail_executable und ein custom script welches for dem eigentlichen aufruf von imap noch getmail aufruft. das hilft aber nur wenn ich meinen client erstmals starte weil die IMAP prozesse dann gestartet werden. Dummerweise (glueklicheweise: performance) bleiben die dann aber am leben solange mein client offen ist. sprich mein script kommt nicht noch mal dran.

Seht ihr da irgend eine möglichkeit sich irgendwie in die direkten IMAP comands wie 'LIST' oder 'LSUB' reinzuhängen???


Danke im vorhinein.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich glaube das wird nicht klappen ohne dass du die Source von Dovecot anpassen würdest. Dazu würde ich mal eine Dovecot Mailingliste befragen.
Ansonsten bliebe dir z.B. noch die Option die externen Emailadressen auf eine Emailadresse deiner DS weiterzuleiten. Dann siehst du die Emails ohne getmail sofort. Oder du stellst den cron auf 10 min ein und lebst damit, dass eine Email maximal 10 min "zu spät" in der inbox ist.

Gruss

tobi
 

nalemi1207

Benutzer
Mitglied seit
28. Jan 2010
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Schade,
mails direkt zur DS geht leider nicht, da Vodafon bei UMTS Verbindung alle Ports vernagelt hat, deswegen auch meine Bemerkung bzgl. FAIR-Flat. Was mir noch einfällt wäre händisches pollen im Minutentakt so lange ein IMAP prozess läuft, aber das klingt irgendwie nach stückwerk und ausserdem lerne ich linux gerade erst kennen, von daher wäre diese lösung durchaus anspruchsvoll für mich. Ein frage wäre da zum beispiel ob ich da einen zweiten cron process mit anderer konfiguration zum laufen kriegen kann, oder ob die sich gegenseitig ausschliessen.

gruß
micha
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ein frage wäre da zum beispiel ob ich da einen zweiten cron process mit anderer konfiguration zum laufen kriegen kann, oder ob die sich gegenseitig ausschliessen.

gruß
micha
Ich würde in diesem Fall ein Shell Script schreiben, das getmail aufruft. Durch das Shellscript kannst du bestimmte Bedingungen prüfen (z.B. IMAP Verbindungen) und dann entsprechend reagieren. Das Shellscript rufst du jede Minute auf (mit cron): Wenn keine IMAP Verbindung dann beendet sich das Script gleich wieder. Wenn eine Verbindung steht wird hingegen getmail ausgeführt.
So was in der Art:
Code:
#!/opt/bin/bash

s=`ps | grep imap | grep -v "imap-login" | grep -v "grep imap"`
if [ "$s" != '' ]; then
 #getmail ausführen 
else
 echo "Kein angemeldeter User"
fi
exit
Gruss

tobi
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Mal noch ein bisschen gebastelt
Code:
#!/opt/bin/bash

if [ -e /tmp/checkmail ]; then
 echo "Code rennt bereits"
 exit
fi
if [ "$*" = "force" ]; then
 # getmail einmalig ausführen 
 # z.B. für cronjob auch wenn kein Client verbunden ist
fi

i=0
touch /tmp/checkmail
while true; do
 s=`ps | grep imap | grep -v "imap-login" | grep -v "grep imap"`
 if [ "$s" != '' ]; then
  #ein Client ist via IMAP verbunden
  echo "getmail ausführen"
  sleep 1
 else
  #kein Client via IMAP verbunden
  if [ $i -lt 10 ]; then
   echo "Kein angemeldeter User"
   i=`expr $i + 1`
   sleep 5
  else
   echo "Abbruch nach $i Läufen"
   rm /tmp/checkmail
   exit
  fi
 fi
done
Gute Nacht

tobi
 
Zuletzt bearbeitet:

nalemi1207

Benutzer
Mitglied seit
28. Jan 2010
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Hi Tobi,

an so was hatte ich auch schon gedacht, die Lösung hätte mich aber bestimmt ne gewisse Zeit gekostet. Ich werd das nächste Woche mal probieren. Das WE gehört der Familie.

Danke
Micha
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Hallo genauso etwas suche ich auch, das wäre meine idealvorstellung.

@nalemi1207 Hat das bei dir geklappt?

@jahlives Ich hab mal wieder ne Frage an dich. Hoffe mal du bist noch nicht genervt von mir.

Ich würde das gerne auch so machen, kann ich dafür einfach dein script nehmen?
Was für eine Datei muß ich dann erstellen?
Wo ist das Verzeichnis in das ich die Datei ablegen muß? Ist das dann in /opt/var/cron/crontabs? Ersetzte ich die User datei durch das script?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@Hawk
Klar kannst du mein Script verwenden (ich verlange keine Lizentgebühren ;)). Musst es einfach so anpassen wie du es brauchst.
Du erstellst eine x-beliebige Datei an einem x-beliebigen Ort, kopierst den Inhalt rein, passt ihn an deine Gegebenheiten an und speicherst das Ganze. Unter /optvar/cron/crontabs legst du eine Datei an, die genau gleich heisst wie der User der den Job ausführt (z.B. hawk). Dort drin legst du dann den Cronjob an, der die Datei regelmässig aufruft. Wichtig ist, dass du die sleep Aufrufe entsprechend anpasst. Sonst wird getmail jede Sekunde aufgerufen, wenn ein Client vebunden ist und das gibt dann eine hässliche Race-Condition
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Und da gehen bei mir die Schwierigkeiten schon los.
Was heißt anpassen? Wo in diesem Script muß ich es anpassen? Was muß ich wie anpassen? Ich hab echt keine Ahnung.

In crontabs hab ich schon eine Datei mit meinem Benutzer. Diese ruft eigentlich alle 180 Minuten die Mails vom Server ab. Ist die Frage ob 180 Minuten überhaupt geht?

Wo finde ich die sleep Aufrufe?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Und da gehen bei mir die Schwierigkeiten schon los.
Was heißt anpassen? Wo in diesem Script muß ich es anpassen? Was muß ich wie anpassen? Ich hab echt keine Ahnung.

In crontabs hab ich schon eine Datei mit meinem Benutzer. Diese ruft eigentlich alle 180 Minuten die Mails vom Server ab. Ist die Frage ob 180 Minuten überhaupt geht?

Wo finde ich die sleep Aufrufe?
Anpassen heisst: Mein obiger Code macht nichts weiter als zwei echo Ausgaben. Du musst also statt dem echo getmail dort den Code einfügen, der dein getmail aufruft (z.B. den Aufruf wie du ihn in deiner cron Datei hast). Danach kommt ein sleep Aufruf. Die Zahl dahinter gibt die Zeit in Sekunden an wie lange gewartet werden soll. Diesen Wert würde ich auf 60 oder 120 setzen.
Beim echo kein angemeldeter User ist ebenfalls ein sleep drin (5 Sekunden). Dort kannst du einstellen wie lange gewartet wird ehe das Script wieder prüft ob ein imap Client angemeldet ist. Der Zähler 10 (in der Bedingung) legt fest wievielmal probiert wird ob ein Client angemeldet ist. Diesen Wert kannst du ändern wenn du mehr oder weniger Versuche willst bei dir.
Du kannst den Code ja mal 1:1 in eine Datei kopieren (z.B. hawk.sh). Dann rufst du das Script mal auf und schaust dir die Ausgabe an (sh /path/to/hawk.sh). Solange du nicht via imap angemeldet bist, sollte die Ausgabe kein User alle 5 Sekunden erscheinen. Melde dich dann mal via imap an und schau ob die Ausgabe umschaltet
 

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
13
Punkte
84
Es geht auch einfacher. In der dovecot.conf kann man die ausführbare Datei für einen IMAP-Login selbst bestimmen, das Verfahren nennt sich PostLoginScripting
Man benötigt nur ein kleines Script um den getmail Prozess anzustossen und anschließend ruft man die ursprüngliche imap-login auf. Es gehen auch andere Dinge wie Alerts, Groupchecking, out of order, etc., Beispiele gibts auf der oben genannten Seite.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Es geht auch einfacher. In der dovecot.conf kann man die ausführbare Datei für einen IMAP-Login selbst bestimmen, das Verfahren nennt sich PostLoginScripting
Man benötigt nur ein kleines Script um den getmail Prozess anzustossen und anschließend ruft man die ursprüngliche imap-login auf. Es gehen auch andere Dinge wie Alerts, Groupchecking, out of order, etc., Beispiele gibts auf der oben genannten Seite.
Zu geil diese Lösung. Perfekt. :)
Weisst du ob der dovecot mit dem Abschluss des Logins wartet bis das Script durch ist oder auch weitermacht wenn das Script in einer Endlosschleife läuft?
Das habe ich aus der Seite jetzt nicht klar rauslesen können
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Welchen Code von der verlinkten Seite muß ich denn anweden, damit ich beim Starten von Outlook eine Abfrage hinbekomme, die sich bis um Schließen jede Minute wiederholt?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Welchen Code von der verlinkten Seite muß ich denn anweden, damit ich beim Starten von Outlook eine Abfrage hinbekomme, die sich bis um Schließen jede Minute wiederholt?
Keinen der Codes der Seite! Du müsstest immer noch das Script aus diesem Thread anpassen und verwenden. Du kannst einfach in der dovecot.conf festlegen welches Script ausgeführt werden soll.
Wie gesagt ist mir selber noch nicht klar ob das überhaupt wie gewünscht klappen kann. Denn es könnte sein, dass Dovecot auf den Abschluss des Scripts wartet, ehe auf die Mailboxen zugegriffen wird. Dann würdest du beim Login "hängenbleiben", solange wie das Script läuft.
Ein anderer Weg wäre es das Script weiterhin selbständig auszuführen. Beim Dovecot Login könntest du eine Datei anlegen lassen, bei deren Vorhandensein das Script deine Emails abruft.
Allerdings weiss ich ned, ob Dovecot eine Möglichkeit bietet auch beim Logout resp Abbau der IMAP Verbindung mit einem Script zu reagieren. Sonst könnte es sein, dass diese Datei immer vorhanden ist und damit der oder zum Abholen der Mails auch läuft wenn kein Client mehr verbunden ist
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Ok danke, dann werde ich mal dein Script ausprobieren. Werde mal berichten wie es läuft, oder wie alles zusammenbricht ;-)
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Rich (BBCode):
#!/opt/bin/bash

if [ -e /tmp/checkmail ]; then
 echo "Code rennt bereits"
 exit
fi
if [ "$*" = "force" ]; then
 # getmail einmalig ausführen 
 # z.B. für cronjob auch wenn kein Client verbunden ist
fi

i=0
touch /tmp/checkmail
while true; do
 s=`ps | grep imap | grep -v "imap-login" | grep -v "grep imap"`
 if [ "$s" != '' ]; then
  #ein Client ist via IMAP verbunden
  echo 0 */3 * * * sh /volume1/homes/User/getmail.sh &>/dev/null
  sleep 60
 else
  #kein Client via IMAP verbunden
  if [ $i -lt 10 ]; then
   echo "Kein angemeldeter User"
   i=`expr $i + 1`
   sleep 5
  else
   echo "Abbruch nach $i Läufen"
   rm /tmp/checkmail
   exit
  fi
 fi
done

Wäre dieser Code richtig und ich könnte Ihn in eine Datei eingeben mit meinem benutzer? Oder was muß ich noch einfügen?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Du brauchst kein echo und keine Angaben zum Cronjob in einem Shellscript. Also einfach dort wo das getmail ausgeführt werden soll
Code:
[FONT=monospace]
[/FONT]sh /volume1/homes/User/getmail.sh &>/dev/null
Wichtig: Dieses Script muss als User ausgeführt werden, für den die Emails auch bestimmt sind (z.B. hawk). Versuche nicht das Script als root auszuführen oder getmail kann die Emails nicht in die Mailboxen zustellen
 

Hawk999

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
273
Punkte für Reaktionen
0
Punkte
16
Könntest du mir mal den Code hiereinschreiben, wie ich ihn schreiben müsste. Bin gerad ein wenig damit überfordert.

Was kann ich aus deinem Script löschen, was muss ich einfügen?
Du wärst mir ne große Hilfe.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Könntest du mir mal den Code hiereinschreiben, wie ich ihn schreiben müsste. Bin gerad ein wenig damit überfordert.

Was kann ich aus deinem Script löschen, was muss ich einfügen?
Du wärst mir ne große Hilfe.
Code:
#!/opt/bin/bash

if [ -e /tmp/checkmail ]; then
 echo "Code rennt bereits"
 exit
fi
if [ "$*" = "force" ]; then
  sh /volume1/homes/User/getmail.sh >/dev/null
fi

i=0
touch /tmp/checkmail
while true; do
 s=`ps | grep imap | grep -v "imap-login" | grep -v "grep imap"`
 if [ "$s" != '' ]; then
  #ein Client ist via IMAP verbunden
  sh /volume1/homes/User/getmail.sh >/dev/null
  sleep 60
 else
  #kein Client via IMAP verbunden
  if [ $i -lt 10 ]; then
   i=`expr $i + 1`
   sleep 5
  else
   rm /tmp/checkmail
   exit
  fi
 fi
done
so müsste es imho ausschauen
 

QTip

Super-Moderator
Teammitglied
Mitglied seit
04. Sep 2008
Beiträge
2.341
Punkte für Reaktionen
13
Punkte
84
so, habe ein wenig gebastelt und getestet, hier das Ergebnis:
  • Das Script was beim Login aufgerufen wird, verhält sich wie ein normales Shellscript, es wird sequentiell abgearbeitet.
  • Im Aufzurufenden Script absolute Pfade benutzen, da das Environment von dovecot Masterprozess benutzt wird.
  • Script wird mit Rootrechten aufgerufen (kann mit dem Schalter mail_drop_priv_before_exec=yes umgehen.
Mein Script für den Aufruf beim Login (z.B. in /usr/syno/mailstation/etc):
Rich (BBCode):
#!/bin/sh
/var/services/homes/<user>/getmail_login.sh &       # Aufruf vom getmail Script und ab in den Hintergrund damit
/usr/syno/mailstation/libexec/dovecot/imap $*   # imap starten
Im Mein getmail-script:
Rich (BBCode):
#!/bin/sh
# get mails @ imap-login
#
if [ -f /tmp/checkmail ]; then
    STARTTIME=`cat /tmp/checkmail`
    ENDTIME=$(date +%s)
    DIFF=$(( $ENDTIME - $STARTTIME ))
    if [ $DIFF -lt 910 ]; then                  #15,1 minutes = 910 seconds
        exit
    fi
fi
date +%s > /tmp/checkmail

cd /var/services/homes/<user>/.getmail
su <user> -c "/opt/bin/getmail -g ~/.getmail <getmail.rc>"
für <user> den verwendeten User einsetzen, für <getmail.rc> Name der getmail.rc Datei einsetzen.

Nun noch in /usr/syno/mailstation/etc/dovecot.conf den Eintrag mail_executable = <Pfad zum neuen Loginscript> anpassen.

Ich habe im getmail-Script eine Zeitüberprüfung eingebaut. Dies verhindert erstens ein mehrfaches gleichzeitiges Aufrufen vom getmail-Script und zweitens das vorzeitige Abholen bei Free-Providern (meist min. 15 Minuten Abholintervall). Die Zeit kann natürlich angepasst werden ;)
Der Schutz vor mehrfachem Aufruf deshalb, weil mehrere IMAP-Prozesse gestartet werden und dadurch jedesmal das obige Loginscript aufgerufen werden würde und somit natürlich das getmail-Script. Bei mir funktioniert es bestens.
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat