【问题标题】:What exactly does an MTA do? [closed]MTA 究竟是做什么的? [关闭]
【发布时间】:2011-06-28 18:11:57
【问题描述】:

question 让我开始思考,现在我意识到我对 MTA 的内部结构一无所知。

MTA 究竟是做什么的? SMTP 协议之后的一切对我来说似乎都是黑魔法。假设我想编写一个简约的 MTA(或 MDA)来发送电子邮件,我需要学习/做什么?

编辑:我实际上并不打算编写 MTA,我只是想了解它在内部是如何工作的。

【问题讨论】:

    标签: email service smtp protocols mta


    【解决方案1】:

    编辑:我链接到的原始教程已变为 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 作为客户端的起点。

    【讨论】:

    • 你的第一个链接失效了
    【解决方案2】:

    --- 在不知何故注意到您谈到可能编写 MTA 后进行编辑---

    要编写 MTA,您需要打开一个服务器套接字。当有人连接时,您需要按照 SMTP 协议在该套接字上发送和接收文本(ascii)数据。 SMTP 非常健谈,因此您可以期待几轮通信。

    第一轮通信通常会告诉您是支持 SMTP 还是支持 ESMTP。第二轮(可选)通信是确定安全/加密/功能支持。最终,“客户端”端将要求向特定地址/地址集发送消息。完成后,服务器将指示已准备好获取电子邮件的正文。当邮件正文(以及它的可选附件)全部传输完毕后,MTA 会告诉您它已收到邮件正常。届时,MTA 将充当通过 DNS MX 记录发现的其他 MTA 的客户端,以使您的电子邮件更接近其目标 MTA,从而将其复制到某人的收件箱中。

    因此需要 MTA,因为客户端的邮件递送相当于将实体信件交给邮局。邮局负责邮局间路由(类似于 MTA 到 MTA 的传输)。然后目的地邮局负责将信件递送到邮政信箱或家庭地址(与个人计算机收件箱平行)。

    他们不会无缘无故地称其为电子邮件邮件

    --- 原帖如下--- MTA 将接受邮件,查看它是否可以转发或投递,如果可以转发或投递,则做出响应,然后在表示可以转发或投递的情况下进行转发。

    邮件如何更接近其最终目的地通常与 DNS 有关。 DNS 中的 MX(邮件交换)记录指示负责(或至少更接近负责的服务器)特定电子邮件域名的服务器。如果不了解 DNS 的工作原理,就不可能完全了解邮件如何更接近其目的地。

    MTA 通常会查看递送地址,并且要么被配置为电子邮件地址邮件域的“端点”,要么知道服务器 XYZ 离电子邮件地址的邮件域更近一跳。如果它是一个端点,它会将消息从线路复制到某人的收件箱中。如果它正在中继,它会将消息“转发”到下一个 MTA。

    【讨论】:

    • 我假设 MTA 在交付地址的域上进行 MX 查找,连接到具有最低 MX 优先级的服务器的特定端口,然后发送遵循特定协议的有效负载,对吧?如果我可以执行手动消息“转发”,我想我会更好地理解这一点,但我不知道我应该连接到哪个端口或发送特定的有效负载......
    • 我了解 SMTP 的工作原理,让我这样说:当我通过本地 MTA 向@gmail 地址发送电子邮件时,邮件已送达 - 我假设我的 MTA 不执行任何类型的操作使用 Gmail 进行身份验证,因为它不知道我的登录凭据。但是,如果我连接到 Gmail SMTP 服务器并有一个完全有效的 SMTP 对话框(忽略身份验证),我的消息将无法通过。我的 MTA 做了哪些我没有做的事情?
    • 您的 MTA 可能会转发到您的 ISP 设置的代理 MTA。该 MTA 可能接受未经身份验证的连接(因为配置每个客户的身份验证会很痛苦)。然后,它将电子邮件中继(相同的客户端-服务器通信)更接近 gmail.com;但是,它可能是通过需要更强身份验证的通道来执行此操作的。这是一种垃圾邮件对抗技术,可防止任何刚刚学习 SMTP 的人编写一个可以向 25 端口发送垃圾邮件的小型客户端。Google(具有讽刺意味的)电子邮件身份验证、域密钥和发件人策略框架。这可能是阻碍你的原因。
    • 如果您设法将以上所有内容添加到您的客户端,我敢打赌您的客户端可以直接连接到 gmail!或者至少,它会有更好的机会:)
    • 请注意,如果您使用 HELO 打开,则某些 MTA 可能会直接拒绝交付,因为上述大部分内容只能通过 ESMTP 获得,这需要 EHLO(我认为)你好。跨度>
    【解决方案3】:

    给你:http://en.wikipedia.org/wiki/Message_transfer_agent

    很快,MTA 接收原始消息,决定它的最终目的地,然后将消息转发到该目的地。

    可以编写一个非常简单的 MTA,只发送到本地收件箱。 MTA 是系统中“更容易”编写的部分,因为您可能表现不佳但仍然可以正常工作,因此您与其他系统的互操作性不是问题(这就是当今电子邮件的大部分复杂性所在,垃圾邮件/病毒检查)。

    MTA 的真正合同很简单,即如果您接受系统发送给您的消息,您将承担传递该消息的责任。因此,当该套接字关闭并确认接受时,交付系统的工作就完成了,一切都在您手中。

    如果你碰巧做了一件糟糕的工作,邮件就会丢失,这是你的问题。但是玩起来还是很有趣的。

    【讨论】:

    • 我想弄清楚它是如何将消息转发到目的地的......肯定有某种协议涉及,不是吗?
    • 一切都取决于目的地,不是吗? MTA 监听服务器上的 SMTP 端口,因此它接受来自客户端(电子邮件程序或其他邮件服务器)的请求。如果消息的最终目的地只是本地收件箱,那么“协议”可以像将消息附加到 mbox 一样简单。如果最终目的地在其他地方(即另一个邮件服务器),那么它很可能会使用 SMTP 来传输邮件。
    • 我尝试在端口 25 和 587 上直接连接到 Google MX 和 SMTP 服务器,然后我根据 SMTP 协议发送了一些数据(没有身份验证,这应该是我本地 MTA 的方式)和消息未送达。使用 MTA 可以,但为什么呢?
    • 为我工作,抱歉 - 连接到 gmail-smtp-in.l.google.com 端口 25。我可以 HELO testMAIL FROM:<test@test.com> 并得到肯定的响应。
    • 啊,对 - 是的,我认为 587 上的 SSL SMTP 是用于发送电子邮件而不是发送。所以这需要身份验证是的。对于 SSL,我认为您在端口 25 上建立一个普通连接,然后在与 STARTTLS 的同一连接上请求升级到 TLS
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多