我正在了解什么是the proper way to send an email from Python code。不过,我在understanding of MX lookup有所进步:“知识岛越大,奇迹的海岸线越长”。
感谢this answer,我能够通过以下代码片段发送电子邮件(尽管是disposable mailbox):
import smtplib
from email.message import EmailMessage
message = EmailMessage()
message.set_content('Content of the message here.')
message['Subject'] = 'Mail sent from code'
message['From'] = '[email protected]'
message['To'] = '[email protected]'
smtplib.SMTP('mail.3mail.rocks:2525')
smtp_server.send_message(message)
smtp_server.quit()
这是我如何提出SMTP地址和端口(mail.3mail.rocks:2525
):
3mail.rocks
域的MX查找:
host -t mx 3mail.rocks
3mail.rocks mail is handled by 10 mail.3mail.rocks.
telnet mail.3mail.rocks xxx
,这给了我以下结果:
telnet mail.3mail.rocks 25
Trying 89.38.99.80...
telnet: connect to address 89.38.99.80: Connection refused
telnet: Unable to connect to remote host
telnet mail.3mail.rocks 465
Trying 89.38.99.80...
telnet: connect to address 89.38.99.80: Operation timed out
telnet: Unable to connect to remote host
telnet mail.3mail.rocks 587
Trying 89.38.99.80...
telnet: connect to address 89.38.99.80: Operation timed out
telnet: Unable to connect to remote host
telnet mail.3mail.rocks 2525
Trying 89.38.99.80...
Connected to mail.3mail.rocks.
Escape character is '^]'.
220 node1 ESMTP Haraka 2.8.16 ready
所以,这就是我如何计算出所需的端口(基本上是蛮力)。我继续测试我在另一个一次性邮件服务(mailforspam.com)上的代码片段,按照相同的步骤 - MX查找(host -t mx mailforspam.com
)返回:
mailforspam.com mail is handled by 10 mail2.mailforspam.com.
mailforspam.com mail is handled by 10 mail1.mailforspam.com.
虽然我无法通过telnet连接(我已经尝试了两个服务器mail2.mailforspam.com
和mail1.mailforspam.com
)到任何默认端口:端口25
- Connection refused
,端口2525
,587
,465
- Operation timed out
。
问题是:
如何为代表特定域(MX查找返回的域)接收邮件的服务器找出正确的端口?
您在问题中显示的内容或多或少是正确的。您可能希望以不同的顺序尝试端口。此外,端口2525
不是我所知道的任何标准的官方端口,但似乎是绕过阻止提交端口587
的防火墙的惯例。
有一点需要注意的是,“接受邮件”实际上并不是一回事。有“邮件用户代理”执行“提交”和“邮件传输代理”进行“转移”。 “提交”和“转移”通常生活在不同的港口,这解释了你所看到的一些多样性。弄清楚您是在进行提交还是转移,并选择适当的端口组。
我的理解是“默认”端口只是约定,事实上,服务器可以使用他们选择的任何自由端口。
这不是真的,至少如果服务器希望任何人都能找到它们,至少不会这样,因为......
这些“真实世界”的服务器如何找出合适的端口(或者它们只是强制通过默认端口)?
实际上希望能够接收邮件的邮件服务器必须在标准端口号上运行。对于MTA来说,这意味着可能会回落到25
端口465
(虽然这也没有标准化)。对于MUA,这意味着端口587
可能回退到2525
(也没有标准化,但显然通常用作阻止MUA的解决方法)。
特别是,MX记录不携带任何端口信息,也没有任何其他与SMTP相关的DNS记录类型。
您获得的MX需要支持端口25,这是SMTP定义的一部分。如果您无法连接,则可能是阻塞在您自己的防火墙中 - 端口25出站被强制阻止来自消费级网络,以试图抑制直接注入垃圾邮件。
授权服务器之间的端口25未被阻止,服务器没有理由或需要找出不同的端口号。