我的想法是这样的:
我想为我的奶奶创建一个 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 文件时grep
,munpack
SENDER 和 SUBJECT 的提取不起作用。它看起来就像冻结了一样。我只能用ctrl-取消它c!
我不知道为什么,当我在我的代码中包含第 2 行和第 3 行时,.procmailrc
它确实可以正常工作。
我的意思是这是一个基本的任务,没有什么魔法,但我用谷歌找不到任何有用的东西:/
任何帮助都非常感谢!也许你有其他解决方案。我完全不是 Linux 专家,所以也许可以简单一点:)
答案1
和cat
都是tee
无用;tee
更是如此,这也是脚本冻结的原因(您认为)。它需要一个文件名参数,作为复制输入的文件,以及标准输入上的文本或数据流,当然它没有接收,所以它就在那里。
此外,你通常应该引用你的变量。
提取SENDER
有点问题。你真的希望变量包含两个字符串吗?通常,你可以简单地执行formail -rtzxTo: <"$file"
并获得合理的结果。(该-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'
[email protected] Markus
[email protected] Someone
________HERE
这会假设您当前正在查找的文件中有什么,但您应该明白了。这仍然无法解决SENDER2
如果文件中没有发件人,该如何设置的问题;但也许出于安全原因,脚本应该完全拒绝这些文件?