这个问题让我开始思考,我现在意识到我对 MTA 的内部结构一无所知。
MTA 究竟是做什么的?SMTP 协议之后的一切对我来说似乎都是黑魔法。假设我想编写一个仅用于发送电子邮件的简约 MTA(或MDA),我需要学习/做什么?
编辑:我实际上并不打算编写 MTA,我只是想了解它在内部是如何工作的。
--- 在不知何故注意到您谈到可能编写 MTA 后进行编辑 ---
要编写 MTA,您需要打开一个服务器套接字。当有人连接时,您需要按照 SMTP 协议在该套接字上发送和接收文本(ascii)数据。SMTP 非常健谈,因此您可以期待几轮通信。
第一轮通信通常会告诉您是支持 SMTP 还是支持 ESMTP。第二轮(可选)通信是确定安全/加密/功能支持。最终,“客户端”端将要求向特定地址/地址集发送消息。完成后,服务器将指示已准备好获取电子邮件的正文。当邮件正文(以及它的可选附件)全部传输完毕后,MTA 会告诉您它已收到邮件正常。届时,MTA 将充当通过 DNS MX 记录发现的其他 MTA 的客户端,以使您的电子邮件更接近其目标 MTA,从而将其复制到某人的收件箱中。
因此需要 MTA,因为客户端的邮件投递相当于将一封实体信件交给邮局。邮局负责邮局间路由(类似于 MTA 到 MTA 的传输)。然后,目的地邮局负责将信件投递到邮政信箱或家庭地址(与个人计算机收件箱平行)。
他们不会无缘无故地称其为电子邮件。
--- 原始帖子 --- MTA 将接受邮件消息,查看它是否可以转发或投递,如果可以转发或投递,则回复,如果可以转发或投递,则转发或投递。
消息如何更接近其最终目的地通常与 DNS 有关。DNS 中的 MX(邮件交换)记录指示负责(或至少更接近负责的服务器)特定电子邮件域名的服务器。如果不了解 DNS 的工作原理,就不可能完全了解邮件如何更接近其目的地。
MTA 通常会查看投递地址,并且要么被配置为电子邮件地址邮件域的“端点”,要么知道服务器 XYZ 离电子邮件地址的邮件域更近一跳。如果它是一个端点,它会将消息从线路复制到某人的收件箱中。如果它正在中继,它会将消息“转发”到下一个 MTA。
来吧:http ://en.wikipedia.org/wiki/Message_transfer_agent
很快,MTA 接收原始消息,决定它的最终目的地,然后将消息转发到该目的地。
可以编写一个非常简单的 MTA,只发送到本地收件箱。MTA 是系统中“更容易”编写的部分,因为您可能表现不佳但仍然可以正常工作,因此您与其他系统的互操作性不是问题(这就是当今电子邮件的大部分复杂性所在,垃圾邮件/病毒检查)。
MTA 的真正合同很简单,如果您接受系统发送给您的消息,您就承担了传递该消息的责任。因此,当该套接字关闭并确认接受时,交付系统的工作就完成了,一切都在您手中。
如果你碰巧做了一件糟糕的工作,邮件就会丢失,这是你的问题。但是玩起来还是很有趣的。
编辑:我链接到的原始教程已经 404。这是另一个可以的: https ://troubleshootguru.wordpress.com/2014/07/06/mail-server-components-mta-mda-mua/
简而言之,MUA 是使用 SMTP 向 MTA 发送电子邮件的用户客户端。MTA 是负责将 MTA 路由到其目的地的服务器。如果该目的地是另一台服务器,则 MTA 将电子邮件交给 MDA。MDA 是服务器上的一个客户端,它使用 SMTP 将电子邮件转发到另一个服务器,该服务器也是一个 MTA。
那么你需要学习什么?如果要编写 MUA 或 MDA,则需要学习如何打开与另一台计算机的套接字、发送 SMTP 命令和接收 SMTP 响应。如果要编写 MTA,则需要学习如何侦听端口上的套接字连接、接收 SMTP 命令和发送 SMTP 响应。
如果您喜欢 Java,请尝试将此页面上的代码作为客户端的起点。