直接通过主机的MX记录发送SMTP

5 投票
2 回答
3637 浏览
提问于 2025-04-17 01:22

我在用Python玩SMTP协议,想多了解一下这个东西。具体来说,我想直接给一个主机的SMTP服务器发邮件,但一直没成功。

比如说,我想给一个gmail.com的邮箱发邮件,我先查一下gmail.com的MX记录:

>> nslookup -type=MX gmail.com
gmail.com       MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
gmail.com       MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com       MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com

然后我在Python里做了以下操作:

import smtplib
# Tried both port 465 and 587 (can't test port 25 since it's blocked by my ISP)
s = smtplib.SMTP("alt1.gmail-smtp-in.l.google.com", 587) 

我试了好几次,除了一个例外,其他的都出现了以下错误:
"[Errno 10051] 尝试进行的套接字操作无法到达网络" 或者
"[Errno 10060] 连接尝试失败,因为连接方在一段时间内没有正确响应,或者建立的连接失败,因为连接的主机没有响应"

我看到有些地方说,有些邮件服务器会对你的IP进行反向查找,如果没有域名就会拒绝连接。他们是怎么做到的?
我还看到有些地方说,很多邮件服务器会拒绝来自动态IP地址的邮件(我作为个人用户显然是用的动态IP)。他们是怎么判断一个IP地址是动态的还是静态的?

这些是不是大多数服务器拒绝我连接的原因?还是说还有其他原因?

2 个回答

0

像你上面描述的那样,直接发送邮件到MX服务器会被Gmail的SMTP服务器挡住,错误信息是"421-4.7.0"。不过,很多其他的SMTP服务器,比如MailEnable,就允许直接发送到MX。

下面这个网站提供了.NET和PHP的直接发送到MX的源代码,http://www.directtomx.com。你也可以尝试用SUDS在Python中调用这个网络服务。

4

嗯,你的问题正是这个:

# Tried both port 465 and 587 (can't test port 25 since it's blocked by my ISP)

谷歌的邮件服务器在25号端口上监听。如果你的网络服务提供商(ISP)不允许在这个端口上发起连接,那么你就无法按照你现在的方式发送SMTP邮件。你需要和你的网络服务提供商解决这个问题。

关于邮件被拒绝的情况,像这样直接发送邮件确实会增加被拒绝或被标记为垃圾邮件的可能性。特别是如果你设置的“发件人”地址和你的IP地址关联的域名不匹配,或者如果你的SMTP客户端在EHLO消息中发送了不匹配的域名,或者如果你的邮件内容看起来像“垃圾邮件”。具体的表现会根据每个邮件服务器的配置而有所不同。

撰写回答