Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Freche Frage: AppleScript, das alle ausgewählten Mails einzeln als 'reine Datei' in einen Ordner speichert?

Freche Frage: AppleScript, das alle ausgewählten Mails einzeln als 'reine Datei' in einen Ordner speichert?

fadenschein18.04.1309:35
Hallo,
zugegeben eine freche Frage. Ich könnte mich ja auch in AppleScript einarbeiten, aber das würde bestimmt einige Wochen dauern. Vielleicht hat ja jemand zufällig einen Link oder hat sich selbst was gebastelt.

Ziel:
Man wählt beliebig viele Mails im Mailprogramm aus.
Das Script speichert jede Mail einzeln als 'reine Datei' in einen bestimmten Ordner.

Auch Zwischentipps, z.B. wie man Applescript sagt, dass es eine Auswahl von Mails abarbeiten soll sind willkommen.

Danke
Fadenschein
0

Kommentare

Duck Dodgers18.04.1309:44
Dafür braucht es kein AppleScript ... Mail kann das von sich aus
0
fadenschein18.04.1310:42
@Duck Dodgers

Wirklich? Weißt Du auch wie es geht?
Freilich kann ich eine Mail nach der anderen markieren und dann 'Sichern unter' wählen.
Das ist aber mühsam und zeitaufwendig.

Ich möchte mehrere Mails gleichzeitig markieren und das Script (oder Mail) soll dann jede Mail separat als 'reine Datei' in einen Ordner speichern.

Fadenschein
0
mactelge
mactelge18.04.1312:31
fadenschein

...warte ab - gleich meldet sich "mäuschen" mit der perfekten Lösung!
„Dreh´dich um – bleib´wie du bist – dann hast du Rückenwind im Gesicht!“
0
Duck Dodgers18.04.1312:48
fadenschein
@Duck Dodgers

Wirklich? Weißt Du auch wie es geht?
Freilich kann ich eine Mail nach der anderen markieren und dann 'Sichern unter' wählen.
Das ist aber mühsam und zeitaufwendig.
Ahh du hast recht. Ich habe das noch nie mit mehreren probiert
0
_mäuschen
_mäuschen18.04.1313:00
tell application "Finder" to set ptd to (path to desktop folder) as string
tell application "Mail"
set theMessages to selection
repeat with theMessage in theMessages
set theText to content of theMessage
set theFile to ptd & "Message Number " & (theMessage's id as string)
set theFileID to open for access file theFile with write permission
write theText to theFileID
close access theFileID
end repeat
end tell
http://macscripter.net/viewtopic.php?id=17655
0
_mäuschen
_mäuschen18.04.1314:15
set theFile to ptd & "Message Number " & (theMessage's id as string)
Ändern zu
set theFile to ptd & "Message Number " & (theMessage's id as string) & ".txt"

Damit die Datei nicht mit AS-Editor sondern mit TextEdit geöffnet wird!
0
fadenschein18.04.1316:39
Ich hab' den Text in den AppleScript Editor kopiert, und dann in das Verzeichnis für Mail AppleScripts in der Library gespeichert.

Soweit so gut. Das Script taucht im AppleScript Menü von Mail auf und ich kann es aufrufen, nachdem ich ein paar Mails markiert habe.

Es passiert lange nichts (gefühlte 3 Minuten). Mail wirkt, als sei es eingefroren.
Dann erscheinen tatsächlich 2 neue Dateien auf dem Desktop. Sie haben allerdings eine Größe von 0 Byte und es ist nix drin.

Was ich mir wünschen würde wäre: die Mails werden genau in der gleichen Weise gespeichert, wie wenn ich den Befehl "Sichern unter" und die Option "reine Datei" (.eml) aufrufe. Nur eben automatisiert und für mehrere ausgewählte Mails.


Noch eine Idee?

Fadenschein
0
jsh18.04.1316:45
Was spricht dagegen die Mails zu markieren und mit der Mouse auf den Desktop zu ziehen?
0
fadenschein18.04.1316:53
@jsh
Bei mir geht das nur mit einer einzelnen Mail.
Wenn ich mehrere 'drag+drop'en will, hüpfen die wie am Gummiband zurück.
0
_mäuschen
_mäuschen18.04.1317:17
Für
save as .eml
siehe
http://superuser.com/questions/484551/creating-save-as-functionality-to-eml-file-in-applescript
0
fadenschein18.04.1318:07
Ah, danke _mäuschen. So werde ich's probieren.
Interessant zu sehen, dass es nicht direkt lösbar ist via Applescript, also dass 'Save as' nicht einfach angesprochen werden kann.

Fadenschein
0
_mäuschen
_mäuschen19.04.1314:10
Und

Funktioniert es nun?
0
fadenschein20.04.1309:45
Ja danke der Nachfrage, funktioniert gut. Einziger Nachteil: es fragt nicht nach, ob eine Datei im Zielverzeichnis schon vorhanden ist, sondern überschreibt sie ungefragt.
Mir wäre es lieber, das Script würde fragen und auf Wunsch 'beide behalten', z.B. indem es eine -1 an den Dateinamen anhängt.

Ein AppleScript Profi könnte das sicher leicht implementieren. Aber vorerst freue ich mich über das Script so wie es ist.

Fadenschein
0
_mäuschen
_mäuschen20.04.1312:55
Ich habe nun obigen script leicht verändert.

Er speichert jetzt .eml
und ersetzt allfällige : im Betreff/Dateinamen.

Da ja messages ID im Dateinamen enthalten ist,
kann ein "Überschreiben" eigentlich nicht möglich sein.

Falls ein Namenskonflkt berücksichtigt werden soll/muss resolve_conflicts(this_item, originals_folder, "") by
tutorial http://www.macinchem.org/applescript/tutorial1.php
als Denkanstoss
set ptd to (path to desktop folder) as string
tell application "Mail"
set theMessages to selection
repeat with theMessage in theMessages
set theText to source of theMessage
set theSubject to (subject of theMessage) as string
if theSubject contains ":" then ¬
set theSubject to do shell script "echo " & theSubject & " | sed -e 's/:/_/g'"
set theFile to (ptd & ¬
"RMS " & (theMessage's id as string) & ¬
" " & theSubject) & ".eml"
set theFileID to open for access file theFile with write permission
write theText to theFileID
close access theFileID
end repeat
end tell
0
fadenschein21.04.1309:24
Hey danke. Dann probier' ich auch mal ein paar Gehversuche...
0
fadenschein01.05.1313:48
Mein Fehler?
Am liebsten wäre es mir, der Dateiname bestünde nur aus dem Betreff der Mail und .eml.
Da ich das Applescript Beispiel mit der Subroutine zum Auflösen von Konflikten aber nicht durchschaut habe, dachte ich mir, ich lasse die ID als Workaround erst mal im Dateinamen und stelle nur die Reihenfolge um. Erst der Betreff und dann die ID.

Außerdem wollte ich die Funktion "Such Dir einen Ordner aus" implementieren, bin aber schändlich gescheitert:

tell application "Mail"
set theMessages to selection
if length of theMessages is not 0 then
set ptd to (POSIX path of (choose folder with prompt "Ordner wählen..." without invisibles)) as rich text
repeat with theMessage in theMessages
set theText to source of theMessage
set theSubject to (subject of theMessage) as string
if theSubject contains ":" then ¬
set theSubject to do shell script "echo " & theSubject & " | sed -e 's/:/_/g'"
set theFile to (ptd & ¬
theSubject & " RMS " & (theMessage's id as string)) & ".eml"
set theFileID to open for access file theFile with write permission
write theText to theFileID
close access theFileID
end repeat
end if
beep 1
display dialog "Es wurden " & length of theMessages & " Nachrichten exportiert."

end tell



Irgendwie ist das Format bei meiner Pfadermittlung etwas anderes als bei "set ptd to (path to desktop folder) as string"

Habt Ihr einen Tipp wie ich es hinbekomme?
0
Lyhoo
Lyhoo02.05.1312:07
set ptd to (POSIX path of (choose folder with prompt "Ordner wählen..." without invisibles)) as rich text ändern:
set ptd to (choose folder with prompt "Ordner wählen..." without invisibles) as rich text

Das Trennzeichen des Verzeichnisbaumes ist im Mac OS der Doppelpunkt.
Z.B.: Mac HD:Users:ich:Desktop:Ein Ordner:EineDatei.html
Im Posix path wird ein Schrägstrich verwendet.
Z.B.: Mac HD/Users/ich/Desktop/Ein Ordner/EineDatei.html

② Aus set theFile to (ptd & ¬
theSubject & " RMS " & (theMessage's id as string)) & ".eml"
wird
set theFile to ptd & theSubject & ".eml"

Einfach das Überflüssige weglassen.
Beachte: Es kann hier zu Namenskonflikten kommen.
0
_mäuschen
_mäuschen05.05.1313:43
global theFile

set ptd to choose folder

tell application "Mail"
set theMessages to selection
repeat with theMessage in theMessages
set theText to source of theMessage
set theSubject to (subject of theMessage) -- as string
if theSubject contains ":" then ¬
set theSubject to my snr(theSubject, ":", "_")
set theFile to ((ptd & theSubject) & ".eml") as string
my resolveConflict(ptd, theSubject)
set theFileID to open for access file theFile with write permission
write theText to theFileID
close access theFileID
end repeat
end tell

on resolveConflict(ptd, theSubject)
tell application "Finder"
set theCounter to 1
set noConflict to false
repeat until noConflict
if exists file (theFile) then
set theFile to (((ptd & theSubject) & " -" & theCounter as string) & ".eml")
set theCounter to theCounter + 1
else
set noConflict to true
end if
end repeat
end tell
end resolveConflict

on snr(theString, searchString, replaceString)
tell (a reference to my text item delimiters)
set {oldTID, contents} to {contents, searchString}
set {theString, contents} to {theString's text items, replaceString}
set {theString, contents} to {theString as Unicode text, oldTID}
end tell
return theString
end snr
0
_mäuschen
_mäuschen05.05.1313:45
Kann ergeben:
0
fadenschein05.05.1314:19
Wow, toll, danke für Eure Hilfe. Wirklich erstklassig.
0
_mäuschen
_mäuschen05.05.1314:25
ev. noch dies einbauen
if theSubject is "" then set theSubject to "kein betreff"
0
fadenschein12.05.1317:37
Toll, danke funktioniert alles bestens.
Jetzt hatte ich doch noch den Ehrgeiz, das Datum in den Dateinamen zu integrieren.
Dafür habe ich aus einer der Beispiele diese Zeilen implementiert und dann das umformatierte msgDate im Dateinamen angefügt.

Das funktioniert zwar, aber...
- ich verstehe nicht, was die Subroutine pad2 bewirkt
- ich würde bei der Jahreszahl gerne die ersten zwei Ziffern wegformatieren, so dass msgDate dann z.B. 130512 ergibt und nicht 20130512

Könnt Ihr mir da nochmal auf die Sprünge helfen?

----------

set msgDate to date received of theMessage
-- parse date SEMversion below using proc pad2()
set {year:y, month:m, day:d, hours:h, minutes:min} to (msgDate)
set msgDate to ("" & y & my pad2(m as integer) & my pad2(d))

on pad2(n)
return text -2 thru -1 of ("00" & n)
end pad2

--------------
0
_mäuschen
_mäuschen12.05.1318:28
pad2 stellt den Tagen und Monaten 1-9 eine 0 voran
ergo 1 01

global theFile

set ptd to choose folder

tell application "Mail"
set theMessages to selection
repeat with theMessage in theMessages
set theText to source of theMessage
set theSubject to (subject of theMessage)
if theSubject is "" then set theSubject to ":kein:betreff:"
if theSubject contains ":" then ¬
set theSubject to my snr(theSubject, ":", "_")
if theSubject contains "/" then ¬
set theSubject to my snr(theSubject, "/", "_")
set msgDate to date received of theMessage
set {year:y, month:m, day:d, hours:h, minutes:min} to (msgDate)
set y to characters 3 through 4 of (y as string)
set msgDate to (y & my pad2(m as integer) & my pad2(d))
set theFile to ((ptd & msgDate & space & theSubject) & ".eml") as string
my resolveConflict(ptd, msgDate, theSubject)
set theFileID to open for access file theFile with write permission
write theText to theFileID
close access theFileID
end repeat
end tell

on pad2(n)
return text -2 thru -1 of ("00" & n)
end pad2

on resolveConflict(ptd, msgDate, theSubject)
tell application "Finder"
set theCounter to 1
set noConflict to false
repeat until noConflict
if exists file (theFile) then
set theFile to ((ptd & msgDate & space & theSubject & " -" & theCounter as string) & ".eml")
set theCounter to theCounter + 1
else
set noConflict to true
end if
end repeat
end tell
end resolveConflict

on snr(theString, searchString, replaceString)
tell (a reference to my text item delimiters)
set {oldTID, contents} to {contents, searchString}
set {theString, contents} to {theString's text items, replaceString}
set {theString, contents} to {theString as Unicode text, oldTID}
end tell
return theString
end snr
0
fadenschein12.05.1320:20
Faszinierend. Ich habe die Syntax zwar bei weitem noch nicht durchschaut, aber man lernt dazu und es ist erstaunlich, was man mit AppleScript anstellen kann, wenn man sich damit auskennt.

Abermals Dank!
0
fadenschein12.05.1321:48
Eine kleine Verständnisfrage:
Ich habe noch ein bisschen weitergebastelt aber prompt einen Bug erzeugt.

Das Script meldet beim Abarbeiten der Sub-Routine resolveConflict:
error "Die Variable „this_projekt“ ist nicht definiert." number -2753 from "this_projekt"

Das für mich Seltsame ist: im Hauptteil wird this_projekt auch schon verwendet und da beschwert sich das Skript nicht.

Ist es vielleicht so, dass AppleScript sich nicht ohne weiteres Variablen merken kann, wenn es zwischendrin in Subroutinen wechselt? Muss ich die Variable irgendwie "global definieren"?
0
_mäuschen
_mäuschen12.05.1322:25
Lokale und Globale Variablen

https://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/conceptual/ASLR_variables.html
0
fadenschein15.05.1312:07
@_mäuschen

Ich komme nicht drauf, obwohl ich es ein Stündchen probiert habe...

Das Script erzeugt bei mir selbst dann zwei Dateien, wenn ich nur eine einzige Mail gewählt habe.
Selbst dann, wenn in dem Verzeichnis, in das ich exportiere noch überaupt nichts drin ist.
Das heisst, es meint immer einen conflict zu erkennen und erzeugt von jeder Mail eine mit und eine ohne Seriennummer (-1). Ich glaube, ich habe es richtig rüberkopiert und wende es auch richtig an.
Aber ich kann keinen Bug im Script erkennen (wobei ich natürlich auch blutiger Anfänger bin).

Kannst Du mir nochmal helfen?
Danke
Fadenschein
0
_mäuschen
_mäuschen15.05.1312:37
Der script 12.05.13 18:28

erzeugt bei mir nur 1 (eine) .eml Datei

Erst ein zweiter Durchlauf mit derselben selektierten e-mail
erzeugt mir eine xx -1.eml
ein dritter Durchlauf eine xx -2.eml
0
_mäuschen
_mäuschen15.05.1312:45
Poste mir deinen script als PM (private Mitteilung)
0
_mäuschen
_mäuschen15.05.1315:37
events

hier siehst Du welche e-mails selektiert sind/wurden
0
_mäuschen
_mäuschen16.05.1313:15
double

u Eingang
i account 1
o account 2
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.