【发布时间】:2011-06-28 18:11:57
【问题描述】:
question 让我开始思考,现在我意识到我对 MTA 的内部结构一无所知。
MTA 究竟是做什么的? SMTP 协议之后的一切对我来说似乎都是黑魔法。假设我想编写一个简约的 MTA(或 MDA)来发送电子邮件,我需要学习/做什么?
编辑:我实际上并不打算编写 MTA,我只是想了解它在内部是如何工作的。
【问题讨论】:
标签: email service smtp protocols mta
question 让我开始思考,现在我意识到我对 MTA 的内部结构一无所知。
MTA 究竟是做什么的? SMTP 协议之后的一切对我来说似乎都是黑魔法。假设我想编写一个简约的 MTA(或 MDA)来发送电子邮件,我需要学习/做什么?
编辑:我实际上并不打算编写 MTA,我只是想了解它在内部是如何工作的。
【问题讨论】:
标签: email service smtp protocols 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,请尝试将 code on this page 作为客户端的起点。
【讨论】:
--- 在不知何故注意到您谈到可能编写 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 的真正合同很简单,即如果您接受系统发送给您的消息,您将承担传递该消息的责任。因此,当该套接字关闭并确认接受时,交付系统的工作就完成了,一切都在您手中。
如果你碰巧做了一件糟糕的工作,邮件就会丢失,这是你的问题。但是玩起来还是很有趣的。
【讨论】:
HELO test 和 MAIL FROM:<test@test.com> 并得到肯定的响应。
STARTTLS 的同一连接上请求升级到 TLS