1

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

Я хочу создать 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 ответ1

1

И cat и tee бесполезны ; tee , и причина (как вы это воспринимаете) сценария зависла. Требуется аргумент имени файла, в который файл должен копировать свои входные данные, и поток текста или данных на стандартный ввод, который, конечно, он не получает, поэтому он находится там.

Кроме того, вы обычно должны указывать свои переменные.

Извлечение SENDER является проблематичным. Вы действительно хотите, чтобы переменная содержала две строки? Обычно вы можете просто сделать formail -rtzxTo: <"$file" и получить вменяемый результат. (Опция -t имеет некоторую неясную семантику, но для такого рода целей она, вероятно, работает правильно.) Это также избавляет от досадных cut чтобы получить только конечный адрес электронной почты (потому что 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 если у вас нет отправителя в файле; но, возможно, сценарий должен просто полностью отклонить эти файлы по соображениям безопасности?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .