parthtamu/rag-code-assistant
0
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 — 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> »</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> »173 </li>174 175 <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> »</li>176 <li class="nav-item nav-item-2"><a href="netdata.html" >Internet Data Handling</a> »</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> »</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'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's email address</span>227<span class="c1"># you == the recipient's email address</span>228<span class="n">msg</span><span class="p">[</span><span class="s1">'Subject'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'The contents of </span><span class="si">{</span><span class="n">textfile</span><span class="si">}</span><span class="s1">'</span>229<span class="n">msg</span><span class="p">[</span><span class="s1">'From'</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">'To'</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">'localhost'</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'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, 'rb') 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">'From: Foo Bar <user@example.com></span><span class="se">\n</span><span class="s1">'</span>252 <span class="s1">'To: <someone_else@example.com></span><span class="se">\n</span><span class="s1">'</span>253 <span class="s1">'Subject: Test message</span><span class="se">\n</span><span class="s1">'</span>254 <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>255 <span class="s1">'Body would go here</span><span class="se">\n</span><span class="s1">'</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">'To: </span><span class="si">{}</span><span class="s1">'</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">'to'</span><span class="p">]))</span>259<span class="nb">print</span><span class="p">(</span><span class="s1">'From: </span><span class="si">{}</span><span class="s1">'</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">'from'</span><span class="p">]))</span>260<span class="nb">print</span><span class="p">(</span><span class="s1">'Subject: </span><span class="si">{}</span><span class="s1">'</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">'subject'</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">'Recipient username: </span><span class="si">{}</span><span class="s1">'</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">'to'</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">'Sender name: </span><span class="si">{}</span><span class="s1">'</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">'from'</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'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">'Subject'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Our family reunion'</span>278<span class="c1"># me == the sender's email address</span>279<span class="c1"># family = the list of all recipients' email addresses</span>280<span class="n">msg</span><span class="p">[</span><span class="s1">'From'</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">'To'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">', '</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">'You will not see this in a MIME-aware mail reader.</span><span class="se">\n</span><span class="s1">'</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">'rb'</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">'image'</span><span class="p">,</span>290 <span class="n">subtype</span><span class="o">=</span><span class="s1">'png'</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">'localhost'</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">"""Send the contents of a directory as a MIME message."""</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">"""</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">"""</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">'-d'</span><span class="p">,</span> <span class="s1">'--directory'</span><span class="p">,</span>322 <span class="n">help</span><span class="o">=</span><span class="s2">"""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't recurse to</span>325<span class="s2"> subdirectories."""</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">'-o'</span><span class="p">,</span> <span class="s1">'--output'</span><span class="p">,</span>327 <span class="n">metavar</span><span class="o">=</span><span class="s1">'FILE'</span><span class="p">,</span>328 <span class="n">help</span><span class="o">=</span><span class="s2">"""Print the composed message to FILE instead of</span>329<span class="s2"> sending the message to the SMTP server."""</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">'-s'</span><span class="p">,</span> <span class="s1">'--sender'</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">'The value of the From: header (required)'</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">'-r'</span><span class="p">,</span> <span class="s1">'--recipient'</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">'append'</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s1">'RECIPIENT'</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">'recipients'</span><span class="p">,</span>335 <span class="n">help</span><span class="o">=</span><span class="s1">'A To: header value (at least one required)'</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">'.'</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">'Subject'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'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">'</span>343 <span class="n">msg</span><span class="p">[</span><span class="s1">'To'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">', '</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">'From'</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">'You will not see this in a MIME-aware mail reader.</span><span class="se">\n</span><span class="s1">'</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'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'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">'application/octet-stream'</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">'/'</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">'rb'</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">'wb'</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">'localhost'</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">'__main__'</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">"""Unpack a MIME message into a directory of files."""</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">"""</span><span class="se">\</span>395<span class="s2">Unpack a MIME message into a directory of files.</span>396<span class="s2">"""</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">'-d'</span><span class="p">,</span> <span class="s1">'--directory'</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">"""Unpack the MIME message into the named</span>399<span class="s2"> directory, which will be created if it doesn't already</span>400<span class="s2"> exist."""</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">'msgfile'</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">'rb'</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">'multipart'</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'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">'.bin'</span>425 <span class="n">filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'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">'</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">'wb'</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">'__main__'</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">'Subject'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Pourquoi pas des asperges pour ce midi ?"</span>450<span class="n">msg</span><span class="p">[</span><span class="s1">'From'</span><span class="p">]</span> <span class="o">=</span> <span class="n">Address</span><span class="p">(</span><span class="s2">"Pepé Le Pew"</span><span class="p">,</span> <span class="s2">"pepe"</span><span class="p">,</span> <span class="s2">"example.com"</span><span class="p">)</span>451<span class="n">msg</span><span class="p">[</span><span class="s1">'To'</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">"Penelope Pussycat"</span><span class="p">,</span> <span class="s2">"penelope"</span><span class="p">,</span> <span class="s2">"example.com"</span><span class="p">),</span>452 <span class="n">Address</span><span class="p">(</span><span class="s2">"Fabrette Pussycat"</span><span class="p">,</span> <span class="s2">"fabrette"</span><span class="p">,</span> <span class="s2">"example.com"</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">"""</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">"""</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">"""</span><span class="se">\</span>468<span class="s2"><html></span>469<span class="s2"> <head></head></span>470<span class="s2"> <body></span>471<span class="s2"> <p>Salut!</p></span>472<span class="s2"> <p>Cette</span>473<span class="s2"> <a href="http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718"></span>474<span class="s2"> recette</span>475<span class="s2"> </a> sera sûrement un très bon repas.</span>476<span class="s2"> </p></span>477<span class="s2"> <img src="cid:</span><span class="si">{asparagus_cid}</span><span class="s2">"></span>478<span class="s2"> </body></span>479<span class="s2"></html></span>480<span class="s2">"""</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">'html'</span><span class="p">)</span>481<span class="c1"># note that we needed to peel the <> 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">"roasted-asparagus.jpg"</span><span class="p">,</span> <span class="s1">'rb'</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">'image'</span><span class="p">,</span> <span class="s1">'jpeg'</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">'outgoing.msg'</span><span class="p">,</span> <span class="s1">'wb'</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">'localhost'</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'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">"""Return safety-sanitized html linked to partfiles.</span>512 513<span class="sd"> Rewrite the href="cid:...." 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"> """</span>516 <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"Add the magic needed"</span><span class="p">)</span>517 518 519<span class="c1"># In a real program you'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">'outgoing.msg'</span><span class="p">,</span> <span class="s1">'rb'</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">'To:'</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="s1">'to'</span><span class="p">])</span>526<span class="nb">print</span><span class="p">(</span><span class="s1">'From:'</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="s1">'from'</span><span class="p">])</span>527<span class="nb">print</span><span class="p">(</span><span class="s1">'Subject:'</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="s1">'subject'</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">'plain'</span><span class="p">,</span> <span class="s1">'html'</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">''</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">"View full message?"</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">'n'</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">'content-type'</span><span class="p">]</span><span class="o">.</span><span class="n">maintype</span> <span class="o">==</span> <span class="s1">'text'</span><span class="p">:</span>545 <span class="k">if</span> <span class="n">richest</span><span class="p">[</span><span class="s1">'content-type'</span><span class="p">]</span><span class="o">.</span><span class="n">subtype</span> <span class="o">==</span> <span class="s1">'plain'</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">'content-type'</span><span class="p">]</span><span class="o">.</span><span class="n">subtype</span> <span class="o">==</span> <span class="s1">'html'</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">"Don't know how to display </span><span class="si">{}</span><span class="s2">"</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">'content-type'</span><span class="p">]</span><span class="o">.</span><span class="n">content_type</span> <span class="o">==</span> <span class="s1">'multipart/related'</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">'html'</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 <> 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">'content-id'</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">"Don't know how to display </span><span class="si">{}</span><span class="s2">"</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">'w'</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 <penelope@example.com>, Fabrette Pussycat <fabrette@example.com>582From: Pepé Le Pew <pepe@example.com>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> »</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> »678 </li>679 680 <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> »</li>681 <li class="nav-item nav-item-2"><a href="netdata.html" >Internet Data Handling</a> »</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> »</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 © <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>