Email 电子邮件如何从SMTP发送到IMAP?

Email 电子邮件如何从SMTP发送到IMAP?,email,smtp,protocols,imap,lmtp,Email,Smtp,Protocols,Imap,Lmtp,我正在为IMAP服务器编程,但遇到了一个问题:电子邮件来自哪里? 我一直认为事件的基本过程是: 发送方客户端使用SMTP协议向SMTP服务器(主机A)发送电子邮件 SMTP服务器(主机A)查找电子邮件应该发送到哪里,并使用SMTP协议与SMTP服务器(主机B)通信 SMTP服务器(主机B)然后接受电子邮件, 并与IMAP服务器(主机B)通信,以神奇地(?)将电子邮件发送到该服务器 接收方客户端使用IMAP协议向IMAP服务器(主机B)请求新的电子邮件 这让我想知道:电子邮件是如何从接受SMTP的

我正在为IMAP服务器编程,但遇到了一个问题:电子邮件来自哪里?

我一直认为事件的基本过程是:

  • 发送方客户端使用SMTP协议向SMTP服务器(主机A)发送电子邮件
  • SMTP服务器(主机A)查找电子邮件应该发送到哪里,并使用SMTP协议与SMTP服务器(主机B)通信
  • SMTP服务器(主机B)然后接受电子邮件, 并与IMAP服务器(主机B)通信,以神奇地(?)将电子邮件发送到该服务器
  • 接收方客户端使用IMAP协议向IMAP服务器(主机B)请求新的电子邮件
  • 这让我想知道:电子邮件是如何从接受SMTP的服务器发送到提供服务的IMAP服务器的?他们有协议吗?他们只是把它放在目录里吗

    我自己试图找到答案。。。 我见过
    /var/mail
    目录的用法,每个用户有一个文件,它似乎不适合大型用户群。当两个进程同时读取/写入此文件时,是否也会导致问题

    我还看到Postfix
    main.cf
    文件可能包含
    mailbox\u transport=lmtp:unix:/var/imap/socket/lmtp
    ,它看起来像是使用unix套接字与imap服务器通信的lmtp协议。哪一个表示IMAP服务器也在“说”LMTP


    还有其他的方法吗?或其他协议?

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

  • SMTP和IMAP由同一服务器或同一供应商的服务器提供-可以使用任何专有(秘密/未记录)协议/方法
    [AFAIK这不是常见的linux/unix解决方案]

  • LMTP协议(SMTP的轻微修改)-现代推荐

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

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

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


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

    根据RFC 5598,这是由MDA(邮件传递代理)完成的。通常,它存储在数据库或文件系统中。对于Unix系统,这通常是/home/user/mail或(旧版)/var/mail。对于像Exchange这样的东西,它将是一个专有数据库。但是电子邮件是如何从SMTP服务器发送到MDA的呢?它是如何从MDA传输到IMAP服务器的?在unix上,MTA执行MTA并在stdin上向其发送消息,有关详细信息,请参阅procmail手册页。在其他操作系统(确实存在)上,有时在unix上,MDA与SMTP服务器是同一软件包的一部分。