• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

RegEx Mailfilter-Regel via Automator?

stk

Grünapfel
Registriert
05.01.04
Beiträge
7.141
Moin,

ich würde gerne etwas mehr mit meinem eMails machen und diese anhand von bestimmten Inhalten weiterverarbeiten. Nun bietet Mail selbst zwar keine regulären Ausdrücke an, aber via Automator könnte ich auf die entsprechenden Funktionen zurückgreifen, die mir BBEdit oder die Shell (perl) bietet.

Allerdings stelle ich mich einmal mehr beim Einsatz von Automator meters dappig an :oops:. So etwa soll's werden:
automator_regex_mail.jpg


Also: alle Mails ausfiltern, die als tägliche Statusmail von meiner Fritz!Box kommen. Darin die Zeile identifizieren, die mit »2« anfangen (das sind die verpassten Anrufe) und das Ergebnis per Growl ausgeben (oder als ToDo-Liste in iCal eintragen, neue Mail draus generieren, Dialogfenster auf den Schirm knallen, … egal was - Hauptsache ich krieg's mit ;))

Wie auf dem Screenshot zu sehen ist, tue ich mich schon schwer das Ergebnis des RegEx weiterzuverarbeiten. Wie wird das übergeben? Und funktioniert das dann auch als Aufruf via »AppleScript ausführen« in den Mailfilterregeln?

Gruß Stefan
 

space

Neuer Berner Rosenapfel
Registriert
02.12.05
Beiträge
1.949
Wie auf dem Screenshot zu sehen ist, tue ich mich schon schwer das Ergebnis des RegEx weiterzuverarbeiten.

Hi Stefan!
Ich bezweifle, dass BBEdit überhaupt erst ein Ergebniss erhält. Dazu müsstest Du nämlich den Text der Email übergeben. Also die Aktion
• E-Mails kombinieren
der Aktion Extract Lines voranstellen.

Wie auf dem Screenshot zu sehen ist, tue ich mich schon schwer das Ergebnis des RegEx weiterzuverarbeiten. Wie wird das übergeben?

Ja, aber die Growl-Aktion kann damit nichts anfangen.
Also ist die Idee, dir eine Email mit der extrahierten Zeile als Inhalt zu schicken, schon besser.
Dazu müsstest Du aber wohl TextEdit bemühen, sprich die Aktion
• Inhalt des TextEdit Dokuments festlegen
der Aktion Extract Lines anhängen und dann • Neue E-Mail und • E-Mail senden

Und funktioniert das dann auch als Aufruf via »AppleScript ausführen« in den Mailfilterregeln?
Naja, Du müsstest den Automator Workflow mit AppleScript ausführen lassen. Am einfachsten ist es, den Workflow als App zu speichern und ein AS zu erstellen a la
tell app "XY" to open
…Nur in dieser Form ist das --mit Verlaub-- irgendwie unsinnig. Diese Mail-Regel würde immer wieder alle vorhandenen PushService-Emails abfragen und nicht nur die aktuelle.

Du merkst schon, das ist nicht der optimale Weg, den Du da gehst… aber es ist machbar :)
Besser wäre ein passendes Script zu schreiben. Eventuell schreibt da ja noch jemand etwas dazu.

Gruss
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Wie wäre es statt einer Automator-Lösung mit einer Regel in Mail.app der folgenden Bauart?

bild1ui6.png


Bei "Skriptname" ein AppleScript, so ähnlich wie folgendes, einfügen:

Code:
on perform mail action with messages selectedMessages for rule theRule
  tell application "Mail"
    repeat with thisMessage in selectedMessages
      set thisContent to content of thisMessage
      set filteredContent to do shell script "echo " &
        quoted form of thisContent &
        "|grep '^2\b'"
      
      (* hier jetzt den Inhalt von filteredContent weiterverarbeiten *)

    end repeat
  end tell
end perform mail action
 

space

Neuer Berner Rosenapfel
Registriert
02.12.05
Beiträge
1.949
Und?Wie sieht jetzt deine Lösung aus?
Lass uns teilhaben!
Und ausserdem … keine Rückmeldung … jetzt auch von dir???

Na dann Prost!
 

stk

Grünapfel
Registriert
05.01.04
Beiträge
7.141
Moin,

sorry, hatte noch ein paar andere Sachen auf dem Schreibtisch und so ganz auf Anhieb lief's halt nicht. Blöde, wenn einem dann die Zeit zum Nachfummeln fehlt o_O.

Also aktueller Stand: Im Prinzip ist's schon fast das, was ich haben wollte. Allerdings fliegt mir das »quoted form of thisContent« um die Ohren, weil natürlich blöderweise im Text von thisContent Anführungszeichen stecken o_O. Ebenso muß ich noch eine Fehlerbehandlung einbauen, was passiert, wenn mal ein verpasster Anruf dabei ist.

Da der Aufruf auch nicht von Anfang an funktionierte (da mußte noch »using terms from application "Mail"« an den Anfang und natürlich der passende Schliesser dazu) bin ich noch etwas auf die Suche gegangen um bei macosxhints.com das hier zu finden:

http://www.macosxhints.com/article.php?story=2008012419354669

Zum einen steckt da die Growl-Benachrichtigung drin und - sehr nett auch - ein Nachschlagen im Adressbuch um das passende Bild - hier des Mailschreibers, entsprechend dann des Anrufers, wenn man die Telefonnummer nachblätteren läßt - mit in die Nachricht einzublenden.

Ein weiterer Fehler wurde geworfen als ich versuchte noch den nachfolgenden Blank von der führenden »2« der Zeile in den RegEx reinzunehmen. Das »\b« wollte AS partout nicht verarbeiten. Ich denke aber, nach allem, was ich bisher an Statusmails gesehen habe, dass ich das Blank ebenso gut weglassen kann. »^2« sollte als Suchbegriff erstmal ausreichend sein.

Last but not least muß ich für diese Benachrichtigung noch mein Standard-Growl-Theme »MusicVideo« abändern und besser die Bubbles sticky machen, sonst geht die Benachrichtigung den Bach runter wenn die des nächtens (die FritzBox sendet immer um Mitternacht) auf den Bildschirm geschmissen werden. Viel zu tun also noch :oops:.

So sieht das Ganze im Moment aus:

Code:
using terms from application "Mail"
	on perform mail action with messages newMessages for rule theRule
		repeat with newMessage in newMessages
			set thisContent to content of thisMessage
			set filteredContent to do shell script "echo " & quoted form of thisContent & " | grep '^2'"
			
			(* hier jetzt den Inhalt von filteredContent weiterverarbeiten *)
			display dialog "Verpaßte Anrufe von:
		" & filteredContent buttons {"OK"} default button 1
		end repeat
	end perform mail action with messages
end using terms from

Ergibt dann beispielsweise eine Meldung wie im Anhang. Auch da ist noch etwas Feinschliff dran zu betreiben, so daß eben nur die Rufnummer überbliebt und wie oben schon erwähnt ggf. das Bildchen dazu kommt… Aber erstmal muß ich das Ding mit den Anführungszeichen im Ausgangstext gelöst bekommen o_O.

Gruß Stefan
 

Anhänge

  • Screenshot 28.jpg
    Screenshot 28.jpg
    14,7 KB · Aufrufe: 111

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Stimmt, das "using terms from" gehört dazu. Kommt davon, wenn man seine Tipps nicht austestet. :innocent:
Allerdings fliegt mir das »quoted form of thisContent« um die Ohren, weil natürlich blöderweise im Text von thisContent Anführungszeichen stecken o_O.
Was kommt denn da für eine Fehlermeldung bei Dir? Nach Apple soll man beim Übergeben von Anführungszeichen enthaltendem Text an die Shell auf jeden Fall "quoted form of" benutzen. Oder gibt es Probleme mit dem durch die Shell zurückgegebenen Text?
 

stk

Grünapfel
Registriert
05.01.04
Beiträge
7.141
Moin,

nope - ich hab gar keine Rückgabe. Ich hab den kompletten Text der eMail einfach mal hart in die Variable eingesetzt und hatte dann schon beim direkten Aufruf einen Syntax-Fehler zurückgemeldet bekommen, weil der Inhalt der Variable ja quasi am ersten Anführungszeichen im Mailtext endet und danach für AS sinnloser Kram dranhängt. So schaut der betreffende Abschnitt aus:

Code:
Anrufliste
----------
In der Anrufliste werden alle Telefonate erfasst, die mit FRITZ!Box am 18.03.2008 geführt wurden. Bitte beachten Sie: Diese Anrufliste kann von der exakten Abrechnung Ihrer Telefonieanbieter abweichen.
           "1" eingehende Anrufe    "2" eingehende Anrufe in Abwesenheit    "3" ausgehende Anrufe

3 18.03.08 16:28    Name , Rufnummer xxxxx, Nebenstelle FON S0, Eigene Rufnummer xxxxx, Dauer (hh:mm) 0:07
3 18.03.08 15:00    Name , Rufnummer xxxxx, Nebenstelle FON S0, Eigene Rufnummer xxxxx, Dauer (hh:mm) 0:02
…

Die Erklärungszeile sorgt für den Prassel. Und die erste Rufnummer in der Zeile ist eigentlich das was ich brauche. Müßte in RegEx also so etwas sein:

Code:
^2.*?Rufnummer\b(.*?),.*?\r

korrekt? Den Inhalt der Klammer - \1 - wäre dann mein Rufnummerergebnis, welche ich als Suche ans Adressbuch übergeben könnte, resp. anzeigen lasse. »Name« ist ein Wert der aus dem Telefonbuch der FritzBox käme, da sich das aber noch nicht komfortabel (Import von .csv, .ldif, .vcd-Dateien) pflegen läßt ist der Eintrag i.d.R. immer generisch.

Die zweite Rufnummer könnte man dann ggf. noch auswerten um anzugeben, wen der Anrufer denn zu erreichen wünschte, aber das ist eigentlich eher wurscht.

Gruß Stefan
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Man könnte die 5 Erklärungszeilen bei Bedarf auch einfach ignorieren lassen, indem man die Ausgabe im Shell-Befehl vor dem grep erst durch ein
Code:
sed '1,5d'
durch-pipe-t.

Edit: Die erste Rufnummer könnte man in der Shell mit
Code:
sed 's/\(.*\)Rufnummer //;s/,\(.*\)//'
herausschnippeln. Dann müsstest Du insgesamt ein
Code:
grep '^2' | sed 's/\(.*\)Rufnummer //;s/,\(.*\)//'
verwenden. Da führen wahrscheinlich viele Wege zum Ziel.
 
Zuletzt bearbeitet:

space

Neuer Berner Rosenapfel
Registriert
02.12.05
Beiträge
1.949
Allerdings fliegt mir das »quoted form of thisContent« um die Ohren, weil natürlich blöderweise im Text von thisContent Anführungszeichen stecken o_O.

Die "" im Text müssen ja maskiert werden.
Da hier ja eh schon regex benutzt wird, ist das wohl damit auch am einfachsten zu lösen -- wenn man es denn kann-- Theoretisch wäre mir das klar, auch dank des Exkurses von Skeeve hier. Praktisch stehe ich da aber auf wackligen Beinen.
Naja, es geht auch mit "reinem" AppleScript.
Das ist jetzt ungetestet, sollte aber gehen:

Code:
using terms from application "Mail"
	on perform mail action with messages newMessages for rule theRule
		repeat with newMessage in newMessages
			set thisContent to content of thisMessage
			
			set srchList to {"\""}
			set replList to {"\""}
			
			set replList to every text item of replList
			set AppleScript's text item delimiters to srchList
			set the temp to every text item of thisContent
			set AppleScript's text item delimiters to replList
			set thisContent to temp as string
			
			set filteredContent to do shell script "echo " & quoted form of thisContent & " | grep '^2'"
			
			(* hier jetzt den Inhalt von filteredContent weiterverarbeiten *)
			display dialog "Verpaßte Anrufe von:
		" & filteredContent buttons {"OK"} default button 1
			set AppleScript's text item delimiters to ""
		end repeat
	end perform mail action with messages
end using terms from

Die Grundlagen meines Scripteinschubes stammen übrigens von dieser (genialen) Site: Klick

Gruss
 
Zuletzt bearbeitet:

space

Neuer Berner Rosenapfel
Registriert
02.12.05
Beiträge
1.949
Und um Growl ins Spiel zu bringen:
Wenn Du das Example Script von der verlinkten Site ausführst, werden ja zwei "Notifications" registriert (Test Notification, Another Test Notification)
Die verwendeten Namen in dem Skript kann man ja ändern … aber um es nicht zu verwirrend zu machen, habe ich die vorgeschlagenen mal übernommen.

In deinem Script könntest Du dann die Zeilen

Code:
display dialog "Verpaßte Anrufe von:
		" & filteredContent buttons {"OK"} default button 1

ersetzen durch
Code:
tell application "GrowlHelperApp"
	notify with name "Test Notification" title "Verpasste Anrufe" icon of application "Mail" description filteredContent application name "Growl AppleScript Sample" sticky "Yes"
end tell

Grüsse
Space