电子邮件如何从 SMTP 转到 IMAP?

How does e-mail go from SMTP to IMAP?

我正在编写 IMAP 服务器的程序,但 运行 有一个问题:电子邮件从何而来?

我一直以为事件的基本过程是这样的:

  1. 发件人客户端使用 SMTP 协议向 SMTP 服务器(主机 A)发送电子邮件;
  2. SMTP 服务器(主机 A)查找电子邮件的去向,并使用 SMTP 协议与 SMTP 服务器(主机 B)通信;
  3. SMTP 服务器(主机 B)然后接受电子邮件, 并与 IMAP 服务器(主机 B)通信,神奇地 (?) 将电子邮件发送到该服务器;
  4. 接收方客户端使用 IMAP 协议向 IMAP 服务器(主机 B)请求新电子邮件。

这让我想知道:电子邮件如何从接受 SMTP 服务器到达服务 IMAP 服务器?他们有这方面的协议吗?他们只是把它放在一个目录中吗?

我自己寻找答案的尝试...

我见过 /var/mail 目录的用法 - 每个用户一个文件 - 似乎不是为大型用户群设计的。当两个进程同时来自此 read/write 时,它不会也引起问题吗?

我还看到 Postfix main.cf 文件可能包含 mailbox_transport = lmtp:unix:/var/imap/socket/lmtp,它看起来像是用于通过 unix 套接字与 IMAP 服务器通信的 LMTP 协议。哪个表示 IMAP 服务器也 "speaking" LMTP?

还有其他方法吗?还是其他协议?

从 MTA (SMTP) 服务器和 IMAP 服务器传输的最常见方法:

  1. SMTP 和 IMAP 是同一服务器或同一供应商的服务器的服务器 - 可以使用任何专有的 (secret/undocumented) protocol/method
    [AFAIK 这不常见 linux/unix 解决方案]

  2. LMTP 协议(​​对 SMTP 略作修改)- 现代推荐

  3. MTA 执行 IMAP 服务器提供的自定义程序并(通常)将消息馈送到程序的标准输入

  4. MTA 将邮件放入每个用户 Maildir(例如 ~/.maildir/),IMAP 使用相同的(共享)maildir

  5. MTA 将收到的邮件放入标准 unix 每个用户邮箱文件 (/var/mail/username),IMAP 服务器使用该文件作为收件箱文件夹

棘手的部分是让 MTA 在 SMTP 会话中拒绝不存在的虚拟 IMAP 用户(没有每个电子邮件帐户 OS 帐户的电子邮件帐户)回复 RCPT TO:。 MTA 必须知道有效的虚拟邮箱。