Hi,
OK, verstehe. Hier bleiben die Mails alle im Mail-Programm (Outlook), dessen Features ich aber auch recht exzessiv nutze (inkl. viel Skripting mit Nachrichten).
Und an Josef: Worum geht's Dir eigentlich?Problem:
500 E-Mails sollen in verschiedene Ordner sortiert und extern als einzelne Mails archiviert werden. Also Dateisystem. Ist jetzt schon Jahre her aber ich hab da mal was gebastelt, das darauf basierte, daß Mail.app ja die Ordner, die man
in Mail.app anlegt, auch physisch so im Dateisystem unterhalb ~/Library/Mail/Mailboxes/ erzeugt und da drin dann die einzelnen Message-Dateien -- numerisch aufsteigend benamst -- ablegt.
Die Idee damals war, daß man Mails in einem Schwung innerhalb Mail.app in einen speziellen Ordner verschiebt (bspw. Archiv), diesen dann im Finder ansteuert (in dem Fall also ~/Library/Mail/Mailboxes/Archiv.mbox), die .emlx-Dateien sonstwohin kopiert und dann ein Skript drauf losläßt, daß a) die Namen der Dateien geradezieht (also nicht numerisch sondern abgeleitet vom Betreff) und die Timestamps mit dem "Date-Header" innerhalb der Mails angleicht.
Gerade gesehen, daß das aktuelle Mail.app-Versionen nur bisserl anders machen. Jetzt heißt der Pfad halt ~/Library/Mail/V2/Mailboxes/Archiv.mbox/$UUID/Data/Messages/. Aber da drin ist alles wie immer.
D.h. die beiden Spotlight-Attribute kMDItemContentCreationDate (Date-Header) und kMDItemSubject (Betreff) existieren noch und damit sollte mein damaliges Skriptchen noch funktionieren.
Das nimmt per Drag&Drop dann solche Ordner mit den ganzen .emlx-Dateien entgegen, benennt die Mail-Dateien um gemäß Betreff (und zählt bei identischem Betreff einfach hoch, damit keine zwei Mails sich gegenseitig überschreiben) und setzt die Zeitstempel der Dateien auf das Sendedatum der Mails:
#!/bin/bash
#
# mailarchiver.sh
#
# Nimmt per Drag&Drop Ordner mit eml[x]-Dateien aus Outlook,
# Entourage oder Mail.app entgegen, sortiert diese der Reihe
# nach (natural sort order), und benennt sie im Fall von Mail.app
# um anhand der Betreffzeile der Mail. Bei allen Dateien wird
# das Datum auf den Date-Header der Mail gesetzt.
#
# Benutzt wird dazu Spotlight-Technologie, d.h. das Parsen der
# Mail-Source übernimmt nicht das Skript sondern entsprechende
# im System existente MDImporter.
#
# v0.1.1 (c) 2007-2013 Thomas Kaiser / Kaiser-EDV GmbH <info@kaiser-edv.de>
Main() {
# setup sane environment
export PATH=/bin:/sbin:/usr/bin
# process all arguments
while [ $# -gt 0 ]; do
if [ -f "$1" ]; then
ProcessMessage "$1"
elif [ -d "$1" ]; then
# Scrollbalken vorbereiten
CountOfItems=$(ls "$1" | wc -l | tr -d " ")
ActualItem=0
# Dateien verarbeiten
cd "$1" || exit 1
ls | sort -g | while read ; do
ProcessMessage "${1}/${REPLY}"
ActualItem=$(( ${ActualItem} + 1 ))
Percentage=$(echo "${ActualItem} / ${CountOfItems} * 100 " | bc -l | cut -d. -f1)
echo "PROGRESS:${Percentage}"
done
fi
shift
done
} # Main
ProcessMessage() {
# Pruefen, ob ueberhaupt eine .eml[x]-Datei
case $1 in
*.eml|*.emlx)
# Suffix auslesen
TargetSuffix=".$(echo "${1}" | sed 's/^.*\.\([^.]\{0,5\}\)$/\1/g')"
# Zeit anpassen gemaess Header bzw. kMDItemContentCreationDate
TimeStamp="$(mdls "$1" | awk -F" " '/^kMDItemContentCreationDate/ {print $3$4}' | tr -d "-" | sed -e 's/://' -e 's/:/./')"
if [ "X${TimeStamp}" != "X" ]; then
touch -t "${TimeStamp}" "$1"
fi
# Benamung anpassen gemaess Subject-Header bzw. kMDItemSubject wenn Mail.app
# im Spiel
case $1 in
*.emlx)
SubjectLine=$(mdls "$1" | awk -F"= " '/^kMDItemSubject/ {print $2}' | sed -e 's/^"//' -e 's/"$//' -e 's/:/-/g' -e 's|/|:|g' -e 's|"|\\"|g' -e 's| |\\ |g' -e 's|(|\\(|g' -e 's|)|\\)|g' -e 's|\[|\\[|g' -e 's|\]|\\]|g')
if [ "X${SubjectLine}" = "X" ]; then
SubjectLine="\"Kein Betreff\""
fi
NewPath="$(GetUniqueFile "${1%/*}" "${SubjectLine}${TargetSuffix}")"
echo "Benenne ${1##*/} um in ${NewPath##*/}"
mv "$1" "${NewPath}"
;;
esac
;;
esac
} # ProcessMessage
GetUniqueFile() {
# Funktion, die einen eindeutigen Dateinamen mittels numerischem Suffix
# herstellt, damit keine Dateien ueberschrieben werden
# Erwartet 2 Parameter:
# $1 --> Zielpfad
# $2 --> Zieldateiname
#
# Ein an der Datei haengendes max. 5-stelliges Suffix wird erhalten
MAX_LENGTH=85 # Maximale Dateinamenslaenge wegen UTF-8 (85-255 Zeichen)
COUNTER=0
SUFFIX=""
TARGET_DIR="$1"
TITLE="$2"
# Test whether Suffix is available
FNameWOSuffix="$(echo "${TITLE}" | sed 's/\.[^.]\{0,5\}$//g')"
if [ "X${FNameWOSuffix}" = "X${TITLE}" ]; then
FNameSuffix=""
else
FNameSuffix=".$(echo "${TITLE}" | sed 's/^.*\.\([^.]\{0,5\}\)$/\1/g')"
TITLE="${FNameWOSuffix}"
fi
while true; do
eval TARGET_FILE=${TARGET_DIR}/$(echo -e ${TITLE} | cut -c-${MAX_LENGTH})${SUFFIX}${FNameSuffix}
if [ -f "${TARGET_FILE}" -o -d "${TARGET_FILE}" ] ; then
COUNTER=$(expr ${COUNTER} + 1)
SUFFIX="-${COUNTER}"
else
echo "${TARGET_FILE}"
break
fi
done
} # GetUniqueFile
Main "$@"
Als Skriptsource und inkl.
Platypus-Wrapper (der das Shell-Skript zum Droplet macht mit Fortschrittsbalken und so) steht der Kram hier:
http://kaiser-edv.de/tmp/4hEKRr/ (muß grad eh wieder was mit Spotlight-Queries machen, drum hab ich das als Fingerübung mal schnell wieder rausgekramt).
Gruss,
Thomas