我正在制作一个程序,该程序应该定期向我发送电子邮件,以便我可以对工作设备进行定期状态检查。我需要使用该程序的计算机在
SMPTHeloError: (501, b'Syntactically invalid HELO argument(s)')
行给出了错误 server.login(from_address, password)
。
当我在我的个人笔记本电脑上测试时,代码执行得很好,当我在另一台计算机上测试时,它也运行得很好。我已经四处寻找解决方案,但我所能找到的只是主机名可能是错误的,但如果我理解正确的话,我认为这不是问题,因为我检查了我的设备名称,它没有任何下划线或无效字符,其结构与我的个人笔记本电脑相同,执行代码没有问题。
这是一些示例Python代码:
import smtplib, ssl
from email.message import EmailMessage
def compile_email():
# Compiles an email to send for regular status updates.
emailMsg = "Email contents"
msg=EmailMessage()
msg['Subject'] = "Status Update"
msg['From'] = "Status Updater <[email protected]>"
msg['To'] = "John Doe <[email protected]>"
msg.set_content(emailMsg)
from_address = '[email protected]'
password = "password"
context = ssl.create_default_context()
with smtplib.SMTP_SSL("mail.domain.com", 465, context=context) as server:
server.set_debuglevel(1)
server.login(from_address, password)
server.send_message(msg)
这是我从中得到的文字记录:
send: 'ehlo DESKTOP-7HJ08AV.NetisRouter_64eeb7fe9daa\r\n'
reply: b'501 Syntactically invalid EHLO argument(s)\r\n'
reply: retcode (501); Msg: b'Syntactically invalid EHLO argument(s)'
send: 'helo DESKTOP-7HJ08AV.NetisRouter_64eeb7fe9daa\r\n'
reply: b'501 Syntactically invalid HELO argument(s)\r\n'
reply: retcode (501); Msg: b'Syntactically invalid HELO argument(s)'
send: 'QUIT\r\n'
reply: b'221 de219.cloudys.net closing connection\r\n'
reply: retcode (221); Msg: b'de219.cloudys.net closing connection'
我不知道这是否重要,但是在包含实际信息而不是占位符的代码中,mail.domain.com 和 from_address 都具有相同的域。
什么可能导致一台计算机出现问题,而其他计算机则不会出现问题?
通过使用调试记录,我发现导致错误的原因确实是主机名中的下划线,但并不是因为设备名称。它似乎在主机名末尾附加了连接特定的 DNS 后缀(并且该后缀中有一个下划线),我需要对其进行编辑以阻止错误再次发生。 这是我用来更改 DNS 后缀的指南。