Sendmail。存储收到的所有电子邮件并创建唯一的单个文件

Sendmail。存储收到的所有电子邮件并创建唯一的单个文件

我实际上面临着与客户定制应用程序集成的问题。

Sendmail 确实很容易配置和理解,但我所需要的却相当复杂。

该设备将读取收到的电子邮件,对其进行处理,并将一些数据存储在其数据库中。为此,客户问我,sendmail 在收到电子邮件时,是否有可能不将电子邮件放在用户配置文件下的单个文件中,而是将它们存储在指定路径中,并为每封处理的电子邮件创建一个电子邮件文件。

有可能做到这一点吗,或者有没有什么好主意来欺骗它并让它发挥作用?

谢谢

年代。

答案1

听起来电子邮件是以 Mbox 格式存储的,这只是一个文件,每封电子邮件都是一个接一个。这种格式现在很少使用,因为在现代使用中它往往会很快增长并变得繁琐。

最简单的方法是配置 Sendmail 使用 Procmail 进行本地传递,并配置 Procmail 以 Maildir 格式存储消息。

具体过程取决于操作系统,但应该只是安装 Procmail 的情况,然后

1)配置 Sendmail 以使用 Procmail,大多数情况下只需在配置文件中添加以下行.mc并重建配置。

FEATURE(local_procmail)
MAILER(procmail)

2)创建或更新procmailrc配置文件以 Maildir 格式存储邮件。(/存储路径末尾带有 )

DEFAULT=$HOME/mail/

mail目录可能需要存在cur,并且具有newtmp子文件夹。这些应归用户所有,并具有模式 700 权限。

查找有关您的操作系统的 Sendmail/Procmail/Maildir 的信息可能会帮助您找到一些指南或文档。

答案2

sendmail使用其他程序将消息传递给本地收件人。在 Linux 上通常是procmail。Procmail 可以将消息传递给邮件目录或者文件夹。 两者似乎都大致符合您的要求。

以 root 身份使用以下命令检查 sendmail 使用哪个程序作为本地邮件程序:
echo '=M' | sendmail -bt | grep local

或者
说服客户使用信息访问协议或者POP3用于访问邮箱。UID(唯一标识符)可以以更便携的方式传递客户想要的信息。

答案3

让应用程序从拾取位置读取文件可能不是一个好的设计想法。编写电子邮件消息不是原子操作,您不希望应用程序拾取不完整的消息。

(Maildir 格式通过将传入消息写入未tmp/向邮件客户端公开的目录来防止这种情况。只有将消息文件成功提交到磁盘后,才会将消息文件重命名/移动到目录new/,因为这是一个原子操作。)

应用程序接收电子邮件的通用解决方案是@AnFi 已经建议,让应用程序作为邮件客户端运行并让其轮询 IMAP/POP3 邮箱并跳过/删除已成功处理的消息。

类似地,通用的做法是让应用程序从 STDIN 获取电子邮件消息。

  • 然后,您仍然可以创建一个轮询邮箱的包装器,这样您就不必在邮件服务器上安装任何东西:)
    使用您最喜欢的脚本语言来创建这样的包装器或利用现有工具,例如:fetchmail <other-options> --mda /path/to/application
  • 或者,如果您确实想在邮件服务器上安装该应用程序:允许|您将消息直接转发到任何应用程序:包含一行 的
    文件~/.forward"|/path/to/application"
    /etc/aliases带有条目的文件mailboxname: "|/path/to/application"

对于 sendmail,后者通常要求您配置 sendmail 受限 shell(斯莫什)通过将 /path/to/application 复制到 /etc/smrsh

相关内容