如何从电子邮件中提取和排序图像附件?

如何从电子邮件中提取和排序图像附件?

我的想法是这样的:

我想为我的奶奶创建一个 Raspberry Pi 相框 (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

和部分工作正常,但当我运行 sh 文件时grepmunpackSENDER 和 SUBJECT 的提取不起作用。它看起来就像冻结了一样。我只能用ctrl-取消它c

我不知道为什么,当我在我的代码中包含第 2 行和第 3 行时,.procmailrc它确实可以正常工作。

我的意思是这是一个基本的任务,没有什么魔法,但我用谷歌找不到任何有用的东西:/

任何帮助都非常感谢!也许你有其他解决方案。我完全不是 Linux 专家,所以也许可以简单一点:)

答案1

cat都是tee无用;tee更是如此,这也是脚本冻结的原因(您认为)。它需要一个文件名参数,作为复制输入的文件,以及标准输入上的文本或数据流,当然它没有接收,所以它就在那里。

此外,你通常应该引用你的变量

提取SENDER有点问题。你真的希望变量包含两个字符串吗?通常,你可以简单地执行formail -rtzxTo: <"$file"并获得合理的结果。(该-t选项有一些模糊的语义,但对于这种目的,它可能做了正确的事情。)这也消除了烦人的cuts 以仅获取电子邮件终端(因为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'
        [email protected]    Markus
        [email protected]  Someone
________HERE

这会假设您当前正在查找的文件中有什么,但您应该明白了。这仍然无法解决SENDER2如果文件中没有发件人,该如何设置的问题;但也许出于安全原因,脚本应该完全拒绝这些文件?

相关内容