![mutt:确定当前邮件的本地路径](https://linux22.com/image/196263/mutt%EF%BC%9A%E7%A1%AE%E5%AE%9A%E5%BD%93%E5%89%8D%E9%82%AE%E4%BB%B6%E7%9A%84%E6%9C%AC%E5%9C%B0%E8%B7%AF%E5%BE%84.png)
挑战
我想确定当前在 mutt 中查看的邮件的本地路径,并在将邮件保存到本地项目文件夹之前或之后将其传输到 bash 脚本。
概念
我正在使用mutt
和offlineimap
,msmtp
以便将我的邮件基础设施与永久互联网连接的必要性分离。这样做时,我在邮件文件结构中找到我的邮件,其中每个邮件<PROJECT>
和<ACCOUNT>
可能位于其自己的本地文件夹结构中:
Mail/
|-- <PROJECT>/
| |-- cur/
| | |-- 1584016380.RPi-18:2,
| | |-- 1595241604.RPi-18:2,
| | |-- 1603636018.RPi-18:2,
| | `-- 1612159655.RPi-18:2,
| |-- new/
| `-- tmp/
|-- <ACCOUNT>/
| |-- DRAFTS/
| | |-- cur/
| | |-- new/
| | `-- tmp/
| |-- INBOX/
...
当我浏览邮件时(使用 mutt 中的索引或寻呼机视图),我可以选择、标记、删除……打开 mutt 从草图文件夹结构中读取的相应邮件元素。
现在,我想使用 mutt 的函数保存当前消息save-message
。但在此之前(或保存之后),我想自动提取邮件的附件,并可能使用邮件内容执行一些其他操作。
我已经编写了一个 bash 脚本,该脚本读取邮件文件的路径(例如~/Mail/<PROJECT>/cur/1584016380.RPi-18:2
作为其参数),然后使用命令将邮件的附件存储在预定义的位置mu
。
问题
我查看了可用的 mutt 变量(folder
、spoolfile
、from
、 ...),以便找到任何可以告诉我当前查看的邮件文件实际位置的信息。但我找不到任何东西。因此,我不知道将哪个路径传递给 bash 脚本以使其在本地查找邮件。
这里有什么可以用的吗?
答案1
我决定写一个答案,因为这个问题变得相当大,需要在问题下的评论中讨论才能解决。
我明白了项目对于不同的发件人、主题或正文内容有所不同。
你需要像这里这样的两个宏Neomutt 运行命令以在按下宏按键时附加文件
第一个宏完成这项工作,并且需要位于单独的文件中 - 因为 shell 部分在宏定义上进行了扩展。这就是为什么您需要通过定义第一个宏的第二个宏来重新定义它并执行它。
〜/.mutt/dynamic_macro
"<pipe-message>/path/to/your/script<enter>\
<save-message>`cat /tmp/mutt_project`<enter>" \
"pipe message to extract attachments and save message"
〜/.mutt/muttrc
macro index ,S \
"<enter-command>source ~/.mutt/dynamic_macro<enter>\
<enter-command>push ,s<enter>" \
"redefine macro and run it"
/path/to/your/script
现在这里是一个伪代码(类似 bash)的非工作示例。该脚本从标准输入读取消息,解析标头或正文以确定项目名称(邮箱名称)并迭代各部分以保存附件 - 可能按项目保存到某些目录和子目录?
detect_project(){
# parse $content to detect project from body/headers
# save the project name to /tmp/mutt_project for the 1st macro
# and output on stdout for save_attachemnts()
echo $result > /tmp/mutt_project
echo $result
}
save_attachments(){
# parse $content, iterate over parts of message from $content,
# extract attachments, decode, save to:
#/root_directory_with_attachments/$project/$your_filename
}
main(){
content=$(cat) # read the stdin and save it into variable
project=$(detect_project)
save_attachments
}
main
建议:
- 使用具有处理电子邮件的库的语言,可以访问这些部分,对其进行解码等。
- 我确信,如果您要标记来自不同项目的多条消息,则上面的示例将无法使用标记前缀。原因是宏执行一次,所有消息都会立即通过管道传输到 /path/to/your/script 中,但 的参数
<save-message>
将包含从最后一条消息中检测到的项目
不同的解决方案:从 mutt 迁移到 neomut,从 mu 迁移到 notmuch。 Neomutt 对 notmuch 具有良好的内置支持。这里的一切都可以通过不多的 post-new hook 来完成。它非常适合您的用例,在后台运行,无需 neomutt 宏,并消除了原始解决方案标签前缀的限制。每次同步消息后,Nomtuch post-new 挂钩都会运行。
- 它可以根据 from/to/cc/subject 标头正文内容或其他标签来标记消息,
- 还可以通过 post-new hook 保存附件。
如果您对此感兴趣,请在这里发表评论,我将扩展答案。