femtomail - 具有 Maildir 支持的最小 MDA

femtomail - 具有 Maildir 支持的最小 MDA

在我的笔记本电脑上,我设置了一个 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的工作流程:

  1. 更改进程用户和组。
  2. 创建一个新文件唯一的文件名在邮件目录中。
  3. Received标头写入文件。
  4. 将数据从标准输入传递到文件。
  5. 出口。

源代码和安装说明可在以下位置获取https://git.lekensteyn.nl/femtomail/

答案2

根据已接受的答案,我使用官方 Dovecot CE 存储库中的 Docker 映像创建了一个小型解决方案,网址为https://hub.docker.com/r/dovecot/dovecot,我想分享一下。

  1. 运行容器:

    docker run --name dovecot -d dovecot/dovecot
    
  2. 安装 sudo,它不包含在 dovecot 映像中,但我们的脚本需要它

    apt-get update && apt-get -y install sudo
    
  3. 设置邮件目录。我发现/var/mail在用户主目录中这样做更灵活,也更省事:

     mkdir /var/mail/vmail
     chown vmail /var/mail/vmail  
    
  4. 创建邮箱用户,该用户必须是 vmail 组的成员:

     useradd -g vmail theresa
    

    如果需要,您可以随时添加更多用户。

  5. 告诉 Dovecot 邮件在哪里。为此,我们需要更改mail_location/etc/dovecot/dovecot.conf

     mail_location=maildir:/var/mail/vmail/%u
    

    之后需要重新启动 dovecot,只需重新启动 Docker 容器即可完成:

     docker restart dovecot
    
  6. /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 来自动执行准备步骤。

相关内容