Files
hustoj/web/python-docs/library/smtplib.html
2025-03-09 17:10:56 +08:00

632 lines
71 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>smtplib --- SMTP 协议客户端 &#8212; Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<script src="../_static/translations.js"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="在 Python 3.8.20 文档 中搜索"
href="../_static/opensearch.xml"/>
<link rel="author" title="关于这些文档" href="../about.html" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
<link rel="copyright" title="版权所有" href="../copyright.html" />
<link rel="next" title="smtpd --- SMTP 服务器" href="smtpd.html" />
<link rel="prev" title="nntplib --- NNTP 协议客户端" href="nntplib.html" />
<link rel="canonical" href="https://docs.python.org/3/library/smtplib.html" />
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<nav class="nav-content" role="navigation">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Logo"/>
</a>
<div class="version_switcher_placeholder"></div>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero"
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
</svg>
<input type="text" name="q" aria-label="快速搜索"/>
<input type="submit" value="转向"/>
</form>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code> --- SMTP 协议客户端</a><ul>
<li><a class="reference internal" href="#smtp-objects">SMTP 对象</a></li>
<li><a class="reference internal" href="#smtp-example">SMTP 示例</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="nntplib.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">nntplib</span></code> --- NNTP 协议客户端</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="smtpd.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtpd</span></code> --- SMTP 服务器</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/smtplib.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
这个文档所针对的是一个已不再受支持的 Python 旧版本。
你应当升级版本,并阅读
<a href="/3/library/smtplib.html"> Python 当前稳定版本的文档</a>.
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
accesskey="I">索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="smtpd.html" title="smtpd --- SMTP 服务器"
accesskey="N">下一页</a> |</li>
<li class="right" >
<a href="nntplib.html" title="nntplib --- NNTP 协议客户端"
accesskey="P">上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="internet.html" accesskey="U">互联网协议和支持</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-smtplib">
<span id="smtplib-smtp-protocol-client"></span><h1><a class="reference internal" href="#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> --- SMTP 协议客户端<a class="headerlink" href="#module-smtplib" title="永久链接至标题"></a></h1>
<p><strong>源代码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/smtplib.py">Lib/smtplib.py</a></p>
<hr class="docutils" id="index-0" />
<p><a class="reference internal" href="#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> 模块定义了一个 SMTP 客户端会话对象,该对象可将邮件发送到 Internet 上带有 SMTP 或 ESMTP 接收程序的计算机。 关于 SMTP 和 ESMTP 操作的详情请参阅 <span class="target" id="index-25"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc821.html"><strong>RFC 821</strong></a> (简单邮件传输协议) 和 <span class="target" id="index-26"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc1869.html"><strong>RFC 1869</strong></a> (SMTP 服务扩展)。</p>
<dl class="class">
<dt id="smtplib.SMTP">
<em class="property">class </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTP</code><span class="sig-paren">(</span><em class="sig-param">host=''</em>, <em class="sig-param">port=0</em>, <em class="sig-param">local_hostname=None</em>, <span class="optional">[</span><em class="sig-param">timeout</em>, <span class="optional">]</span><em class="sig-param">source_address=None</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP" title="永久链接至目标"></a></dt>
<dd><p>一个 <a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 实例就是一个封装好的 SMTP 连接。该实例具有的方法支持所有 SMTP 和 ESMTP 操作。如果传入了可选参数 host 和 port那么将在初始化时使用这些参数调用 SMTP <a class="reference internal" href="#smtplib.SMTP.connect" title="smtplib.SMTP.connect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">connect()</span></code></a> 方法。如果传入了 <em>local_hostname</em>,它将在 HELO/EHLO 命令中被用作本地主机的 FQDN。否则将使用 <a class="reference internal" href="socket.html#socket.getfqdn" title="socket.getfqdn"><code class="xref py py-func docutils literal notranslate"><span class="pre">socket.getfqdn()</span></code></a> 找到本地主机名。如果 <a class="reference internal" href="#smtplib.SMTP.connect" title="smtplib.SMTP.connect"><code class="xref py py-meth docutils literal notranslate"><span class="pre">connect()</span></code></a> 返回了成功码以外的内容,则引发 <a class="reference internal" href="#smtplib.SMTPConnectError" title="smtplib.SMTPConnectError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPConnectError</span></code></a> 异常。可选参数 <em>timeout</em> 指定阻塞操作(如连接尝试)的超时(以秒为单位,如果未指定超时,将使用全局默认超时设置)。到达超时时长后会引发 <a class="reference internal" href="socket.html#socket.timeout" title="socket.timeout"><code class="xref py py-exc docutils literal notranslate"><span class="pre">socket.timeout</span></code></a> 异常。可选参数 source_address 允许在有多张网卡的计算机中绑定到某些特定的源地址,和/或绑定到某些特定的源 TCP 端口。在连接前,套接字需要绑定一个 2 元组 (host, port) 作为其源地址。如果省略,或者是主机为 <code class="docutils literal notranslate"><span class="pre">''</span></code> 和/或端口为 0则将使用操作系统默认行为。</p>
<p>正常使用时,只需要初始化或 connect 方法,<a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmail()</span></code></a> 方法,再加上 <a class="reference internal" href="#smtplib.SMTP.quit" title="smtplib.SMTP.quit"><code class="xref py py-meth docutils literal notranslate"><span class="pre">SMTP.quit()</span></code></a> 方法即可。下文包括了一个示例。</p>
<p><a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 类支持 <a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a> 语句。当这样使用时,<code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code> 语句一退出就会自动发出 SMTP <code class="docutils literal notranslate"><span class="pre">QUIT</span></code> 命令。例如:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">smtplib</span> <span class="kn">import</span> <span class="n">SMTP</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="n">SMTP</span><span class="p">(</span><span class="s2">&quot;domain.org&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">smtp</span><span class="p">:</span>
<span class="gp">... </span> <span class="n">smtp</span><span class="o">.</span><span class="n">noop</span><span class="p">()</span>
<span class="gp">...</span>
<span class="go">(250, b&#39;Ok&#39;)</span>
<span class="gp">&gt;&gt;&gt;</span>
</pre></div>
</div>
<p class="audit-hook">引发一个 <a class="reference internal" href="sys.html#auditing"><span class="std std-ref">审计事件</span></a> <code class="docutils literal notranslate"><span class="pre">smtplib.send</span></code>,附带参数 <code class="docutils literal notranslate"><span class="pre">self</span></code>, <code class="docutils literal notranslate"><span class="pre">data</span></code></p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>添加了对 <a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">with</span></code></a> 语句的支持。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>添加了 source_address 参数。</p>
</div>
<div class="versionadded">
<p><span class="versionmodified added">3.5 新版功能: </span>现在已支持 SMTPUTF8 扩展 (<span class="target" id="index-27"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc6531.html"><strong>RFC 6531</strong></a>)。</p>
</div>
</dd></dl>
<dl class="class">
<dt id="smtplib.SMTP_SSL">
<em class="property">class </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTP_SSL</code><span class="sig-paren">(</span><em class="sig-param">host=''</em>, <em class="sig-param">port=0</em>, <em class="sig-param">local_hostname=None</em>, <em class="sig-param">keyfile=None</em>, <em class="sig-param">certfile=None</em>, <span class="optional">[</span><em class="sig-param">timeout</em>, <span class="optional">]</span><em class="sig-param">context=None</em>, <em class="sig-param">source_address=None</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP_SSL" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="#smtplib.SMTP_SSL" title="smtplib.SMTP_SSL"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP_SSL</span></code></a> 实例与 <a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 实例的行为完全相同。在开始连接就需要 SSL<code class="xref py py-meth docutils literal notranslate"><span class="pre">starttls()</span></code> 不适合的情况下,应该使用 <a class="reference internal" href="#smtplib.SMTP_SSL" title="smtplib.SMTP_SSL"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP_SSL</span></code></a>。如果未指定 <em>host</em>,则使用 localhost。如果 <em>port</em> 为 0则使用标准 SMTP-over-SSL 端口465。可选参数 <em>local_hostname</em><em>timeout</em><em>source_address</em> 的含义与 <a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 类中的相同。可选参数 <em>context</em> 是一个 <a class="reference internal" href="ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">SSLContext</span></code></a> 对象,可以从多个方面配置安全连接。请阅读 <a class="reference internal" href="ssl.html#ssl-security"><span class="std std-ref">安全考量</span></a> 以获取最佳实践。</p>
<p><em>keyfile</em><em>certfile</em><em>context</em> 的传统替代物,它们可以指向 PEM 格式的私钥和证书链文件用于 SSL 连接。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>增加了 <em>context</em></p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>添加了 source_address 参数。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.4 版更改: </span>本类现在支持使用 <a class="reference internal" href="ssl.html#ssl.SSLContext.check_hostname" title="ssl.SSLContext.check_hostname"><code class="xref py py-attr docutils literal notranslate"><span class="pre">ssl.SSLContext.check_hostname</span></code></a><em>服务器名称指示</em> (参阅 <a class="reference internal" href="ssl.html#ssl.HAS_SNI" title="ssl.HAS_SNI"><code class="xref py py-data docutils literal notranslate"><span class="pre">ssl.HAS_SNI</span></code></a>)进行主机名检查。</p>
</div>
<div class="deprecated">
<p><span class="versionmodified deprecated">3.6 版后已移除: </span><em>keyfile</em><em>certfile</em> 已弃用并转而推荐 <em>context</em>。 请改用 <a class="reference internal" href="ssl.html#ssl.SSLContext.load_cert_chain" title="ssl.SSLContext.load_cert_chain"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ssl.SSLContext.load_cert_chain()</span></code></a> 或让 <a class="reference internal" href="ssl.html#ssl.create_default_context" title="ssl.create_default_context"><code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.create_default_context()</span></code></a> 为你选择系统所信任的 CA 证书。</p>
</div>
</dd></dl>
<dl class="class">
<dt id="smtplib.LMTP">
<em class="property">class </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">LMTP</code><span class="sig-paren">(</span><em class="sig-param">host=''</em>, <em class="sig-param">port=LMTP_PORT</em>, <em class="sig-param">local_hostname=None</em>, <em class="sig-param">source_address=None</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.LMTP" title="永久链接至目标"></a></dt>
<dd><p>LMTP 协议与 ESMTP 非常相似,它很大程度上基于标准的 SMTP 客户端。将 Unix 套接字用于 LMTP 是很常见的,因此 <code class="xref py py-meth docutils literal notranslate"><span class="pre">connect()</span></code> 方法支持 Unix 套接字,也支持常规的 host:port 服务器。可选参数 local_hostname 和 source_address 的含义与 <a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 类中的相同。要指定 Unix 套接字,<em>host</em> 必须使用绝对路径,以 '/' 开头。</p>
<p>支持使用常规的 SMTP 机制来进行认证。 当使用 Unix 套接字时LMTP 通常不支持或要求任何认证,但你的情况可能会有所不同。</p>
</dd></dl>
<p>同样地定义了一组精心选择的异常:</p>
<dl class="exception">
<dt id="smtplib.SMTPException">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPException</code><a class="headerlink" href="#smtplib.SMTPException" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OSError</span></code></a> 的子类,它是本模块提供的所有其他异常的基类。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.4 版更改: </span>SMTPException 已成为 <a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OSError</span></code></a> 的子类</p>
</div>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPServerDisconnected">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPServerDisconnected</code><a class="headerlink" href="#smtplib.SMTPServerDisconnected" title="永久链接至目标"></a></dt>
<dd><p>当服务器意外断开连接,或在 <a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 实例连接到服务器之前尝试使用它时将引发此异常。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPResponseException">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPResponseException</code><a class="headerlink" href="#smtplib.SMTPResponseException" title="永久链接至目标"></a></dt>
<dd><p>包括 SMTP 错误代码的所有异常的基类。 这些异常会在 SMTP 服务器返回错误代码时在实例中生成。 错误代码存放在错误的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">smtp_code</span></code> 属性中,并且 <code class="xref py py-attr docutils literal notranslate"><span class="pre">smtp_error</span></code> 属性会被设为错误消息。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPSenderRefused">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPSenderRefused</code><a class="headerlink" href="#smtplib.SMTPSenderRefused" title="永久链接至目标"></a></dt>
<dd><p>发送方地址被拒绝。 除了在所有 <a class="reference internal" href="#smtplib.SMTPResponseException" title="smtplib.SMTPResponseException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPResponseException</span></code></a> 异常上设置的属性,还会将 'sender' 设为代表拒绝方 SMTP 服务器的字符串。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPRecipientsRefused">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPRecipientsRefused</code><a class="headerlink" href="#smtplib.SMTPRecipientsRefused" title="永久链接至目标"></a></dt>
<dd><p>所有接收方地址被拒绝。 每个接收方的错误可通过属性 <code class="xref py py-attr docutils literal notranslate"><span class="pre">recipients</span></code> 来访问,该属性是一个字典,其元素顺序与 <a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">SMTP.sendmail()</span></code></a> 所返回的一致。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPDataError">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPDataError</code><a class="headerlink" href="#smtplib.SMTPDataError" title="永久链接至目标"></a></dt>
<dd><p>SMTP 服务器拒绝接收消息数据。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPConnectError">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPConnectError</code><a class="headerlink" href="#smtplib.SMTPConnectError" title="永久链接至目标"></a></dt>
<dd><p>在建立与服务器的连接期间发生了错误。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPHeloError">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPHeloError</code><a class="headerlink" href="#smtplib.SMTPHeloError" title="永久链接至目标"></a></dt>
<dd><p>服务器拒绝了我们的 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 消息。</p>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPNotSupportedError">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPNotSupportedError</code><a class="headerlink" href="#smtplib.SMTPNotSupportedError" title="永久链接至目标"></a></dt>
<dd><p>尝试的命令或选项不被服务器所支持。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.5 新版功能.</span></p>
</div>
</dd></dl>
<dl class="exception">
<dt id="smtplib.SMTPAuthenticationError">
<em class="property">exception </em><code class="sig-prename descclassname">smtplib.</code><code class="sig-name descname">SMTPAuthenticationError</code><a class="headerlink" href="#smtplib.SMTPAuthenticationError" title="永久链接至目标"></a></dt>
<dd><p>SMTP 认证出现问题。 最大的可能是服务器不接受所提供的用户名/密码组合。</p>
</dd></dl>
<div class="admonition seealso">
<p class="admonition-title">参见</p>
<dl class="simple">
<dt><span class="target" id="index-28"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc821.html"><strong>RFC 821</strong></a> - 简单邮件传输协议</dt><dd><p>SMTP 的协议定义。 该文件涵盖了 SMTP 的模型、操作程序和协议细节。</p>
</dd>
<dt><span class="target" id="index-29"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc1869.html"><strong>RFC 1869</strong></a> - SMTP 服务扩展</dt><dd><p>定义了 SMTP 的 ESMTP 扩展。 这描述了一个用新命令扩展 SMTP 的框架,支持动态发现服务器所提供的命令,并定义了一些额外的命令。</p>
</dd>
</dl>
</div>
<section id="smtp-objects">
<span id="id1"></span><h2>SMTP 对象<a class="headerlink" href="#smtp-objects" title="永久链接至标题"></a></h2>
<p>一个 <a class="reference internal" href="#smtplib.SMTP" title="smtplib.SMTP"><code class="xref py py-class docutils literal notranslate"><span class="pre">SMTP</span></code></a> 实例拥有以下方法:</p>
<dl class="method">
<dt id="smtplib.SMTP.set_debuglevel">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">set_debuglevel</code><span class="sig-paren">(</span><em class="sig-param">level</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.set_debuglevel" title="永久链接至目标"></a></dt>
<dd><p>设置调试输出级别。 如果 <em>level</em> 的值为 1 或 <code class="docutils literal notranslate"><span class="pre">True</span></code> ,就会产生连接的调试信息,以及所有发送和接收服务器的信息。 如果 <em>level</em> 的值为 2 ,则这些信息会被加上时间戳。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>添调试级别 2 。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.docmd">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">docmd</code><span class="sig-paren">(</span><em class="sig-param">cmd</em>, <em class="sig-param">args=''</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.docmd" title="永久链接至目标"></a></dt>
<dd><p>向服务器发送一条命令 <em>cmd</em> 。 可选的参数 <em>args</em> 被简单地串联到命令中,用一个空格隔开。</p>
<p>这将返回一个由数字响应代码和实际响应行组成的2元组多行响应被连接成一个长行</p>
<p>在正常操作中,应该没有必要明确地调用这个方法。它被用来实现其他方法,对于测试私有扩展可能很有用。</p>
<p>如果在等待回复的过程中,与服务器的连接丢失, <a class="reference internal" href="#smtplib.SMTPServerDisconnected" title="smtplib.SMTPServerDisconnected"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPServerDisconnected</span></code></a> 将被触发。</p>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.connect">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">connect</code><span class="sig-paren">(</span><em class="sig-param">host='localhost'</em>, <em class="sig-param">port=0</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.connect" title="永久链接至目标"></a></dt>
<dd><p>连接到某个主机的某个端口。默认是连接到 localhost 的标准 SMTP 端口25上。如果主机名以冒号 (<code class="docutils literal notranslate"><span class="pre">':'</span></code>) 结尾,后跟数字,则该后缀将被删除,且数字将视作要使用的端口号。如果在实例化时指定了 host则构造函数会自动调用本方法。返回包含响应码和响应消息的 2 元组,它们由服务器在其连接响应中发送。</p>
<p class="audit-hook">引发一个 <a class="reference internal" href="sys.html#auditing"><span class="std std-ref">审计事件</span></a> <code class="docutils literal notranslate"><span class="pre">smtplib.connect</span></code> 并附带参数 <code class="docutils literal notranslate"><span class="pre">self</span></code>, <code class="docutils literal notranslate"><span class="pre">host</span></code>, <code class="docutils literal notranslate"><span class="pre">port</span></code></p>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.helo">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">helo</code><span class="sig-paren">(</span><em class="sig-param">name=''</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.helo" title="永久链接至目标"></a></dt>
<dd><p>使用 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 向 SMTP 服务器表明自己的身份。 hostname 参数默认为本地主机的完全合格域名。服务器返回的消息被存储为对象的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">helo_resp</span></code> 属性。</p>
<p>在正常操作中,应该没有必要明确调用这个方法。它将在必要时被 <a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmail()</span></code></a> 隐式调用。</p>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.ehlo">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">ehlo</code><span class="sig-paren">(</span><em class="sig-param">name=''</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.ehlo" title="永久链接至目标"></a></dt>
<dd><p>使用 <code class="docutils literal notranslate"><span class="pre">EHLO</span></code> 向 ESMTP 服务器标识自身。hostname 参数默认为 localhost 的标准域名。使用 <a class="reference internal" href="#smtplib.SMTP.has_extn" title="smtplib.SMTP.has_extn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">has_extn()</span></code></a> 来检查响应中的 ESMTP 选项,并将它们保存起来。还给一些信息性的属性赋值:服务器返回的消息存储为 <code class="xref py py-attr docutils literal notranslate"><span class="pre">ehlo_resp</span></code> 属性;根据服务器是否支持 ESMTP<code class="xref py py-attr docutils literal notranslate"><span class="pre">does_esmtp</span></code> 设置为 true 或 false<code class="xref py py-attr docutils literal notranslate"><span class="pre">esmtp_features</span></code> 是一个字典,包含该服务器支持的 SMTP 服务扩展的名称及参数(如果有参数)。</p>
<p>除非你想在发送邮件前使用 <a class="reference internal" href="#smtplib.SMTP.has_extn" title="smtplib.SMTP.has_extn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">has_extn()</span></code></a> ,否则应该没有必要明确调用这个方法。 它将在必要时被 <a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmail()</span></code></a> 隐式调用。</p>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.ehlo_or_helo_if_needed">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">ehlo_or_helo_if_needed</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.ehlo_or_helo_if_needed" title="永久链接至目标"></a></dt>
<dd><p>如果这个会话中没有先前的 <code class="docutils literal notranslate"><span class="pre">EHLO</span></code><code class="docutils literal notranslate"><span class="pre">HELO</span></code> 命令,该方法会调用 <a class="reference internal" href="#smtplib.SMTP.ehlo" title="smtplib.SMTP.ehlo"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ehlo()</span></code></a> 和/或 <a class="reference internal" href="#smtplib.SMTP.helo" title="smtplib.SMTP.helo"><code class="xref py py-meth docutils literal notranslate"><span class="pre">helo()</span></code></a> 。它首先尝试 ESMTP <code class="docutils literal notranslate"><span class="pre">EHLO</span></code></p>
<dl class="simple">
<dt><a class="reference internal" href="#smtplib.SMTPHeloError" title="smtplib.SMTPHeloError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPHeloError</span></code></a></dt><dd><p>服务器没有正确回复 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 问候。</p>
</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.has_extn">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">has_extn</code><span class="sig-paren">(</span><em class="sig-param">name</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.has_extn" title="永久链接至目标"></a></dt>
<dd><p>如果 <em>name</em> 在服务器返回的 SMTP 服务扩展集合中,返回 <a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-const docutils literal notranslate"><span class="pre">True</span></code></a> ,否则为 <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal notranslate"><span class="pre">False</span></code></a> 。大小写被忽略。</p>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.verify">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">verify</code><span class="sig-paren">(</span><em class="sig-param">address</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.verify" title="永久链接至目标"></a></dt>
<dd><p>使用 SMTP <code class="docutils literal notranslate"><span class="pre">VRFY</span></code> 检查此服务器上的某个地址是否有效。 如果用户地址有效则返回一个由代码 250 和完整 <span class="target" id="index-30"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc822.html"><strong>RFC 822</strong></a> 地址(包括人名)组成的元组。 否则返回 400 或更大的 SMTP 错误代码以及一个错误字符串。</p>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p>许多网站都禁用 SMTP <code class="docutils literal notranslate"><span class="pre">VRFY</span></code> 以阻止垃圾邮件。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.login">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">login</code><span class="sig-paren">(</span><em class="sig-param">user</em>, <em class="sig-param">password</em>, <em class="sig-param">*</em>, <em class="sig-param">initial_response_ok=True</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.login" title="永久链接至目标"></a></dt>
<dd><p>登录到一个需要认证的 SMTP 服务器。 参数是用于认证的用户名和密码。 如果会话在之前没有执行过 <code class="docutils literal notranslate"><span class="pre">EHLO</span></code><code class="docutils literal notranslate"><span class="pre">HELO</span></code> 命令,此方法会先尝试 ESMTP <code class="docutils literal notranslate"><span class="pre">EHLO</span></code>。 如果认证成功则此方法将正常返回,否则可能引发以下异常:</p>
<dl class="simple">
<dt><a class="reference internal" href="#smtplib.SMTPHeloError" title="smtplib.SMTPHeloError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPHeloError</span></code></a></dt><dd><p>服务器没有正确回复 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 问候。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPAuthenticationError" title="smtplib.SMTPAuthenticationError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPAuthenticationError</span></code></a></dt><dd><p>服务器不接受所提供的用户名/密码组合。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPNotSupportedError" title="smtplib.SMTPNotSupportedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupportedError</span></code></a></dt><dd><p>服务器不支持 <code class="docutils literal notranslate"><span class="pre">AUTH</span></code> 命令。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPException" title="smtplib.SMTPException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPException</span></code></a></dt><dd><p>未找到适当的认证方法。</p>
</dd>
</dl>
<p><a class="reference internal" href="#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> 所支持的每种认证方法只要被服务器声明支持就会被依次尝试。 请参阅 <a class="reference internal" href="#smtplib.SMTP.auth" title="smtplib.SMTP.auth"><code class="xref py py-meth docutils literal notranslate"><span class="pre">auth()</span></code></a> 获取受支持的认证方法列表。 <em>initial_response_ok</em> 会被传递给 <a class="reference internal" href="#smtplib.SMTP.auth" title="smtplib.SMTP.auth"><code class="xref py py-meth docutils literal notranslate"><span class="pre">auth()</span></code></a></p>
<p>可选的关键字参数 <em>initial_response_ok</em> 对于支持它的认证方法,是否可以与 <code class="docutils literal notranslate"><span class="pre">AUTH</span></code> 命令一起发送 <span class="target" id="index-31"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc4954.html"><strong>RFC 4954</strong></a> 中所规定的“初始响应”,而不是要求回复/响应。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>可能会引发 <a class="reference internal" href="#smtplib.SMTPNotSupportedError" title="smtplib.SMTPNotSupportedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupportedError</span></code></a>,并添加 <em>initial_response_ok</em> 形参。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.auth">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">auth</code><span class="sig-paren">(</span><em class="sig-param">mechanism</em>, <em class="sig-param">authobject</em>, <em class="sig-param">*</em>, <em class="sig-param">initial_response_ok=True</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.auth" title="永久链接至目标"></a></dt>
<dd><p>为指定的认证机制 <em>mechanism</em> 发送 <code class="docutils literal notranslate"><span class="pre">SMTP</span></code> <code class="docutils literal notranslate"><span class="pre">AUTH</span></code> 命令,并通过 <em>authobject</em> 处理回复响应。</p>
<p><em>mechanism</em> 指定要使用何种认证机制作为 <code class="docutils literal notranslate"><span class="pre">AUTH</span></code> 命令的参数;可用的值是在 <code class="xref py py-attr docutils literal notranslate"><span class="pre">esmtp_features</span></code><code class="docutils literal notranslate"><span class="pre">auth</span></code> 元素中列出的内容。</p>
<p><em>authobject</em> 必须是接受一个可选的单独参数的可调用对象:</p>
<blockquote>
<div><p>data = authobject(challenge=None)</p>
</div></blockquote>
<p>如果可选的关键字参数 <em>initial_response_ok</em> 为真值,则将先不带参数地调用 <code class="docutils literal notranslate"><span class="pre">authobject()</span></code>。 它可以返回 <span class="target" id="index-32"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc4954.html"><strong>RFC 4954</strong></a> &quot;初始响应&quot; ASCII <code class="docutils literal notranslate"><span class="pre">str</span></code>,其内容将被编码并使用下述的 <code class="docutils literal notranslate"><span class="pre">AUTH</span></code> 命令来发送。 如果 <code class="docutils literal notranslate"><span class="pre">authobject()</span></code> 不支持初始响应(例如由于要求一个回复),它应当将 <code class="docutils literal notranslate"><span class="pre">None</span></code> 作为附带 <code class="docutils literal notranslate"><span class="pre">challenge=None</span></code> 调用的返回值。 如果 <em>initial_response_ok</em> 为假值,则 <code class="docutils literal notranslate"><span class="pre">authobject()</span></code> 将不会附带 <code class="docutils literal notranslate"><span class="pre">None</span></code> 被首先调用。</p>
<p>如果初始响应检测返回了 <code class="docutils literal notranslate"><span class="pre">None</span></code>,或者如果 <em>initial_response_ok</em> 为假值,则将调用 <code class="docutils literal notranslate"><span class="pre">authobject()</span></code> 来处理服务器的回复响应;它所传递的 <em>challenge</em> 参数将为一个 <code class="docutils literal notranslate"><span class="pre">bytes</span></code>。 它应当返回用 base64 进行编码的 ASCII <code class="docutils literal notranslate"><span class="pre">str</span></code> <em>data</em> 并发送给服务器。</p>
<p><code class="docutils literal notranslate"><span class="pre">SMTP</span></code> 类提供的 <code class="docutils literal notranslate"><span class="pre">authobjects</span></code> 针对 <code class="docutils literal notranslate"><span class="pre">CRAM-MD5</span></code>, <code class="docutils literal notranslate"><span class="pre">PLAIN</span></code><code class="docutils literal notranslate"><span class="pre">LOGIN</span></code> 等机制;它们的名称分别是 <code class="docutils literal notranslate"><span class="pre">SMTP.auth_cram_md5</span></code>, <code class="docutils literal notranslate"><span class="pre">SMTP.auth_plain</span></code><code class="docutils literal notranslate"><span class="pre">SMTP.auth_login</span></code>。 它们都要求将 <code class="docutils literal notranslate"><span class="pre">user</span></code><code class="docutils literal notranslate"><span class="pre">password</span></code> 这两个 <code class="docutils literal notranslate"><span class="pre">SMTP</span></code> 实例属性设为适当的值。</p>
<p>用户代码通常不需要直接调用 <code class="docutils literal notranslate"><span class="pre">auth</span></code>,而是调用 <a class="reference internal" href="#smtplib.SMTP.login" title="smtplib.SMTP.login"><code class="xref py py-meth docutils literal notranslate"><span class="pre">login()</span></code></a> 方法,它将按上述顺序依次尝试上述每一种机制。 <code class="docutils literal notranslate"><span class="pre">auth</span></code> 被公开以便辅助实现 <a class="reference internal" href="#module-smtplib" title="smtplib: SMTP protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code></a> 没有(或尚未)直接支持的认证方法。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.5 新版功能.</span></p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.starttls">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">starttls</code><span class="sig-paren">(</span><em class="sig-param">keyfile=None</em>, <em class="sig-param">certfile=None</em>, <em class="sig-param">context=None</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.starttls" title="永久链接至目标"></a></dt>
<dd><p>将 SMTP 连接设为 TLS (传输层安全) 模式。 后续的所有 SMTP 命令都将被加密。 你应当随即再次调用 <a class="reference internal" href="#smtplib.SMTP.ehlo" title="smtplib.SMTP.ehlo"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ehlo()</span></code></a></p>
<p>如果提供了 <em>keyfile</em><em>certfile</em>,它们会被用来创建 <a class="reference internal" href="ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext</span></code></a></p>
<p>可选的 <em>context</em> 形参是一个 <a class="reference internal" href="ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext</span></code></a> 对象;它是使用密钥文件和证书的替代方式,如果指定了该形参则 <em>keyfile</em><em>certfile</em> 都应为 <code class="docutils literal notranslate"><span class="pre">None</span></code></p>
<p>如果这个会话中没有先前的 <code class="docutils literal notranslate"><span class="pre">EHLO</span></code> or <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 命令,该方法会首先尝试 ESMTP <code class="docutils literal notranslate"><span class="pre">EHLO</span></code></p>
<div class="deprecated">
<p><span class="versionmodified deprecated">3.6 版后已移除: </span><em>keyfile</em><em>certfile</em> 已弃用并转而推荐 <em>context</em>。 请改用 <a class="reference internal" href="ssl.html#ssl.SSLContext.load_cert_chain" title="ssl.SSLContext.load_cert_chain"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ssl.SSLContext.load_cert_chain()</span></code></a> 或让 <a class="reference internal" href="ssl.html#ssl.create_default_context" title="ssl.create_default_context"><code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.create_default_context()</span></code></a> 为你选择系统所信任的 CA 证书。</p>
</div>
<dl class="simple">
<dt><a class="reference internal" href="#smtplib.SMTPHeloError" title="smtplib.SMTPHeloError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPHeloError</span></code></a></dt><dd><p>服务器没有正确回复 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 问候。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPNotSupportedError" title="smtplib.SMTPNotSupportedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupportedError</span></code></a></dt><dd><p>服务器不支持 STARTTLS 扩展。</p>
</dd>
<dt><a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">RuntimeError</span></code></a></dt><dd><p>SSL/TLS 支持在你的 Python 解释器上不可用。</p>
</dd>
</dl>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>增加了 <em>context</em></p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.4 版更改: </span>此方法现在支持使用 <code class="xref py py-attr docutils literal notranslate"><span class="pre">SSLContext.check_hostname</span></code><em>服务器名称指示符</em> (参见 <a class="reference internal" href="ssl.html#ssl.HAS_SNI" title="ssl.HAS_SNI"><code class="xref py py-data docutils literal notranslate"><span class="pre">HAS_SNI</span></code></a>) 进行主机名检查。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>因缺少 STARTTLS 支持而引发的错误现在是 <a class="reference internal" href="#smtplib.SMTPNotSupportedError" title="smtplib.SMTPNotSupportedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupportedError</span></code></a> 子类而不是 <a class="reference internal" href="#smtplib.SMTPException" title="smtplib.SMTPException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPException</span></code></a> 基类。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.sendmail">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">sendmail</code><span class="sig-paren">(</span><em class="sig-param">from_addr</em>, <em class="sig-param">to_addrs</em>, <em class="sig-param">msg</em>, <em class="sig-param">mail_options=()</em>, <em class="sig-param">rcpt_options=()</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.sendmail" title="永久链接至目标"></a></dt>
<dd><p>发送邮件。必要参数是一个 <span class="target" id="index-33"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc822.html"><strong>RFC 822</strong></a> 发件地址字符串,一个 <span class="target" id="index-34"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc822.html"><strong>RFC 822</strong></a> 收件地址字符串列表(裸字符串将被视为含有 1 个地址的列表),以及一个消息字符串。调用者可以将 ESMTP 选项列表(如 <code class="docutils literal notranslate"><span class="pre">8bitmime</span></code>)作为 <em>mail_options</em> 传入,用于 <code class="docutils literal notranslate"><span class="pre">MAIL</span> <span class="pre">FROM</span></code> 命令。需要与所有 <code class="docutils literal notranslate"><span class="pre">RCPT</span></code> 命令一起使用的 ESMTP 选项(如 <code class="docutils literal notranslate"><span class="pre">DSN</span></code> 命令)可以作为 <em>rcpt_options</em> 传入。(如果需要对不同的收件人使用不同的 ESMTP 选项,则必须使用底层的方法来发送消息,如 <code class="xref py py-meth docutils literal notranslate"><span class="pre">mail()</span></code>, <code class="xref py py-meth docutils literal notranslate"><span class="pre">rcpt()</span></code><code class="xref py py-meth docutils literal notranslate"><span class="pre">data()</span></code>。)</p>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p><em>from_addr</em><em>to_addrs</em> 形参被用来构造传输代理所使用的消息封包。 <code class="docutils literal notranslate"><span class="pre">sendmail</span></code> 不会以任何方式修改消息标头。</p>
</div>
<p><em>msg</em> 可以是一个包含 ASCII 范围内字符的字符串,或是一个字节串。 字符串会使用 ascii 编解码器编码为字节串,并且单独的 <code class="docutils literal notranslate"><span class="pre">\r</span></code><code class="docutils literal notranslate"><span class="pre">\n</span></code> 字符会被转换为 <code class="docutils literal notranslate"><span class="pre">\r\n</span></code> 字符序列。 字节串则不会被修改。</p>
<p>如果在此之前本会话没有执行过 <code class="docutils literal notranslate"><span class="pre">EHLO</span></code><code class="docutils literal notranslate"><span class="pre">HELO</span></code> 命令,此方法会先尝试 ESMTP <code class="docutils literal notranslate"><span class="pre">EHLO</span></code>。 如果服务器执行了 ESMTP消息大小和每个指定的选项将被传递给它如果指定的选项属于服务器声明的特性集。 如果 <code class="docutils literal notranslate"><span class="pre">EHLO</span></code> 失败,则将尝试 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 并屏蔽 ESMTP 选项。</p>
<p>如果邮件被至少一个接收方接受则此方法将正常返回。 在其他情况下它将引发异常。 也就是说,如果此方法没有引发异常,则应当会有人收到你的邮件。 如果此方法没有引发异常,它将返回一个字典,其中的条目对应每个拒绝的接收方。 每个条目均包含由服务器发送的 SMTP 错误代码和相应错误消息所组成的元组。</p>
<p>如果 <code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code> 包括在 <em>mail_options</em> 中,并且被服务器所支持,则 <em>from_addr</em><em>to_addrs</em> 可能包含非 ASCII 字符。</p>
<p>此方法可能引发以下异常:</p>
<dl class="simple">
<dt><a class="reference internal" href="#smtplib.SMTPRecipientsRefused" title="smtplib.SMTPRecipientsRefused"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPRecipientsRefused</span></code></a></dt><dd><p>所有收件人都被拒绝。 无人收到邮件。 该异常的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">recipients</span></code> 属性是一个字典,其中有被拒绝收件人的信息(类似于至少有一个收件人接受邮件时所返回的信息)。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPHeloError" title="smtplib.SMTPHeloError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPHeloError</span></code></a></dt><dd><p>服务器没有正确回复 <code class="docutils literal notranslate"><span class="pre">HELO</span></code> 问候。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPSenderRefused" title="smtplib.SMTPSenderRefused"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPSenderRefused</span></code></a></dt><dd><p>服务器不接受 <em>from_addr</em></p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPDataError" title="smtplib.SMTPDataError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPDataError</span></code></a></dt><dd><p>服务器回复了一个意外的错误代码(而不是拒绝收件人)。</p>
</dd>
<dt><a class="reference internal" href="#smtplib.SMTPNotSupportedError" title="smtplib.SMTPNotSupportedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupportedError</span></code></a></dt><dd><p><em>mail_options</em> 中给出了 <code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code> 但是不被服务器所支持。</p>
</dd>
</dl>
<p>除非另有说明,即使在引发异常之后连接仍将被打开。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.2 版更改: </span><em>msg</em> 可以为字节串。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>增加了 <code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code> 支持,并且如果指定了 <code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code> 但是不被服务器所支持则可能会引发 <a class="reference internal" href="#smtplib.SMTPNotSupportedError" title="smtplib.SMTPNotSupportedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupportedError</span></code></a></p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.send_message">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">send_message</code><span class="sig-paren">(</span><em class="sig-param">msg</em>, <em class="sig-param">from_addr=None</em>, <em class="sig-param">to_addrs=None</em>, <em class="sig-param">mail_options=()</em>, <em class="sig-param">rcpt_options=()</em><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.send_message" title="永久链接至目标"></a></dt>
<dd><p>本方法是一种快捷方法,用于带着消息调用 <a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmail()</span></code></a>,消息由 <a class="reference internal" href="email.compat32-message.html#email.message.Message" title="email.message.Message"><code class="xref py py-class docutils literal notranslate"><span class="pre">email.message.Message</span></code></a> 对象表示。参数的含义与 <a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmail()</span></code></a> 中的相同,除了 <em>msg</em>,它是一个 <code class="docutils literal notranslate"><span class="pre">Message</span></code> 对象。</p>
<p>如果 <em>from_addr</em><code class="docutils literal notranslate"><span class="pre">None</span></code><em>to_addrs</em><code class="docutils literal notranslate"><span class="pre">None</span></code> ,那么 <code class="docutils literal notranslate"><span class="pre">send_message</span></code> 将根据 <span class="target" id="index-35"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc5322.html"><strong>RFC 5322</strong></a>,从 <em>msg</em> 头部提取地址填充下列参数:如果头部存在 <em class="mailheader">Sender</em> 字段,则用它填充 <em>from_addr</em>,不存在则用 <em class="mailheader">From</em> 字段填充 <em>from_addr</em><em>to_addrs</em> 组合了 <em>msg</em> 中的 <em class="mailheader">To</em>, <em class="mailheader">Cc</em><em class="mailheader">Bcc</em> 字段的值(字段存在的情况下)。如果一组 <em class="mailheader">Resent-*</em> 头部恰好出现在 message 中,那么就忽略常规的头部,改用 <em class="mailheader">Resent-*</em> 头部。如果 message 包含多组 <em class="mailheader">Resent-*</em> 头部,则引发 <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>,因为无法明确检测出哪一组 <em class="mailheader">Resent-</em> 头部是最新的。</p>
<p><code class="docutils literal notranslate"><span class="pre">send_message</span></code> 使用 <a class="reference internal" href="email.generator.html#email.generator.BytesGenerator" title="email.generator.BytesGenerator"><code class="xref py py-class docutils literal notranslate"><span class="pre">BytesGenerator</span></code></a> 来序列化 <em>msg</em>,且将 <code class="docutils literal notranslate"><span class="pre">\r\n</span></code> 作为 <em>linesep</em>,并调用 <a class="reference internal" href="#smtplib.SMTP.sendmail" title="smtplib.SMTP.sendmail"><code class="xref py py-meth docutils literal notranslate"><span class="pre">sendmail()</span></code></a> 来传输序列化后的结果。无论 <em>from_addr</em><em>to_addrs</em> 的值为何,<code class="docutils literal notranslate"><span class="pre">send_message</span></code> 都不会传输 <em>msg</em> 中可能出现的 <em class="mailheader">Bcc</em><em class="mailheader">Resent-Bcc</em> 头部。如果 <em>from_addr</em><em>to_addrs</em> 中的某个地址包含非 ASCII 字符,且服务器没有声明支持 <code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code>,则引发 <code class="xref py py-exc docutils literal notranslate"><span class="pre">SMTPNotSupported</span></code> 错误。如果服务器支持,则 <code class="docutils literal notranslate"><span class="pre">Message</span></code> 将按新克隆的 <a class="reference internal" href="email.policy.html#module-email.policy" title="email.policy: Controlling the parsing and generating of messages"><code class="xref py py-mod docutils literal notranslate"><span class="pre">policy</span></code></a> 进行序列化,其中的 <a class="reference internal" href="email.policy.html#email.policy.EmailPolicy.utf8" title="email.policy.EmailPolicy.utf8"><code class="xref py py-attr docutils literal notranslate"><span class="pre">utf8</span></code></a> 属性被设置为 <code class="docutils literal notranslate"><span class="pre">True</span></code>,且 <code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code><code class="docutils literal notranslate"><span class="pre">BODY=8BITMIME</span></code> 被添加到 <em>mail_options</em> 中。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.2 新版功能.</span></p>
</div>
<div class="versionadded">
<p><span class="versionmodified added">3.5 新版功能: </span>支持国际化地址 (<code class="docutils literal notranslate"><span class="pre">SMTPUTF8</span></code>)。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="smtplib.SMTP.quit">
<code class="sig-prename descclassname">SMTP.</code><code class="sig-name descname">quit</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#smtplib.SMTP.quit" title="永久链接至目标"></a></dt>
<dd><p>终结 SMTP 会话并关闭连接。 返回 SMTP <code class="docutils literal notranslate"><span class="pre">QUIT</span></code> 命令的结果。</p>
</dd></dl>
<p>与标准 SMTP/ESMTP 命令 <code class="docutils literal notranslate"><span class="pre">HELP</span></code>, <code class="docutils literal notranslate"><span class="pre">RSET</span></code>, <code class="docutils literal notranslate"><span class="pre">NOOP</span></code>, <code class="docutils literal notranslate"><span class="pre">MAIL</span></code>, <code class="docutils literal notranslate"><span class="pre">RCPT</span></code><code class="docutils literal notranslate"><span class="pre">DATA</span></code> 对应的低层级方法也是受支持的。 通常不需要直接调用这些方法,因此它们没有被写入本文档。 相关细节请参看模块代码。</p>
</section>
<section id="smtp-example">
<span id="id2"></span><h2>SMTP 示例<a class="headerlink" href="#smtp-example" title="永久链接至标题"></a></h2>
<p>这个例子提示用户输入消息封包所需的地址 ('To' 和 'From' 地址),以及所要封包的消息。 请注意包括在消息中的标头必须包括在输入的消息中;这个例子不对 <span class="target" id="index-36"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc822.html"><strong>RFC 822</strong></a> 标头进行任何处理。 特别地,'To' 和 'From' 地址必须显式地包括在消息标头中。</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">smtplib</span>
<span class="k">def</span> <span class="nf">prompt</span><span class="p">(</span><span class="n">prompt</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">input</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="n">fromaddr</span> <span class="o">=</span> <span class="n">prompt</span><span class="p">(</span><span class="s2">&quot;From: &quot;</span><span class="p">)</span>
<span class="n">toaddrs</span> <span class="o">=</span> <span class="n">prompt</span><span class="p">(</span><span class="s2">&quot;To: &quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Enter message, end with ^D (Unix) or ^Z (Windows):&quot;</span><span class="p">)</span>
<span class="c1"># Add the From: and To: headers at the start!</span>
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;From: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s2">To: </span><span class="si">%s</span><span class="se">\r\n\r\n</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">fromaddr</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">toaddrs</span><span class="p">)))</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">EOFError</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="n">line</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Message length is&quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">smtplib</span><span class="o">.</span><span class="n">SMTP</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">set_debuglevel</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">sendmail</span><span class="p">(</span><span class="n">fromaddr</span><span class="p">,</span> <span class="n">toaddrs</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p>通常,你将需要使用 <a class="reference internal" href="email.html#module-email" title="email: Package supporting the parsing, manipulating, and generating email messages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code></a> 包的特性来构造电子邮件消息,然后你可以通过 <a class="reference internal" href="#smtplib.SMTP.send_message" title="smtplib.SMTP.send_message"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_message()</span></code></a> 来发送它,参见 <a class="reference internal" href="email.examples.html#email-examples"><span class="std std-ref">email: 示例</span></a></p>
</div>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtplib</span></code> --- SMTP 协议客户端</a><ul>
<li><a class="reference internal" href="#smtp-objects">SMTP 对象</a></li>
<li><a class="reference internal" href="#smtp-example">SMTP 示例</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="nntplib.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">nntplib</span></code> --- NNTP 协议客户端</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="smtpd.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">smtpd</span></code> --- SMTP 服务器</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/smtplib.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
>索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="smtpd.html" title="smtpd --- SMTP 服务器"
>下一页</a> |</li>
<li class="right" >
<a href="nntplib.html" title="nntplib --- NNTP 协议客户端"
>上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="internet.html" >互联网协议和支持</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="footer">
&copy; <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
最后更新于 12月 09, 2024.
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
<br />
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
</div>
</body>
</html>