邮件服务器之间如何用SMTP通信?

初学网络协议,想用TCP/IP实现SMTP协议,模拟邮件服务器发送一封邮件。

我用socket实现tcp连接smtp.126.com的25端口:

发送:HELO mail.xxx.com
回复:220 hz-b-126smtp1.126.com SMTP Server for Netease [466] d003a1fe-000e-4527-9ebd-ea810f0b2af2

发送:MAIL FROM:cyhhao@mail.xxx.com
回复:250 hz-b-126smtp1.126.com a5399bc3-0157-480c-b524-437e08ea34d7

发送:RCPT TO:cyhhao2013@126.com
回复:500 5.5.1 Invalid command a5399bc3-0157-480c-b524-437e08ea34d7

如图:
图片描述

不知道以上发送的指令格式是否有误,欢迎指正……

如果指令格式没错的话,为什么会返回500错误呢?

听说SMTP协议现在一般都是需要“AUTH LOGIN”命令登录的,但是,假如,我作为一个新兴的邮件服务器,向126邮箱发邮件,126总不能要求我登录吧……

我有两个疑问:
1. 邮件服务器之间发送邮件使用SMTP协议,需要登录吗?如果不需要,需要做哪些工作,才能让对方的邮件服务器接受我?
2. 目前主流的各种网络协议有没有中文版的文档?求推荐……

阅读 32.6k
4 个回答

连接一台SMTP服务器的客户端身份有两种

  1. 邮件客户端,一般通过AUTH LOGIN进行认证

  2. 另一个域下的SMTP服务器,不会进行AUTH LOGIN,但是一般现代SMTP服务器都会校验来访者的MX记录与IP是否匹配,这是起码的底线,否则垃圾邮件如何防止?

最近恰好遇到了这个问题,目前采纳的答案是不准确的,更新一个答案留给后来人参考。

题主在描述中提到的,连接到 smtp.126.com 需要 Auth Login
这是因为 smtp.126.com 并不是 126 邮箱的收信服务器,它是用来提供给 126 邮箱用户通过第三方客户端发信的服务器。也就是说这个地址的预期场景是:邮件客户端程序通过认证后,通过该地址以某个 126 邮箱的身份向其他邮箱发邮件。

而题主在标题中描述的,邮件服务器之间如何使用 SMTP 通信,这个场景并不适合使用 smtp.126.com,而是应该连接到 126.com 的收信服务器。
例如我们想要向 126.com 发送邮件,这时候可以直接通过查询 DNS 记录获取到 126.com 的 MX 记录
image.png

如上图可以看到, 126.com 配置了 4 个收信服务器地址,其中 126mx00.mxmail.netease.com 的优先级最高,可以优先连接该服务器。

通过 telnet 连接到该地址,可以看到是不需要 Auth 的,允许直接向 126 邮箱发送邮件。
image.png

命令格式不正确。MAIL和RCPT命令都需要在邮件地址外面加上尖括号。

sunny@sunnyq ~ $ telnet 126mx01.mxmail.netease.com 25
Trying 220.181.14.132...
Connected to 126mx01.mxmail.netease.com.
Escape character is '^]'.
220 126.com Anti-spam GT for Coremail System (126com[20140526])
HELO mail.zhusun.in
250 OK
MAIL FROM:<cyhhao@mail.zhusun.in>
250 Mail OK
RCPT TO:<cyhhao2013@126.com>
250 Mail OK
DATA
354 End data with <CR><LF>.<CR><LF>
http://segmentfault.com/q/1010000002622014
.
451 DT:SPM mx37, 0cmowEDZG0yJnC5VCPWhAw--.1091S2, please try again 1429118148 http://mail.163.com/help/help_spam_16.htm?ip=70.184.75.125&hostid=mx37&time=1429118148
Connection closed by foreign host.
推荐问题
宣传栏