Как извлечь и отсортировать прикрепленные изображения из электронных писем?
Вот о чем я думал:
Я хочу создать Raspberry Pi Picture-frame (DPF) для моей бабушки, но с базовой поддержкой электронной почты. Письма могут быть отправлены шестью членами семьи и будут получать ежедневно fetchmail/procmail. Это уже работает!
В /home/pi/Mail/
Теперь у меня есть три файла (по одному на каждое письмо, включая вложения):
msg.nTIB
msg.pTIB
msg.oTIB
Теперь я хочу извлечь SENDER, SUBJECT(, TEXT) и ATTACHMENT из каждого файла, чтобы переименовать файл вложения и добавить текст с помощью imagemagick (еще не включен).
for file in msg.*; do
export SENDER=`tee $file | formail -zxFrom: -zxReply-To:|cut -fs- -d'<'|cut -f1 -d'>'`
SUBJECT = `/bin/cat $file | formail -zxSubject:`
if grep -qxis $SENDER /home/pi/Mail/.markus; then
SENDER2=Markus
fi
if grep -qxis $SENDER /home/pi/Mail/.someone; then
SENDER2=Someone
fi
/bin/mkdir -p /home/pi/Mail/$SENDER2 >/dev/null
munpack -C /home/pi/Mail/$SENDER2 $file
/bin/cat $file
/bin/rm $file
done
grep
а также munpack
часть работает нормально, но извлечение SENDER и SUBJECT не работает, когда я запускаю sh-файл. Похоже, что он замерз. Я могу только отменить его с помощью Ctrl-C!
Я не знаю почему, когда я включаю строки 2 и 3 в мой .procmailrc
это работает без проблем.
Я имею в виду, что это какая-то базовая задача, а не волшебство, но я не смог найти ничего полезного с Google :/
Любая помощь приветствуется! Может быть, у вас есть другое решение. Я совершенно не эксперт в Linux, так что, может быть, немного проще :)
1 ответ
Оба cat
и tee
бесполезны ; tee
вдвойне, и причина (что вы воспринимаете как) сценарий замораживания. Требуется аргумент имени файла, в который файл должен копировать свои входные данные, и поток текста или данных на стандартный ввод, который, конечно, он не получает, поэтому он находится там.
Кроме того, вы должны обычно указывать свои переменные .
SENDER
добыча является проблематичной. Вы действительно хотите, чтобы переменная содержала две строки? Обычно вы можете просто сделать formail -rtzxTo: <"$file"
и получить вменяемый результат. (The -t
Опция имеет некоторую неясную семантику, но для этой цели она, вероятно, делает правильные вещи.) Это также избавляет от надоедливых cut
s, чтобы получить только конечный адрес электронной почты (потому что formail
в режиме генерации ответов это уже сделано для вас).
В заключение, sh
синтаксис не допускает пробелов вокруг знака равенства в присваиваниях.
for file in msg.*; do
SENDER=$(formail -zxFrom: -zxReply-To: <"$file" |
cut -fs- -d'<'|cut -f1 -d'>')
SUBJECT=$(formail -zxSubject: <"$file")
if grep -qxis "$SENDER" /home/pi/Mail/.markus; then
SENDER2=Markus
elif grep -qxis "$SENDER" /home/pi/Mail/.someone; then
SENDER2=Someone
fi
mkdir -p /home/pi/Mail/"$SENDER2"
munpack -C /home/pi/Mail/"$SENDER2" "$file"
cat "$file"
rm "$file"
done
Я также удалил полные пути из имен команд (вы должны просто убедиться, что ваш PATH
вменяемый вместо) и переключился с `obsolescent`
Синтаксис процесса замены на $(modern)
, mkdir -p
работает тихо, поэтому я удалил перенаправление вывода с этого.
Комплекс grep
можно заменить простым отображением, примерно так:
SENDER2=$(awk -v who="$SENDER" '
$1 == who { print $2; x=1 } END { exit 1-x }' <<'________HERE'
msmith@dmel.example.com Markus
someone@there.example.net Someone
________HERE
Это делает предположения о том, что у вас есть в файлах, которые вы в настоящее время извлекаете, но вы должны понять. Это все еще не решает, как установить SENDER2
если у вас нет отправителя в файле; но, возможно, сценарий должен просто полностью отклонить эти файлы по соображениям безопасности?