在我的笔记本电脑上,我设置了一个 cron 来执行每周的工作。如果有什么要报告的,我想收到一封电子邮件。现在我使用 KMail 作为 MUA,它能够从 Maildir 目录中读取邮件~/.local/share/local-mail
。因此,我希望将本地邮件传递到该文件夹(具有 Maildir 结构)。
我希望已经存在一个非常简单的程序,它有一个sendmail
接口(这样echo "$REPORT" | mail -s "$SUBJECT" "$ME"
可以使用它)。安装 exim 或将邮件转发到我的远程邮件服务器被认为是矫枉过正。
问题从服务器转发所有邮件的最简单方法?似乎目标是远程转发,这不适合我的需求(我需要本地交付)。这旧的 Gentoo 线程最终用 Perl 编写了一个旧脚本。肯定存在一个经过深思熟虑、极其简单的程序吗?
有什么建议吗?我正在使用 Arch Linux。
答案1
由于我找不到现有的小程序,因此我决定编写自己的程序。最初,我想出了:
#!/bin/bash
# Simple sendmail
# filename per spec at http://cr.yp.to/proto/maildir.html
rand=$((RANDOM % 1000))
msgname=$(date +%s).P$$R$rand.$(hostname | tr '/:' '\057\072')
# Safety measure: do not overwrite existing mail
set -o noclobber
cat > ~peter/".local/share/local-mail/inbox/new/$msgname"
这有效......除非执行脚本的用户不是“peter”。这个想法的继承者是一个“小”C程序,毫微微邮件。来自其自述文件:
femtomail - 具有 Maildir 支持的最小 MDA
femtomail 是用于本地邮件的最小邮件传送代理 (MDA)。邮件从标准输入接受并放置在用户的 Maildir 框中。该软件适用于单用户计算机。
远程传送、守护进程、发件人验证等尚未实现,并且由于其复杂性也不会实现。 femtomail 的编写不是因为邮件软件不存在,而是因为现有的软件对于简单的任务来说太大了将 cron 邮件发送给本地用户。
femtomail的工作流程:
- 更改进程用户和组。
- 创建一个新文件唯一的文件名在邮件目录中。
- 将
Received
标头写入文件。- 将数据从标准输入传递到文件。
- 出口。
源代码和安装说明可在以下位置获取https://git.lekensteyn.nl/femtomail/。
答案2
根据已接受的答案,我使用官方 Dovecot CE 存储库中的 Docker 映像创建了一个小型解决方案,网址为https://hub.docker.com/r/dovecot/dovecot,我想分享一下。
运行容器:
docker run --name dovecot -d dovecot/dovecot
安装 sudo,它不包含在 dovecot 映像中,但我们的脚本需要它
apt-get update && apt-get -y install sudo
设置邮件目录。我发现
/var/mail
在用户主目录中这样做更灵活,也更省事:mkdir /var/mail/vmail chown vmail /var/mail/vmail
创建邮箱用户,该用户必须是 vmail 组的成员:
useradd -g vmail theresa
如果需要,您可以随时添加更多用户。
告诉 Dovecot 邮件在哪里。为此,我们需要更改
mail_location
为/etc/dovecot/dovecot.conf
:mail_location=maildir:/var/mail/vmail/%u
之后需要重新启动 dovecot,只需重新启动 Docker 容器即可完成:
docker restart dovecot
/usr/local/storemail.sh
在 dovecot 容器中创建以下 bash 脚本:#!/bin/bash # Store mail in maildir # Based on https://unix.stackexchange.com/a/82367/215688 # Simply stores an email to the user mail directory USER=$1 MAIL_LOCATION="/var/mail/vmail/$USER" # filename per spec at http://cr.yp.to/proto/maildir.html rand=$((RANDOM % 1000)) msgname=$(date +%s).P$$R$rand.$(hostname | tr '/:' '\057\072') # Just in case the user dir has not been created yet sudo -u vmail mkdir -p "$MAIL_LOCATION/new" # Safety measure: do not overwrite existing mail set -o noclobber # now store the email there sudo -u vmail cat > "$MAIL_LOCATION/new/$msgname"
不要忘记使其可执行:
chmod +x /usr/local/storemail.sh
就是这样。
现在您可以使用该脚本存储新邮件。唯一的参数是用户名,电子邮件需要从标准输入提供。
storemail.sh theresa <testmail.eml
或者从容器外部使用
docker exec -i dovecot <testmail.eml storemail.sh theresa
或者甚至通过 ssh 从远程计算机
ssh docker-machine.local <testmail.eml docker exec -i dovecot storemail.sh theresa
我建议创建一个自定义 dockerfile 来自动执行准备步骤。