Team Ai
Apppublic

parthtamu/rag-code-assistant

sourceHugging Faceupdated 7mo agoView on Hugging Face
0likes
email.examples.html734 linesDownload Raw Back to docs
1<!DOCTYPE html>2 3<html lang="en" data-content_root="../">4  <head>5    <meta charset="utf-8" />6    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />7<meta property="og:title" content="email: Examples" />8<meta property="og:type" content="website" />9<meta property="og:url" content="https://docs.python.org/3/library/email.examples.html" />10<meta property="og:site_name" content="Python documentation" />11<meta property="og:description" content="Here are a few examples of how to use the email package to read, write, and send simple email messages, as well as more complex MIME messages. First, let’s see how to create and send a simple text ..." />12<meta property="og:image:width" content="1146" />13<meta property="og:image:height" content="600" />14<meta property="og:image" content="https://docs.python.org/3.15/_images/social_previews/summary_library_email.examples_ca525c12.png" />15<meta property="og:image:alt" content="Here are a few examples of how to use the email package to read, write, and send simple email messages, as well as more complex MIME messages. First, let’s see how to create and send a simple text ..." />16<meta name="description" content="Here are a few examples of how to use the email package to read, write, and send simple email messages, as well as more complex MIME messages. First, let’s see how to create and send a simple text ..." />17<meta name="twitter:card" content="summary_large_image" />18<meta name="theme-color" content="#3776ab">19 20    <title>email: Examples &#8212; Python 3.15.0a6 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">21    22    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />23    <link rel="stylesheet" type="text/css" href="../_static/classic.css?v=234b1a7c" />24    <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=89a2f22a" />25    <link rel="stylesheet" type="text/css" href="../_static/profiling-sampling-visualization.css?v=0c2600ae" />26    <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />27    28    <script src="../_static/documentation_options.js?v=6b7c9ff5"></script>29    <script src="../_static/doctools.js?v=9bcbadda"></script>30    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>31    <script src="../_static/profiling-sampling-visualization.js?v=9811ed04"></script>32    33    <script src="../_static/sidebar.js"></script>34    35    <link rel="search" type="application/opensearchdescription+xml"36          title="Search within Python 3.15.0a6 documentation"37          href="../_static/opensearch.xml"/>38    <link rel="author" title="About these documents" href="../about.html" />39    <link rel="index" title="Index" href="../genindex.html" />40    <link rel="search" title="Search" href="../search.html" />41    <link rel="copyright" title="Copyright" href="../copyright.html" />42    <link rel="next" title="email.message.Message: Representing an email message using the compat32 API" href="email.compat32-message.html" />43    <link rel="prev" title="email.contentmanager: Managing MIME Content" href="email.contentmanager.html" />44    45      46      <script defer file-types="bz2,epub,zip" data-domain="docs.python.org" src="https://analytics.python.org/js/script.file-downloads.outbound-links.js"></script>47      48      <link rel="canonical" href="https://docs.python.org/3/library/email.examples.html">49      50    51 52    53    <style>54      @media only screen {55        table.full-width-table {56            width: 100%;57        }58      }59    </style>60<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">61    <link rel="shortcut icon" type="image/png" href="../_static/py.svg">62            <script type="text/javascript" src="../_static/copybutton.js"></script>63            <script type="text/javascript" src="../_static/menu.js"></script>64            <script type="text/javascript" src="../_static/search-focus.js"></script>65            <script type="text/javascript" src="../_static/themetoggle.js"></script> 66            <script type="text/javascript" src="../_static/rtd_switcher.js"></script>67            <meta name="readthedocs-addons-api-version" content="1">68 69  </head>70<body>71<div class="mobile-nav">72    <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"73           aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu">74    <nav class="nav-content" role="navigation">75        <label for="menuToggler" class="toggler__label">76            <span></span>77        </label>78        <span class="nav-items-wrapper">79            <a href="https://www.python.org/" class="nav-logo">80                <img src="../_static/py.svg" alt="Python logo">81            </a>82            <span class="version_switcher_placeholder"></span>83            <form role="search" class="search" action="../search.html" method="get">84                <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">85                    <path fill-rule="nonzero" fill="currentColor" 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"></path>86                </svg>87                <input placeholder="Quick search" aria-label="Quick search" type="search" name="q">88                <input type="submit" value="Go">89            </form>90        </span>91    </nav>92    <div class="menu-wrapper">93        <nav class="menu" role="navigation" aria-label="main navigation">94            <div class="language_switcher_placeholder"></div>95            96<label class="theme-selector-label">97    Theme98    <select class="theme-selector" oninput="activateTheme(this.value)">99        <option value="auto" selected>Auto</option>100        <option value="light">Light</option>101        <option value="dark">Dark</option>102    </select>103</label>104  <div>105    <h4>Previous topic</h4>106    <p class="topless"><a href="email.contentmanager.html"107                          title="previous chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">email.contentmanager</span></code>: Managing MIME Content</a></p>108  </div>109  <div>110    <h4>Next topic</h4>111    <p class="topless"><a href="email.compat32-message.html"112                          title="next chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">email.message.Message</span></code>: Representing an email message using the <code class="xref py py-data docutils literal notranslate"><span class="pre">compat32</span></code> API</a></p>113  </div>114  <script>115    document.addEventListener('DOMContentLoaded', () => {116        const title = document.querySelector('meta[property="og:title"]').content;117        const elements = document.querySelectorAll('.improvepage');118        const pageurl = window.location.href.split('?')[0];119        elements.forEach(element => {120            const url = new URL(element.href.split('?')[0].replace("-nojs", ""));121            url.searchParams.set('pagetitle', title);122            url.searchParams.set('pageurl', pageurl);123            url.searchParams.set('pagesource', "library/email.examples.rst");124            element.href = url.toString();125        });126    });127  </script>128  <div role="note" aria-label="source link">129    <h3>This page</h3>130    <ul class="this-page-menu">131      <li><a href="../bugs.html">Report a bug</a></li>132      <li><a class="improvepage" href="../improve-page-nojs.html">Improve this page</a></li>133      <li>134        <a href="https://github.com/python/cpython/blob/main/Doc/library/email.examples.rst?plain=1"135            rel="nofollow">Show source136        </a>137      </li>138      139    </ul>140  </div>141        </nav>142    </div>143</div>144 145  146    <div class="related" role="navigation" aria-label="Related">147      <h3>Navigation</h3>148      <ul>149        <li class="right" style="margin-right: 10px">150          <a href="../genindex.html" title="General Index"151             accesskey="I">index</a></li>152        <li class="right" >153          <a href="../py-modindex.html" title="Python Module Index"154             >modules</a> |</li>155        <li class="right" >156          <a href="email.compat32-message.html" title="email.message.Message: Representing an email message using the compat32 API"157             accesskey="N">next</a> |</li>158        <li class="right" >159          <a href="email.contentmanager.html" title="email.contentmanager: Managing MIME Content"160             accesskey="P">previous</a> |</li>161 162          <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"></li>163          <li><a href="https://www.python.org/">Python</a> &#187;</li>164          <li class="switchers">165            <div class="language_switcher_placeholder"></div>166            <div class="version_switcher_placeholder"></div>167          </li>168          <li>169              170          </li>171    <li id="cpython-language-and-version">172      <a href="../index.html">3.15.0a6 Documentation</a> &#187;173    </li>174 175          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &#187;</li>176          <li class="nav-item nav-item-2"><a href="netdata.html" >Internet Data Handling</a> &#187;</li>177          <li class="nav-item nav-item-3"><a href="email.html" accesskey="U"><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code> — An email and MIME handling package</a> &#187;</li>178        <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code>: Examples</a></li>179                <li class="right">180                    181 182    <div class="inline-search" role="search">183        <form class="inline-search" action="../search.html" method="get">184          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box">185          <input type="submit" value="Go">186        </form>187    </div>188                     |189                </li>190            <li class="right">191<label class="theme-selector-label">192    Theme193    <select class="theme-selector" oninput="activateTheme(this.value)">194        <option value="auto" selected>Auto</option>195        <option value="light">Light</option>196        <option value="dark">Dark</option>197    </select>198</label> |</li>199            200      </ul>201    </div>    202 203    <div class="document">204      <div class="documentwrapper">205        <div class="bodywrapper">206          <div class="body" role="main">207            208  <section id="email-examples">209<span id="id1"></span><h1><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>: Examples<a class="headerlink" href="#email-examples" title="Link to this heading">¶</a></h1>210<p>Here are a few examples of how to use the <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> package to read, write,211and send simple email messages, as well as more complex MIME messages.</p>212<p>First, let’s see how to create and send a simple text message (both the213text content and the addresses may contain unicode characters):</p>214<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Import smtplib for the actual sending function</span>215<span class="kn">import</span><span class="w"> </span><span class="nn">smtplib</span>216 217<span class="c1"># Import the email modules we&#39;ll need</span>218<span class="kn">from</span><span class="w"> </span><span class="nn">email.message</span><span class="w"> </span><span class="kn">import</span> <span class="n">EmailMessage</span>219 220<span class="c1"># Open the plain text file whose name is in textfile for reading.</span>221<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">textfile</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>222    <span class="c1"># Create a text/plain message</span>223    <span class="n">msg</span> <span class="o">=</span> <span class="n">EmailMessage</span><span class="p">()</span>224    <span class="n">msg</span><span class="o">.</span><span class="n">set_content</span><span class="p">(</span><span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>225 226<span class="c1"># me == the sender&#39;s email address</span>227<span class="c1"># you == the recipient&#39;s email address</span>228<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;Subject&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;The contents of </span><span class="si">{</span><span class="n">textfile</span><span class="si">}</span><span class="s1">&#39;</span>229<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;From&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">me</span>230<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;To&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">you</span>231 232<span class="c1"># Send the message via our own SMTP server.</span>233<span class="n">s</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>234<span class="n">s</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>235<span class="n">s</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>236</pre></div>237</div>238<p>Parsing <span class="target" id="index-0"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc822.html"><strong>RFC 822</strong></a> headers can easily be done by the using the classes239from the <a class="reference internal" href="email.parser.html#module-email.parser" title="email.parser: Parse flat text email messages to produce a message object structure."><code class="xref py py-mod docutils literal notranslate"><span class="pre">parser</span></code></a> module:</p>240<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Import the email modules we&#39;ll need</span>241<span class="c1">#from email.parser import BytesParser</span>242<span class="kn">from</span><span class="w"> </span><span class="nn">email.parser</span><span class="w"> </span><span class="kn">import</span> <span class="n">Parser</span>243<span class="kn">from</span><span class="w"> </span><span class="nn">email.policy</span><span class="w"> </span><span class="kn">import</span> <span class="n">default</span>244 245<span class="c1"># If the e-mail headers are in a file, uncomment these two lines:</span>246<span class="c1"># with open(messagefile, &#39;rb&#39;) as fp:</span>247<span class="c1">#     headers = BytesParser(policy=default).parse(fp)</span>248 249<span class="c1">#  Or for parsing headers in a string (this is an uncommon operation), use:</span>250<span class="n">headers</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="n">default</span><span class="p">)</span><span class="o">.</span><span class="n">parsestr</span><span class="p">(</span>251        <span class="s1">&#39;From: Foo Bar &lt;user@example.com&gt;</span><span class="se">\n</span><span class="s1">&#39;</span>252        <span class="s1">&#39;To: &lt;someone_else@example.com&gt;</span><span class="se">\n</span><span class="s1">&#39;</span>253        <span class="s1">&#39;Subject: Test message</span><span class="se">\n</span><span class="s1">&#39;</span>254        <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>255        <span class="s1">&#39;Body would go here</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>256 257<span class="c1">#  Now the header items can be accessed as a dictionary:</span>258<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;To: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;to&#39;</span><span class="p">]))</span>259<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;From: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;from&#39;</span><span class="p">]))</span>260<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Subject: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;subject&#39;</span><span class="p">]))</span>261 262<span class="c1"># You can also access the parts of the addresses:</span>263<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Recipient username: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;to&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">addresses</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">username</span><span class="p">))</span>264<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Sender name: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;from&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">addresses</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">display_name</span><span class="p">))</span>265</pre></div>266</div>267<p>Here’s an example of how to send a MIME message containing a bunch of family268pictures that may be residing in a directory:</p>269<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Import smtplib for the actual sending function.</span>270<span class="kn">import</span><span class="w"> </span><span class="nn">smtplib</span>271 272<span class="c1"># Here are the email package modules we&#39;ll need.</span>273<span class="kn">from</span><span class="w"> </span><span class="nn">email.message</span><span class="w"> </span><span class="kn">import</span> <span class="n">EmailMessage</span>274 275<span class="c1"># Create the container email message.</span>276<span class="n">msg</span> <span class="o">=</span> <span class="n">EmailMessage</span><span class="p">()</span>277<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;Subject&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;Our family reunion&#39;</span>278<span class="c1"># me == the sender&#39;s email address</span>279<span class="c1"># family = the list of all recipients&#39; email addresses</span>280<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;From&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">me</span>281<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;To&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">family</span><span class="p">)</span>282<span class="n">msg</span><span class="o">.</span><span class="n">preamble</span> <span class="o">=</span> <span class="s1">&#39;You will not see this in a MIME-aware mail reader.</span><span class="se">\n</span><span class="s1">&#39;</span>283 284<span class="c1"># Open the files in binary mode.  You can also omit the subtype</span>285<span class="c1"># if you want MIMEImage to guess it.</span>286<span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">pngfiles</span><span class="p">:</span>287    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>288        <span class="n">img_data</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>289    <span class="n">msg</span><span class="o">.</span><span class="n">add_attachment</span><span class="p">(</span><span class="n">img_data</span><span class="p">,</span> <span class="n">maintype</span><span class="o">=</span><span class="s1">&#39;image&#39;</span><span class="p">,</span>290                                 <span class="n">subtype</span><span class="o">=</span><span class="s1">&#39;png&#39;</span><span class="p">)</span>291 292<span class="c1"># Send the email via our own SMTP server.</span>293<span class="k">with</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="k">as</span> <span class="n">s</span><span class="p">:</span>294    <span class="n">s</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>295</pre></div>296</div>297<p>Here’s an example of how to send the entire contents of a directory as an email298message: <a class="footnote-reference brackets" href="#id3" id="id2" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a></p>299<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/env python3</span>300 301<span class="sd">&quot;&quot;&quot;Send the contents of a directory as a MIME message.&quot;&quot;&quot;</span>302 303<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>304<span class="kn">import</span><span class="w"> </span><span class="nn">smtplib</span>305<span class="c1"># For guessing MIME type based on file name extension</span>306<span class="kn">import</span><span class="w"> </span><span class="nn">mimetypes</span>307 308<span class="kn">from</span><span class="w"> </span><span class="nn">argparse</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArgumentParser</span>309 310<span class="kn">from</span><span class="w"> </span><span class="nn">email.message</span><span class="w"> </span><span class="kn">import</span> <span class="n">EmailMessage</span>311<span class="kn">from</span><span class="w"> </span><span class="nn">email.policy</span><span class="w"> </span><span class="kn">import</span> <span class="n">SMTP</span>312 313 314<span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">():</span>315    <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>316<span class="s2">Send the contents of a directory as a MIME message.</span>317<span class="s2">Unless the -o option is given, the email is sent by forwarding to your local</span>318<span class="s2">SMTP server, which then does the normal delivery process.  Your local machine</span>319<span class="s2">must be running an SMTP server.</span>320<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>321    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;-d&#39;</span><span class="p">,</span> <span class="s1">&#39;--directory&#39;</span><span class="p">,</span>322                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;Mail the contents of the specified directory,</span>323<span class="s2">                        otherwise use the current directory.  Only the regular</span>324<span class="s2">                        files in the directory are sent, and we don&#39;t recurse to</span>325<span class="s2">                        subdirectories.&quot;&quot;&quot;</span><span class="p">)</span>326    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;-o&#39;</span><span class="p">,</span> <span class="s1">&#39;--output&#39;</span><span class="p">,</span>327                        <span class="n">metavar</span><span class="o">=</span><span class="s1">&#39;FILE&#39;</span><span class="p">,</span>328                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;Print the composed message to FILE instead of</span>329<span class="s2">                        sending the message to the SMTP server.&quot;&quot;&quot;</span><span class="p">)</span>330    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;-s&#39;</span><span class="p">,</span> <span class="s1">&#39;--sender&#39;</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>331                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;The value of the From: header (required)&#39;</span><span class="p">)</span>332    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;-r&#39;</span><span class="p">,</span> <span class="s1">&#39;--recipient&#39;</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>333                        <span class="n">action</span><span class="o">=</span><span class="s1">&#39;append&#39;</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s1">&#39;RECIPIENT&#39;</span><span class="p">,</span>334                        <span class="n">default</span><span class="o">=</span><span class="p">[],</span> <span class="n">dest</span><span class="o">=</span><span class="s1">&#39;recipients&#39;</span><span class="p">,</span>335                        <span class="n">help</span><span class="o">=</span><span class="s1">&#39;A To: header value (at least one required)&#39;</span><span class="p">)</span>336    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>337    <span class="n">directory</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">directory</span>338    <span class="k">if</span> <span class="ow">not</span> <span class="n">directory</span><span class="p">:</span>339        <span class="n">directory</span> <span class="o">=</span> <span class="s1">&#39;.&#39;</span>340    <span class="c1"># Create the message</span>341    <span class="n">msg</span> <span class="o">=</span> <span class="n">EmailMessage</span><span class="p">()</span>342    <span class="n">msg</span><span class="p">[</span><span class="s1">&#39;Subject&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Contents of directory </span><span class="si">{</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span>343    <span class="n">msg</span><span class="p">[</span><span class="s1">&#39;To&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">recipients</span><span class="p">)</span>344    <span class="n">msg</span><span class="p">[</span><span class="s1">&#39;From&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">sender</span>345    <span class="n">msg</span><span class="o">.</span><span class="n">preamble</span> <span class="o">=</span> <span class="s1">&#39;You will not see this in a MIME-aware mail reader.</span><span class="se">\n</span><span class="s1">&#39;</span>346 347    <span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>348        <span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">directory</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>349        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>350            <span class="k">continue</span>351        <span class="c1"># Guess the content type based on the file&#39;s extension.  Encoding</span>352        <span class="c1"># will be ignored, although we should check for simple things like</span>353        <span class="c1"># gzip&#39;d or compressed files.</span>354        <span class="n">ctype</span><span class="p">,</span> <span class="n">encoding</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_file_type</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>355        <span class="k">if</span> <span class="n">ctype</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">encoding</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>356            <span class="c1"># No guess could be made, or the file is encoded (compressed), so</span>357            <span class="c1"># use a generic bag-of-bits type.</span>358            <span class="n">ctype</span> <span class="o">=</span> <span class="s1">&#39;application/octet-stream&#39;</span>359        <span class="n">maintype</span><span class="p">,</span> <span class="n">subtype</span> <span class="o">=</span> <span class="n">ctype</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>360        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>361            <span class="n">msg</span><span class="o">.</span><span class="n">add_attachment</span><span class="p">(</span><span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span>362                               <span class="n">maintype</span><span class="o">=</span><span class="n">maintype</span><span class="p">,</span>363                               <span class="n">subtype</span><span class="o">=</span><span class="n">subtype</span><span class="p">,</span>364                               <span class="n">filename</span><span class="o">=</span><span class="n">filename</span><span class="p">)</span>365    <span class="c1"># Now send or store the message</span>366    <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">output</span><span class="p">:</span>367        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">output</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>368            <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">as_bytes</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="n">SMTP</span><span class="p">))</span>369    <span class="k">else</span><span class="p">:</span>370        <span class="k">with</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="k">as</span> <span class="n">s</span><span class="p">:</span>371            <span class="n">s</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>372 373 374<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>375    <span class="n">main</span><span class="p">()</span>376</pre></div>377</div>378<p>Here’s an example of how to unpack a MIME message like the one379above, into a directory of files:</p>380<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/env python3</span>381 382<span class="sd">&quot;&quot;&quot;Unpack a MIME message into a directory of files.&quot;&quot;&quot;</span>383 384<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>385<span class="kn">import</span><span class="w"> </span><span class="nn">email</span>386<span class="kn">import</span><span class="w"> </span><span class="nn">mimetypes</span>387 388<span class="kn">from</span><span class="w"> </span><span class="nn">email.policy</span><span class="w"> </span><span class="kn">import</span> <span class="n">default</span>389 390<span class="kn">from</span><span class="w"> </span><span class="nn">argparse</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArgumentParser</span>391 392 393<span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">():</span>394    <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>395<span class="s2">Unpack a MIME message into a directory of files.</span>396<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>397    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;-d&#39;</span><span class="p">,</span> <span class="s1">&#39;--directory&#39;</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>398                        <span class="n">help</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;Unpack the MIME message into the named</span>399<span class="s2">                        directory, which will be created if it doesn&#39;t already</span>400<span class="s2">                        exist.&quot;&quot;&quot;</span><span class="p">)</span>401    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;msgfile&#39;</span><span class="p">)</span>402    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>403 404    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">msgfile</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>405        <span class="n">msg</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_binary_file</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">policy</span><span class="o">=</span><span class="n">default</span><span class="p">)</span>406 407    <span class="k">try</span><span class="p">:</span>408        <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">directory</span><span class="p">)</span>409    <span class="k">except</span> <span class="ne">FileExistsError</span><span class="p">:</span>410        <span class="k">pass</span>411 412    <span class="n">counter</span> <span class="o">=</span> <span class="mi">1</span>413    <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">msg</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>414        <span class="c1"># multipart/* are just containers</span>415        <span class="k">if</span> <span class="n">part</span><span class="o">.</span><span class="n">get_content_maintype</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;multipart&#39;</span><span class="p">:</span>416            <span class="k">continue</span>417        <span class="c1"># Applications should really sanitize the given filename so that an</span>418        <span class="c1"># email message can&#39;t be used to overwrite important files</span>419        <span class="n">filename</span> <span class="o">=</span> <span class="n">part</span><span class="o">.</span><span class="n">get_filename</span><span class="p">()</span>420        <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span><span class="p">:</span>421            <span class="n">ext</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_extension</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">get_content_type</span><span class="p">())</span>422            <span class="k">if</span> <span class="ow">not</span> <span class="n">ext</span><span class="p">:</span>423                <span class="c1"># Use a generic bag-of-bits extension</span>424                <span class="n">ext</span> <span class="o">=</span> <span class="s1">&#39;.bin&#39;</span>425            <span class="n">filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;part-</span><span class="si">{</span><span class="n">counter</span><span class="si">:</span><span class="s1">03d</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s1">&#39;</span>426        <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>427        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">directory</span><span class="p">,</span> <span class="n">filename</span><span class="p">),</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>428            <span class="n">fp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">get_payload</span><span class="p">(</span><span class="n">decode</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>429 430 431<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>432    <span class="n">main</span><span class="p">()</span>433</pre></div>434</div>435<p>Here’s an example of how to create an HTML message with an alternative plain436text version.  To make things a bit more interesting, we include a related437image in the html part, and we save a copy of what we are going to send to438disk, as well as sending it.</p>439<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/env python3</span>440 441<span class="kn">import</span><span class="w"> </span><span class="nn">smtplib</span>442 443<span class="kn">from</span><span class="w"> </span><span class="nn">email.message</span><span class="w"> </span><span class="kn">import</span> <span class="n">EmailMessage</span>444<span class="kn">from</span><span class="w"> </span><span class="nn">email.headerregistry</span><span class="w"> </span><span class="kn">import</span> <span class="n">Address</span>445<span class="kn">from</span><span class="w"> </span><span class="nn">email.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">make_msgid</span>446 447<span class="c1"># Create the base text message.</span>448<span class="n">msg</span> <span class="o">=</span> <span class="n">EmailMessage</span><span class="p">()</span>449<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;Subject&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Pourquoi pas des asperges pour ce midi ?&quot;</span>450<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;From&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Address</span><span class="p">(</span><span class="s2">&quot;Pepé Le Pew&quot;</span><span class="p">,</span> <span class="s2">&quot;pepe&quot;</span><span class="p">,</span> <span class="s2">&quot;example.com&quot;</span><span class="p">)</span>451<span class="n">msg</span><span class="p">[</span><span class="s1">&#39;To&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">Address</span><span class="p">(</span><span class="s2">&quot;Penelope Pussycat&quot;</span><span class="p">,</span> <span class="s2">&quot;penelope&quot;</span><span class="p">,</span> <span class="s2">&quot;example.com&quot;</span><span class="p">),</span>452             <span class="n">Address</span><span class="p">(</span><span class="s2">&quot;Fabrette Pussycat&quot;</span><span class="p">,</span> <span class="s2">&quot;fabrette&quot;</span><span class="p">,</span> <span class="s2">&quot;example.com&quot;</span><span class="p">))</span>453<span class="n">msg</span><span class="o">.</span><span class="n">set_content</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>454<span class="s2">Salut!</span>455 456<span class="s2">Cette recette [1] sera sûrement un très bon repas.</span>457 458<span class="s2">[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718</span>459 460<span class="s2">--Pepé</span>461<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>462 463<span class="c1"># Add the html version.  This converts the message into a multipart/alternative</span>464<span class="c1"># container, with the original text message as the first part and the new html</span>465<span class="c1"># message as the second part.</span>466<span class="n">asparagus_cid</span> <span class="o">=</span> <span class="n">make_msgid</span><span class="p">()</span>467<span class="n">msg</span><span class="o">.</span><span class="n">add_alternative</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>468<span class="s2">&lt;html&gt;</span>469<span class="s2">  &lt;head&gt;&lt;/head&gt;</span>470<span class="s2">  &lt;body&gt;</span>471<span class="s2">    &lt;p&gt;Salut!&lt;/p&gt;</span>472<span class="s2">    &lt;p&gt;Cette</span>473<span class="s2">        &lt;a href=&quot;http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718&quot;&gt;</span>474<span class="s2">            recette</span>475<span class="s2">        &lt;/a&gt; sera sûrement un très bon repas.</span>476<span class="s2">    &lt;/p&gt;</span>477<span class="s2">    &lt;img src=&quot;cid:</span><span class="si">{asparagus_cid}</span><span class="s2">&quot;&gt;</span>478<span class="s2">  &lt;/body&gt;</span>479<span class="s2">&lt;/html&gt;</span>480<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">asparagus_cid</span><span class="o">=</span><span class="n">asparagus_cid</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]),</span> <span class="n">subtype</span><span class="o">=</span><span class="s1">&#39;html&#39;</span><span class="p">)</span>481<span class="c1"># note that we needed to peel the &lt;&gt; off the msgid for use in the html.</span>482 483<span class="c1"># Now add the related image to the html part.</span>484<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;roasted-asparagus.jpg&quot;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">img</span><span class="p">:</span>485    <span class="n">msg</span><span class="o">.</span><span class="n">get_payload</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">add_related</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="s1">&#39;image&#39;</span><span class="p">,</span> <span class="s1">&#39;jpeg&#39;</span><span class="p">,</span>486                                     <span class="n">cid</span><span class="o">=</span><span class="n">asparagus_cid</span><span class="p">)</span>487 488<span class="c1"># Make a local copy of what we are going to send.</span>489<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;outgoing.msg&#39;</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>490    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">bytes</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>491 492<span class="c1"># Send the message via local SMTP server.</span>493<span class="k">with</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="k">as</span> <span class="n">s</span><span class="p">:</span>494    <span class="n">s</span><span class="o">.</span><span class="n">send_message</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>495</pre></div>496</div>497<p>If we were sent the message from the last example, here is one way we could498process it:</p>499<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>500<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>501<span class="kn">import</span><span class="w"> </span><span class="nn">tempfile</span>502<span class="kn">import</span><span class="w"> </span><span class="nn">mimetypes</span>503<span class="kn">import</span><span class="w"> </span><span class="nn">webbrowser</span>504 505<span class="c1"># Import the email modules we&#39;ll need</span>506<span class="kn">from</span><span class="w"> </span><span class="nn">email</span><span class="w"> </span><span class="kn">import</span> <span class="n">policy</span>507<span class="kn">from</span><span class="w"> </span><span class="nn">email.parser</span><span class="w"> </span><span class="kn">import</span> <span class="n">BytesParser</span>508 509 510<span class="k">def</span><span class="w"> </span><span class="nf">magic_html_parser</span><span class="p">(</span><span class="n">html_text</span><span class="p">,</span> <span class="n">partfiles</span><span class="p">):</span>511<span class="w">    </span><span class="sd">&quot;&quot;&quot;Return safety-sanitized html linked to partfiles.</span>512 513<span class="sd">    Rewrite the href=&quot;cid:....&quot; attributes to point to the filenames in partfiles.</span>514<span class="sd">    Though not trivial, this should be possible using html.parser.</span>515<span class="sd">    &quot;&quot;&quot;</span>516    <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;Add the magic needed&quot;</span><span class="p">)</span>517 518 519<span class="c1"># In a real program you&#39;d get the filename from the arguments.</span>520<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;outgoing.msg&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>521    <span class="n">msg</span> <span class="o">=</span> <span class="n">BytesParser</span><span class="p">(</span><span class="n">policy</span><span class="o">=</span><span class="n">policy</span><span class="o">.</span><span class="n">default</span><span class="p">)</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span>522 523<span class="c1"># Now the header items can be accessed as a dictionary, and any non-ASCII will</span>524<span class="c1"># be converted to unicode:</span>525<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;To:&#39;</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="s1">&#39;to&#39;</span><span class="p">])</span>526<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;From:&#39;</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="s1">&#39;from&#39;</span><span class="p">])</span>527<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Subject:&#39;</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="s1">&#39;subject&#39;</span><span class="p">])</span>528 529<span class="c1"># If we want to print a preview of the message content, we can extract whatever</span>530<span class="c1"># the least formatted payload is and print the first three lines.  Of course,</span>531<span class="c1"># if the message has no plain text part printing the first three lines of html</span>532<span class="c1"># is probably useless, but this is just a conceptual example.</span>533<span class="n">simplest</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">get_body</span><span class="p">(</span><span class="n">preferencelist</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;plain&#39;</span><span class="p">,</span> <span class="s1">&#39;html&#39;</span><span class="p">))</span>534<span class="nb">print</span><span class="p">()</span>535<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">simplest</span><span class="o">.</span><span class="n">get_content</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="n">keepends</span><span class="o">=</span><span class="kc">True</span><span class="p">)[:</span><span class="mi">3</span><span class="p">]))</span>536 537<span class="n">ans</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;View full message?&quot;</span><span class="p">)</span>538<span class="k">if</span> <span class="n">ans</span><span class="o">.</span><span class="n">lower</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;n&#39;</span><span class="p">:</span>539    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>540 541<span class="c1"># We can extract the richest alternative in order to display it:</span>542<span class="n">richest</span> <span class="o">=</span> <span class="n">msg</span><span class="o">.</span><span class="n">get_body</span><span class="p">()</span>543<span class="n">partfiles</span> <span class="o">=</span> <span class="p">{}</span>544<span class="k">if</span> <span class="n">richest</span><span class="p">[</span><span class="s1">&#39;content-type&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">maintype</span> <span class="o">==</span> <span class="s1">&#39;text&#39;</span><span class="p">:</span>545    <span class="k">if</span> <span class="n">richest</span><span class="p">[</span><span class="s1">&#39;content-type&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">subtype</span> <span class="o">==</span> <span class="s1">&#39;plain&#39;</span><span class="p">:</span>546        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">richest</span><span class="o">.</span><span class="n">get_content</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">():</span>547            <span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>548        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>549    <span class="k">elif</span> <span class="n">richest</span><span class="p">[</span><span class="s1">&#39;content-type&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">subtype</span> <span class="o">==</span> <span class="s1">&#39;html&#39;</span><span class="p">:</span>550        <span class="n">body</span> <span class="o">=</span> <span class="n">richest</span>551    <span class="k">else</span><span class="p">:</span>552        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Don&#39;t know how to display </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">richest</span><span class="o">.</span><span class="n">get_content_type</span><span class="p">()))</span>553        <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>554<span class="k">elif</span> <span class="n">richest</span><span class="p">[</span><span class="s1">&#39;content-type&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">content_type</span> <span class="o">==</span> <span class="s1">&#39;multipart/related&#39;</span><span class="p">:</span>555    <span class="n">body</span> <span class="o">=</span> <span class="n">richest</span><span class="o">.</span><span class="n">get_body</span><span class="p">(</span><span class="n">preferencelist</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;html&#39;</span><span class="p">))</span>556    <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">richest</span><span class="o">.</span><span class="n">iter_attachments</span><span class="p">():</span>557        <span class="n">fn</span> <span class="o">=</span> <span class="n">part</span><span class="o">.</span><span class="n">get_filename</span><span class="p">()</span>558        <span class="k">if</span> <span class="n">fn</span><span class="p">:</span>559            <span class="n">extension</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">get_filename</span><span class="p">())[</span><span class="mi">1</span><span class="p">]</span>560        <span class="k">else</span><span class="p">:</span>561            <span class="n">extension</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_extension</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">get_content_type</span><span class="p">())</span>562        <span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">(</span><span class="n">suffix</span><span class="o">=</span><span class="n">extension</span><span class="p">,</span> <span class="n">delete</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>563            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">get_content</span><span class="p">())</span>564            <span class="c1"># again strip the &lt;&gt; to go from email form of cid to html form.</span>565            <span class="n">partfiles</span><span class="p">[</span><span class="n">part</span><span class="p">[</span><span class="s1">&#39;content-id&#39;</span><span class="p">][</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span>566<span class="k">else</span><span class="p">:</span>567    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Don&#39;t know how to display </span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">richest</span><span class="o">.</span><span class="n">get_content_type</span><span class="p">()))</span>568    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>569<span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">delete</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>570    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">magic_html_parser</span><span class="p">(</span><span class="n">body</span><span class="o">.</span><span class="n">get_content</span><span class="p">(),</span> <span class="n">partfiles</span><span class="p">))</span>571<span class="n">webbrowser</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>572<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>573<span class="k">for</span> <span class="n">fn</span> <span class="ow">in</span> <span class="n">partfiles</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>574    <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">fn</span><span class="p">)</span>575 576<span class="c1"># Of course, there are lots of email messages that could break this simple</span>577<span class="c1"># minded program, but it will handle the most common ones.</span>578</pre></div>579</div>580<p>Up to the prompt, the output from the above is:</p>581<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>To: Penelope Pussycat &lt;penelope@example.com&gt;, Fabrette Pussycat &lt;fabrette@example.com&gt;582From: Pepé Le Pew &lt;pepe@example.com&gt;583Subject: Pourquoi pas des asperges pour ce midi ?584 585Salut!586 587Cette recette [1] sera sûrement un très bon repas.588</pre></div>589</div>590<p class="rubric">Footnotes</p>591<aside class="footnote-list brackets">592<aside class="footnote brackets" id="id3" role="doc-footnote">593<span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id2">1</a><span class="fn-bracket">]</span></span>594<p>Thanks to Matthew Dixon Cowles for the original inspiration and examples.</p>595</aside>596</aside>597</section>598 599 600            <div class="clearer"></div>601          </div>602        </div>603      </div>604      <div class="sphinxsidebar" role="navigation" aria-label="Main">605        <div class="sphinxsidebarwrapper">606  <div>607    <h4>Previous topic</h4>608    <p class="topless"><a href="email.contentmanager.html"609                          title="previous chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">email.contentmanager</span></code>: Managing MIME Content</a></p>610  </div>611  <div>612    <h4>Next topic</h4>613    <p class="topless"><a href="email.compat32-message.html"614                          title="next chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">email.message.Message</span></code>: Representing an email message using the <code class="xref py py-data docutils literal notranslate"><span class="pre">compat32</span></code> API</a></p>615  </div>616  <script>617    document.addEventListener('DOMContentLoaded', () => {618        const title = document.querySelector('meta[property="og:title"]').content;619        const elements = document.querySelectorAll('.improvepage');620        const pageurl = window.location.href.split('?')[0];621        elements.forEach(element => {622            const url = new URL(element.href.split('?')[0].replace("-nojs", ""));623            url.searchParams.set('pagetitle', title);624            url.searchParams.set('pageurl', pageurl);625            url.searchParams.set('pagesource', "library/email.examples.rst");626            element.href = url.toString();627        });628    });629  </script>630  <div role="note" aria-label="source link">631    <h3>This page</h3>632    <ul class="this-page-menu">633      <li><a href="../bugs.html">Report a bug</a></li>634      <li><a class="improvepage" href="../improve-page-nojs.html">Improve this page</a></li>635      <li>636        <a href="https://github.com/python/cpython/blob/main/Doc/library/email.examples.rst?plain=1"637            rel="nofollow">Show source638        </a>639      </li>640      641    </ul>642  </div>643        </div>644<div id="sidebarbutton" title="Collapse sidebar">645<span>«</span>646</div>647 648      </div>649      <div class="clearer"></div>650    </div>  651    <div class="related" role="navigation" aria-label="Related">652      <h3>Navigation</h3>653      <ul>654        <li class="right" style="margin-right: 10px">655          <a href="../genindex.html" title="General Index"656             >index</a></li>657        <li class="right" >658          <a href="../py-modindex.html" title="Python Module Index"659             >modules</a> |</li>660        <li class="right" >661          <a href="email.compat32-message.html" title="email.message.Message: Representing an email message using the compat32 API"662             >next</a> |</li>663        <li class="right" >664          <a href="email.contentmanager.html" title="email.contentmanager: Managing MIME Content"665             >previous</a> |</li>666 667          <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"></li>668          <li><a href="https://www.python.org/">Python</a> &#187;</li>669          <li class="switchers">670            <div class="language_switcher_placeholder"></div>671            <div class="version_switcher_placeholder"></div>672          </li>673          <li>674              675          </li>676    <li id="cpython-language-and-version">677      <a href="../index.html">3.15.0a6 Documentation</a> &#187;678    </li>679 680          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &#187;</li>681          <li class="nav-item nav-item-2"><a href="netdata.html" >Internet Data Handling</a> &#187;</li>682          <li class="nav-item nav-item-3"><a href="email.html" ><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code> — An email and MIME handling package</a> &#187;</li>683        <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">email</span></code>: Examples</a></li>684                <li class="right">685                    686 687    <div class="inline-search" role="search">688        <form class="inline-search" action="../search.html" method="get">689          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box">690          <input type="submit" value="Go">691        </form>692    </div>693                     |694                </li>695            <li class="right">696<label class="theme-selector-label">697    Theme698    <select class="theme-selector" oninput="activateTheme(this.value)">699        <option value="auto" selected>Auto</option>700        <option value="light">Light</option>701        <option value="dark">Dark</option>702    </select>703</label> |</li>704            705      </ul>706    </div>  707    <div class="footer">708    &copy; <a href="../copyright.html">Copyright</a> 2001 Python Software Foundation.709    <br>710    This page is licensed under the Python Software Foundation License Version 2.711    <br>712    Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.713    <br>714    715      See <a href="/license.html">History and License</a> for more information.<br>716    717    718    <br>719 720    The Python Software Foundation is a non-profit corporation.721<a href="https://www.python.org/psf/donations/">Please donate.</a>722<br>723    <br>724      Last updated on Mar 10, 2026 (08:58 UTC).725    726      <a href="/bugs.html">Found a bug</a>?727    728    <br>729 730    Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.731    </div>732 733  </body>734</html>