<p>从<a href="https://docs.python.org/3/library/smtplib.html" rel="nofollow noreferrer">https://docs.python.org/3/library/smtplib.html</a></p>
<p>您可以知道<code>connect()</code>需要一个字符串参数<code>host</code>。你知道吗</p>
<blockquote>
<p>An SMTP instance encapsulates an SMTP connection. It has methods that support a full repertoire of SMTP and ESMTP operations. If the optional host and port parameters are given, the SMTP connect() method is called with those parameters during initialization. </p>
</blockquote>
<p><code>connect()</code>可以单击然后重定向到链接,然后您可以看到:</p>
<blockquote>
<p><strong>SMTP.connect(host='localhost', port=0)</strong><br/>
Connect to a host on a given port. The defaults are to connect to the local host at the standard SMTP port (25). If the hostname ends with a colon (':') followed by a number, that suffix will be stripped off and the number interpreted as the port number to use. This method is automatically invoked by the constructor if a host is specified during instantiation. Returns a 2-tuple of the response code and message sent by the server in its connection response. </p>
</blockquote>
<p>在这里您可以知道param<code>host='localhost'</code>默认值是一个字符串。你知道吗</p>
<hr/>
<p><strong>编辑</p>
<p>我查了你的密码</p>
<pre><code>print(type(mxrecords))
</code></pre>
<p>印刷品</p>
<pre><code><class 'dns.name.Name'>
</code></pre>
<p>表示<code>mxrecords</code>对象是<code>dns.name.Name</code>对象,而不是字符串。你知道吗</p>
<p>如果单击<code>connect</code>方法的源代码,您会发现<code>host</code>应该是一个字符串:</p>
<pre><code>def connect(self, host='localhost', port=0, source_address=None):
"""Connect to a host on a given port.
If the hostname ends with a colon (`:') followed by a number, and
there is no port specified, that suffix will be stripped off and the
number interpreted as the port number to use.
Note: This method is automatically invoked by __init__, if a host is
specified during instantiation.
"""
if source_address:
self.source_address = source_address
if not port and (host.find(':') == host.rfind(':')):
i = host.rfind(':')
if i >= 0:
host, port = host[:i], host[i + 1:]
try:
port = int(port)
except ValueError:
raise OSError("nonnumeric port")
if not port:
port = self.default_port
if self.debuglevel > 0:
self._print_debug('connect:', (host, port))
self.sock = self._get_socket(host, port, self.timeout)
self.file = None
(code, msg) = self.getreply()
if self.debuglevel > 0:
self._print_debug('connect:', repr(msg))
return (code, msg)
</code></pre>
<p>在代码中可以找到<code>host.find(':') == host.rfind(':')</code>,它与您的错误相匹配。你知道吗</p>
<hr/>
<p>检查<code>dns.name.Name</code>源代码,您会发现<code>Name</code>类有一个<code>to_text</code>方法:</p>
<pre><code>def to_text(self, omit_final_dot=False):
"""Convert name to text format.
@param omit_final_dot: If True, don't emit the final dot (denoting the
root label) for absolute names. The default is False.
@rtype: string
"""
if len(self.labels) == 0:
return maybe_decode(b'@')
if len(self.labels) == 1 and self.labels[0] == b'':
return maybe_decode(b'.')
if omit_final_dot and self.is_absolute():
l = self.labels[:-1]
else:
l = self.labels
s = b'.'.join(map(_escapify, l))
return maybe_decode(s)
</code></pre>
<p>所以您应该使用<code>mxrecords.to_text()</code>来获取MX服务器名。你知道吗</p>