Mail Anhänge speichern mit Apple Script

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
Hallo zusammen

Ich versuche mich momentan mit einem Skript, dass Mail Anhang eines bestimmten Postfachs automatisch in einen bestimmten Ordner speichert.

Habe einige Lösungen im Netz gefunden, aber nichts funktioniert.
Jetzt hoffe ich, dass wir gemeinsam was finden können :)
Code:
using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		set theOutputFolder to "Users:andrefritsche:desktop:anhang"
		tell application "Mail"
			set theMessage to item 1 of theMessages
			set theAttchments to every attachment of content of theMessage
			repeat with a from 1 to length of theAttachments
				set theAttachment to item a of theAttachments
				try
					set theAttachmentName to "test.001"
					set theSavePath to theOutputFolder & theAttachmentName
					save theAttachment in theSavePath
					
				end try
			end repeat
		end tell
		
	end perform mail action with messages
end using terms from
Den Code hab ich mir mal aus dem Netz gefiltert, allerdings verstehe ich ihn auch nicht wirklich
Wäre super wenn mir das mal jemand erklären kann.
Hatte mir auch mal durch ziehen der Mail.app datei auf den Apple Skript Editor die freigegebenen Sachen angeschaut, aber damit kann ich nicht umgehen und ich finde kein Erklärung wie ich das zu nutzen habe.

Das Skript hab ich gespeichert und dann eine Regel erstellt für einen bestimmten empfänger und dann als schritt 2 das Sskript angewählt.


Gruß
Andre
 

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
Hi,

mit dem Code-Snipped hatte ich auch so meine Probleme.
Zu welchem Teil genau hast du denn genau eine frage? Hab es aber damit auch nicht hinbekommen, und das als IT-ler :) Bei deinem hatte ich auch immer Probleme mit "save attachment" und er is mir irgendwie ausgestiegen...

Hab mit ein wenig suchen beim versuch deinen zu reparieren folgenden, funktionsfähigen gefunden:
Code:
using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			repeat with oneMessage in theMessages
				set {mail attachment:theAttachments} to oneMessage
				repeat with oneAttachment in mail attachments of oneMessage
					
					save oneAttachment in ("Mac OS X:Users:max:Desktop:Anhang:") & (name of oneAttachment)
					
				end repeat
			end repeat
		end tell
	end perform mail action with messages
end using terms from
Quelle

Hoffe dir geholfen zu haben, und nicht die freude am programmieren kaputt gemacht zu haben, hab leider keinen Spoiler-Button gefunden :)

Gruß
Max
 
  • Gefällt mir
Reaktionen: kissthechief

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
Der Spass vergeht, wenn man über 2 Stunden am selben Problem hängt, ohne der Lösung ein Stück näher gekommen zu sein :)

Code:
tell application "Finder"
	set f to "/Volumes/Aalgemein/Andre Fritzsche/"
	set f to POSIX file f as alias
end tell

using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			
			repeat with oneMessage in theMessages
				set {mail attachment:theAttachments} to oneMessage
				repeat with oneAttachment in mail attachments of oneMessage
					
					save oneAttachment in f & (name of oneAttachment)
					
				end repeat
			end repeat
		end tell
	end perform mail action with messages
end using terms from
Habe das ganze jetzt versucht anzupassen, so dass der Anhang auf einem meiner Netzlaufwerke gespeichert wird.
Lokal klappt alles soweit, nur ins Netzwerk will er nicht speichern.
Any Idea was falsch ist?
 

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
Ich machs (zum Teil) beruflich, ich kenne den Frust :D

Sogleich ich auch keine Ahnung habe, was du mit dem POSIX machst, fällt mir auf das "f" irgendwie nicht mehr deklariert ist beim speicherversuch.
Code ich mein Netzlaufwerk hard rein, geht alles ohne probleme.

Code:
using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			
			repeat with oneMessage in theMessages
				set {mail attachment:theAttachments} to oneMessage
				repeat with oneAttachment in mail attachments of oneMessage
					say "Speichere"
					save oneAttachment in "/Volumes/Sata1500/tausch/" & (name of oneAttachment)
					
				end repeat
			end repeat
		end tell
	end perform mail action with messages
end using terms from
Sata1500 ist ein Netzlaufwerk bei mir.

Gruß
Max
 

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
Ach wie doof...
Hab alles mögliche probiert ohne Erfolg...

Bis ich dann jetzt gemerckt habe, dass der ein Problem damit hat, dass die Mail mehrfach fwd wurde.
Neue Mail mit Anhang geschickt und zack warse da :)

Jetzt muss ich mir noch was einfallen lassen, dass für den Fall das mehrere Dateien in der Mail sind, diese einen Zusatz im Namen kriegen, so dass erkennbar ist das die zusammen gehören.

Wenn es da Ideen gibt immer raus damit! :)
 

chebfarid

Mitglied
Mitglied seit
05.10.2005
Beiträge
894
Einfach den Loop ändern und die Variabile "i" in den Namen des zu speichernden Files einbauen:
PHP:
tell application "Mail"
repeat with oneMessage in theMessages
set {mail attachment:theAttachments} to oneMessage
set c to (count of mail attachments of oneMessage)
repeat with i from 1 thru c
set oneAttachment to mail attachment i of oneMessage
save oneAttachment in ("/Volumes/Sata1500/tausch/" & (name of oneAttachment) & i)
end repeat
end repeat
end tell
(Auf 'ner Dose geschrieben und deshalb nicht getestet, vielleicht ist noch irgendwo ein Syntaxfehler drin ... )

Good scripting
Farid
 

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
Problem wäre doch da aber, dass i sich den Status ja nicht behält oder?
Ich bin grade an einer Lösung am werkeln, in der ich mir einfach in eine TextDatei einen Startwert setze der dann immer hochgezählt wird nach jeder neuen Mail.
So sind die Mailanhänge auch hinterher klar auseinander zu halten.
 

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
für so ne spielerrein find ich auch das datum immer ganz brauchbar
Code:
set datum to (do shell script "date \"+%Y%m%d%H%M%S\"") 
-- returns 20110428112639
 
  • Gefällt mir
Reaktionen: kissthechief

chebfarid

Mitglied
Mitglied seit
05.10.2005
Beiträge
894
"i" ist eine lokale Variabile und sollte sich jedesmal von selbst zurücksetzen, wenn eine neue Nachricht oneMessage bearbeitet wird.

Ciao
Farid
 

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
Max seine Idee gefällt mir da sehr gut :)
Das Problem mit einer lokalen Variable wäre, dass ich wenn ein Attachment mit dem selben Namen mehrfach kommt, diese überschrieben werden evtl.
Mit Daum und Uhrzeit ist das schön trennbar. :)

Ich würde auch gern noch den Absender mit einbauen
Wie mache ich das denn?
Mal noch so als kleine Stütze wie ich mit der Doku umgehen kann



Wie komme ich da jetzt an den Sender?

Ich hätte es jetzt mit

set Absender to sender probiert, aber da hängt sich das Skript auf..

Wie deklariere ich denn diese Bereiche von (C) Message nach (P) sender

Hab zwar hier ein Buch in dem aufgeführt ist, dass ich die Sachen benutzen kann, aber nicht wie

set absender to sender of oneMessage löst mein Problem :)
Aber ne kurze Hilfe wie ich richtig mit der Library umgehen kann, wäre trotzdem super :)
 
Zuletzt bearbeitet:

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
(sender of oneMessage)

aber auch noch nich schön find ich, da noch im Format
"Abensdername <mail@absen.der>"

bin grad am basteln nebenher :)
 

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
(sender of oneMessage)

aber auch noch nich schön find ich, da noch im Format
"Abensdername <mail@absen.der>"

bin grad am basteln nebenher :)
ja stimmt auch wieder.. wenn da noch Datum bei kommt wirds unübersichtlich :)

Aber zumindest funktioniert das erstmal
 

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
soooo, also Absender ohne E-Mail kann ich schonmal bieten:

Code:
using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			
			repeat with oneMessage in theMessages
				
				set {mail attachment:theAttachments} to oneMessage
				repeat with oneAttachment in mail attachments of oneMessage
					
					save oneAttachment in "/Volumes/Mac OS X/Users/max/tmp/" & item 1 of my theSplit((sender of oneMessage), "<") & "- " & (name of oneAttachment)
					
				end repeat
			end repeat
		end tell
	end perform mail action with messages
end using terms from

on theSplit(theString, theDelimiter)
	-- save delimiters to restore old settings
	set oldDelimiters to AppleScript's text item delimiters
	-- set delimiters to delimiter to be used
	set AppleScript's text item delimiters to theDelimiter
	-- create the array
	set theArray to every text item of theString
	-- restore the old setting
	set AppleScript's text item delimiters to oldDelimiters
	-- return the result
	return theArray
end theSplit
Thx an den Split-Code
 
  • Gefällt mir
Reaktionen: kissthechief

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
Oder alternativ das:
Automatisches hoch zählen am Anfang, so das jede Email eine eigene nummer bekommt. Auf 6 stellen gebaut, Lücken werden nicht gefüllt,es wird keine extra datei gebraucht und andere Dateien dürfen auch weiterhin im Ordner liegen :)

Code:
using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			
			repeat with oneMessage in theMessages
				
				--> Irgendwie darf ich das net außerhalb deklarieren :(
				set _saveFolder to "Mac OS X:Users:max:tmp"
				set _latestNumber to my findLatestNumber(_saveFolder)
				-->
				
				set {mail attachment:theAttachments} to oneMessage
				repeat with oneAttachment in mail attachments of oneMessage
					
					save oneAttachment in (((POSIX path of _saveFolder) & "/" & _latestNumber as string) & " " & (name of oneAttachment))
					
				end repeat
			end repeat
		end tell
	end perform mail action with messages
end using terms from

on findLatestNumber(_saveFolder)
	tell application "Finder"
		set _files to every file of folder _saveFolder
		set _last to "000000"
		
		repeat with _file in _files
			set _fileNameCutted to (item 1 of my theSplit(name of _file, " "))
			
			if _fileNameCutted = my convertToSixDigits(_last) then
				set _last to _last + 1
			end if
			
			try
				set _numberFromFile to _fileNameCutted as number
				
				if _numberFromFile > _last as number then
					set _last to _numberFromFile
				end if
				
			end try
			
		end repeat
		
	end tell
	
	return my convertToSixDigits(_last + 1) -- noch eins draufzählen
end findLatestNumber

on convertToSixDigits(_number)
	if (length of (_number as string)) = 1 then
		return "00000" & _number
	else if (length of (_number as string)) = 2 then
		return "0000" & _number
	else if (length of (_number as string)) = 3 then
		return "000" & _number
	else if (length of (_number as string)) = 4 then
		return "00" & _number
	else if (length of (_number as string)) = 5 then
		return "0" & _number
	end if
	return _number -- gibts nen else ohne bedingung in applescript?
end convertToSixDigits

on theSplit(theString, theDelimiter)
	set oldDelimiters to AppleScript's text item delimiters
	set AppleScript's text item delimiters to theDelimiter
	set theArray to every text item of theString
	set AppleScript's text item delimiters to oldDelimiters
	return theArray
end theSplit
So, jetzt sollte ich aber mal wirklich was arbeiten ;)

Gruß
Max
 
  • Gefällt mir
Reaktionen: kissthechief

Maxxxxx

Neues Mitglied
Mitglied seit
28.04.2011
Beiträge
12
@Andre :teeth:

Update:
- property ganz oben, zum bequemeren einstellen
- nun möglich N führende nullen zu verwenden
- Falls mal jemand echt so pervers sein sollte, und 2 dateien mit dem selben namen anhängen, wird der attachmendIdentifyer angehängt, für den fall der fälle

Code:
--> Wohin soll gepseichert werden?
property _saveFolder : "Mac OS X:Users:max:tmp"
--> Wieviele führende Nullen? (Für die Sortierung besser) (0 für keine ;) )
property _lengthOfCout : 12

using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			
			repeat with oneMessage in theMessages
				
				set _latestNumber to my FindLatestNumber(_saveFolder)
				set {mail attachment:theAttachments} to oneMessage
				repeat with oneAttachment in mail attachments of oneMessage
					
					set _id to (id of oneAttachment)
					if _id > 2 then -- falls 2 gleiche dateinamen im anhang
						set _latestNumber to _latestNumber & "_" & _id
					end if
					
					save oneAttachment in (((POSIX path of _saveFolder) & "/" & _latestNumber as string) & " " & (name of oneAttachment))
					
				end repeat
			end repeat
		end tell
	end perform mail action with messages
end using terms from

on FindLatestNumber(_saveFolder)
	tell application "Finder"
		set _files to every file of folder _saveFolder
		set _last to "000000"
		
		repeat with _file in _files
			set _fileNameCutted to (item 1 of my Split(name of _file, " "))
			
			if _fileNameCutted = my ConvertToNDigits(_last) then
				set _last to _last + 1
			end if
			
			try
				set _numberFromFile to _fileNameCutted as number
				
				if _numberFromFile > _last as number then
					set _last to _numberFromFile
				end if
				
			end try
		end repeat
	end tell
	return my ConvertToNDigits(_last + 1) --> Wichtig :)
end FindLatestNumber

on ConvertToNDigits(_number)
	repeat while (length of (_number as string) < _lengthOfCout)
		set _number to "0" & _number
	end repeat
	return _number
end ConvertToNDigits

on Split(theString, theDelimiter)
	set oldDelimiters to AppleScript's text item delimiters
	set AppleScript's text item delimiters to theDelimiter
	set theArray to every text item of theString
	set AppleScript's text item delimiters to oldDelimiters
	return theArray
end Split
Und wenn mir mal jemand erklärt wie ich _saveFolder am anfang deklarieren kann, dann wär ich begeistert :)
Hab erst gestern AppleScript das erste mal gesehen :D
gefunden, als property anlegen :)


Gruß
Max
 
Zuletzt bearbeitet:

sushi-berlin

Mitglied
Mitglied seit
11.09.2007
Beiträge
177
Hi,

ich hatte die ganzen Scripte hier vergebens ausprobiert und im Netz dann die Seite hubionmac.com gefunden. Das dortige Script funktioniert bei mir.
 

kissthechief

Neues Mitglied
Thread Starter
Mitglied seit
11.04.2011
Beiträge
38
um das ganze hier nochmal raus zu holen...

Das Skript ging heute in Arbeit auf den verschiednen Rechnern, aber folgendes Problem ist aufgetreten...

Es wurde alle Anhänge aus allen Mails gezogen..
Es soll aber nur aus den Mails der Anhang gezogen werden, die ungelesen sind.
Wie kann ich das denn realisieren?

Der letzte Step den ich nehmen sollte ware dieser hier
using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
tell application "Finder" to set ptd to ":Volumes:KandidatenSuche-2:CV_IN:" as string
tell application "Finder" to set ptd2 to ":Volumes:KandidatenSuche-1:CV_IN:" as string
tell application "Finder" to set ptd3 to ":Volumes:KandidatenSuche:CV_IN:" as string

tell application "Mail"

repeat with oneMessage in theMessages

set {mail attachment:theAttachments} to oneMessage
repeat with oneAttachment in mail attachments of oneMessage
say "New CV incoming"
set absender to sender of oneMessage
set datum to (do shell script "date \"+%Y%m%d%H%M\"")
try
save oneAttachment in ptd & (name of oneAttachment) & datum & absender
end try
try
save oneAttachment in ptd2 & (name of oneAttachment) & datum & absender
end try
try
save oneAttachment in ptd3 & (name of oneAttachment) & datum & absender
end try
end repeat
end repeat
end tell
end perform mail action with messages
end using terms from
 
Oben