Как извлечь и отсортировать прикрепленные изображения из электронных писем?

Вот о чем я думал:

Я хочу создать 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 если у вас нет отправителя в файле; но, возможно, сценарий должен просто полностью отклонить эти файлы по соображениям безопасности?

Другие вопросы по тегам