<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>imaplib - IMAP4 client library — Python Module of the Week</title> <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '1.132', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <link rel="author" title="About these documents" href="../about.html" /> <link rel="top" title="Python Module of the Week" href="../index.html" /> <link rel="up" title="Internet Protocols and Support" href="../internet_protocols.html" /> <link rel="next" title="SimpleXMLRPCServer – Implements an XML-RPC server." href="../SimpleXMLRPCServer/index.html" /> <link rel="prev" title="Cookie – HTTP Cookies" href="../Cookie/index.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="../SimpleXMLRPCServer/index.html" title="SimpleXMLRPCServer – Implements an XML-RPC server." accesskey="N">next</a> |</li> <li class="right" > <a href="../Cookie/index.html" title="Cookie – HTTP Cookies" accesskey="P">previous</a> |</li> <li><a href="../contents.html">PyMOTW</a> »</li> <li><a href="../internet_protocols.html" accesskey="U">Internet Protocols and Support</a> »</li> </ul> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="../contents.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">imaplib - IMAP4 client library</a><ul> <li><a class="reference internal" href="#variations">Variations</a></li> <li><a class="reference internal" href="#connecting-to-a-server">Connecting to a Server</a><ul> <li><a class="reference internal" href="#authentication-failure">Authentication Failure</a></li> </ul> </li> <li><a class="reference internal" href="#example-configuration">Example Configuration</a></li> <li><a class="reference internal" href="#listing-mailboxes">Listing Mailboxes</a></li> <li><a class="reference internal" href="#mailbox-status">Mailbox Status</a></li> <li><a class="reference internal" href="#selecting-a-mailbox">Selecting a Mailbox</a></li> <li><a class="reference internal" href="#searching-for-messages">Searching for Messages</a></li> <li><a class="reference internal" href="#search-criteria">Search Criteria</a></li> <li><a class="reference internal" href="#fetching-messages">Fetching Messages</a></li> <li><a class="reference internal" href="#whole-messages">Whole Messages</a></li> <li><a class="reference internal" href="#uploading-messages">Uploading Messages</a></li> <li><a class="reference internal" href="#moving-and-copying-messages">Moving and Copying Messages</a></li> <li><a class="reference internal" href="#deleting-messages">Deleting Messages</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="../Cookie/index.html" title="previous chapter">Cookie – HTTP Cookies</a></p> <h4>Next topic</h4> <p class="topless"><a href="../SimpleXMLRPCServer/index.html" title="next chapter">SimpleXMLRPCServer – Implements an XML-RPC server.</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../_sources/imaplib/index.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="module-imaplib"> <span id="imaplib-imap4-client-library"></span><h1>imaplib - IMAP4 client library<a class="headerlink" href="#module-imaplib" title="Permalink to this headline">¶</a></h1> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field"><th class="field-name">Purpose:</th><td class="field-body">Client library for IMAP4 communication.</td> </tr> <tr class="field"><th class="field-name">Python Version:</th><td class="field-body">1.5.2 and later</td> </tr> </tbody> </table> <p><a class="reference internal" href="#module-imaplib" title="imaplib: IMAP4 client library"><tt class="xref py py-mod docutils literal"><span class="pre">imaplib</span></tt></a> implements a client for communicating with Internet Message Access Protocol (IMAP) version 4 servers. The IMAP protocol defines a set of <em>commands</em> sent to the server and the responses delivered back to the client. Most of the commands are available as methods of the <tt class="xref py py-class docutils literal"><span class="pre">IMAP4</span></tt> object used to communicate with the server.</p> <p>These examples discuss part of the IMAP protocol, but are by no means complete. Refer to <span class="target" id="index-0"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc3501.html"><strong>RFC 3501</strong></a> for complete details.</p> <div class="section" id="variations"> <h2>Variations<a class="headerlink" href="#variations" title="Permalink to this headline">¶</a></h2> <p>There are 3 client classes for communicating with servers using various mechanisms. The first, <tt class="xref py py-class docutils literal"><span class="pre">IMAP4</span></tt>, uses clear text sockets; <tt class="xref py py-class docutils literal"><span class="pre">IMAP4_SSL</span></tt> uses encrypted communication over SSL sockets; and <tt class="xref py py-class docutils literal"><span class="pre">IMAP4_stream</span></tt> uses the standard input and standard output of an external command. All of the examples below will use <tt class="xref py py-class docutils literal"><span class="pre">IMAP4_SSL</span></tt>.</p> </div> <div class="section" id="connecting-to-a-server"> <h2>Connecting to a Server<a class="headerlink" href="#connecting-to-a-server" title="Permalink to this headline">¶</a></h2> <p>There are two steps for establishing a connection with an IMAP server. First, set up the socket connection itself. Second, authenticate as a user with an account on the server. The following example code will read server and user information from a configuration file.</p> <div class="admonition warning"> <p class="first admonition-title">Warning</p> <p class="last">You probably do not want to store email passwords in clear text, but handling encryption will distract from the rest of the examples.</p> </div> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">ConfigParser</span> <span class="kn">import</span> <span class="nn">os</span> <span class="k">def</span> <span class="nf">open_connection</span><span class="p">(</span><span class="n">verbose</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span> <span class="c"># Read the config file</span> <span class="n">config</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span> <span class="n">config</span><span class="o">.</span><span class="n">read</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">expanduser</span><span class="p">(</span><span class="s">'~/.pymotw'</span><span class="p">)])</span> <span class="c"># Connect to the server</span> <span class="n">hostname</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'server'</span><span class="p">,</span> <span class="s">'hostname'</span><span class="p">)</span> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span> <span class="k">print</span> <span class="s">'Connecting to'</span><span class="p">,</span> <span class="n">hostname</span> <span class="n">connection</span> <span class="o">=</span> <span class="n">imaplib</span><span class="o">.</span><span class="n">IMAP4_SSL</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="c"># Login to our account</span> <span class="n">username</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'account'</span><span class="p">,</span> <span class="s">'username'</span><span class="p">)</span> <span class="n">password</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'account'</span><span class="p">,</span> <span class="s">'password'</span><span class="p">)</span> <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span> <span class="k">print</span> <span class="s">'Logging in as'</span><span class="p">,</span> <span class="n">username</span> <span class="n">connection</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> <span class="k">return</span> <span class="n">connection</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span> <span class="n">c</span> <span class="o">=</span> <span class="n">open_connection</span><span class="p">(</span><span class="n">verbose</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="k">print</span> <span class="n">c</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>When run, <tt class="xref py py-func docutils literal"><span class="pre">open_connection()</span></tt> reads the configuration information from a file in your home directory, then opens the <tt class="xref py py-class docutils literal"><span class="pre">IMAP4_SSL</span></tt> connection and authenticates.</p> <div class="highlight-python"><pre>$ python imaplib_connect.py Connecting to mail.example.com Logging in as example <imaplib.IMAP4_SSL instance at 0x928cb0></pre> </div> <div class="admonition note"> <p class="first admonition-title">Note</p> <p class="last">The other examples below will reuse this module, to avoid duplicating the code.</p> </div> <div class="section" id="authentication-failure"> <h3>Authentication Failure<a class="headerlink" href="#authentication-failure" title="Permalink to this headline">¶</a></h3> <p>If the connection is established but authentication fails, an exception is raised.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">ConfigParser</span> <span class="kn">import</span> <span class="nn">os</span> <span class="c"># Read the config file</span> <span class="n">config</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span> <span class="n">config</span><span class="o">.</span><span class="n">read</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">expanduser</span><span class="p">(</span><span class="s">'~/.pymotw'</span><span class="p">)])</span> <span class="c"># Connect to the server</span> <span class="n">hostname</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'server'</span><span class="p">,</span> <span class="s">'hostname'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Connecting to'</span><span class="p">,</span> <span class="n">hostname</span> <span class="n">connection</span> <span class="o">=</span> <span class="n">imaplib</span><span class="o">.</span><span class="n">IMAP4_SSL</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="c"># Login to our account</span> <span class="n">username</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'account'</span><span class="p">,</span> <span class="s">'username'</span><span class="p">)</span> <span class="n">password</span> <span class="o">=</span> <span class="s">'this_is_the_wrong_password'</span> <span class="k">print</span> <span class="s">'Logging in as'</span><span class="p">,</span> <span class="n">username</span> <span class="n">connection</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> </pre></div> </div> <div class="highlight-python"><pre>$ python imaplib_connect_fail.py Connecting to mail.example.com Logging in as example Traceback (most recent call last): File "/Users/dhellmann/Documents/PyMOTW/in_progress/imaplib/PyMOTW/imaplib/imaplib_connect_fail.py", line 29, in <module> connection.login(username, password) File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/imaplib.py", line 501, in login raise self.error(dat[-1]) imaplib.error: Authentication failed.</pre> </div> </div> </div> <div class="section" id="example-configuration"> <h2>Example Configuration<a class="headerlink" href="#example-configuration" title="Permalink to this headline">¶</a></h2> <p>The example account has 4 mailboxes, <tt class="docutils literal"><span class="pre">INBOX</span></tt>, <tt class="docutils literal"><span class="pre">Apple</span> <span class="pre">Mail</span> <span class="pre">To</span> <span class="pre">Do</span></tt>, <tt class="docutils literal"><span class="pre">Archive</span></tt>, and <tt class="docutils literal"><span class="pre">2008</span></tt> (a sub-folder of <tt class="docutils literal"><span class="pre">Archive</span></tt>). The mailbox hierarchy looks like:</p> <ul class="simple"> <li>INBOX</li> <li>Apple Mail To Do</li> <li>Archive<ul> <li>2008</li> </ul> </li> </ul> <p>There is one unread message in the <tt class="docutils literal"><span class="pre">INBOX</span></tt> folder, and one read message in <tt class="docutils literal"><span class="pre">Archive/2008</span></tt>.</p> </div> <div class="section" id="listing-mailboxes"> <h2>Listing Mailboxes<a class="headerlink" href="#listing-mailboxes" title="Permalink to this headline">¶</a></h2> <p>To retrieve the mailboxes available for an account, use the <tt class="xref py py-meth docutils literal"><span class="pre">list()</span></tt> method.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">from</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="n">pprint</span> <span class="kn">from</span> <span class="nn">imaplib_connect</span> <span class="kn">import</span> <span class="n">open_connection</span> <span class="n">c</span> <span class="o">=</span> <span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">()</span> <span class="k">print</span> <span class="s">'Response code:'</span><span class="p">,</span> <span class="n">typ</span> <span class="k">print</span> <span class="s">'Response:'</span> <span class="n">pprint</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The return value is a tuple with a response code and the data returned by the server. The response code is <tt class="docutils literal"><span class="pre">OK</span></tt>, unless there has been an error. The data for <tt class="xref py py-meth docutils literal"><span class="pre">list()</span></tt> is a sequence of strings containing <em>flags</em>, the <em>hierarchy delimiter</em>, and <em>mailbox name</em> for each mailbox.</p> <div class="highlight-python"><pre>$ python imaplib_list.py Response code: OK Response: ['(\\HasNoChildren) "." INBOX', '(\\HasNoChildren) "." "Apple Mail To Do"', '(\\HasChildren) "." "Archive"', '(\\HasNoChildren) "." "Archive.2008"']</pre> </div> <p>Each response string can be split into 3 parts using <a class="reference internal" href="../re/index.html#module-re" title="re: Searching within and changing text using formal patterns."><tt class="xref py py-mod docutils literal"><span class="pre">re</span></tt></a> or <a class="reference internal" href="../csv/index.html#module-csv" title="csv: Read and write comma separated value files."><tt class="xref py py-mod docutils literal"><span class="pre">csv</span></tt></a> (see <a class="reference external" href="http://snipplr.com/view/7955/imap-backup-script/">IMAP Backup Script</a> for an example using <a class="reference internal" href="../csv/index.html#module-csv" title="csv: Read and write comma separated value files."><tt class="xref py py-mod docutils literal"><span class="pre">csv</span></tt></a>).</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">re</span> <span class="kn">from</span> <span class="nn">imaplib_connect</span> <span class="kn">import</span> <span class="n">open_connection</span> <span class="n">list_response_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">parse_list_response</span><span class="p">(</span><span class="n">line</span><span class="p">):</span> <span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">list_response_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">)</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">mailbox_name</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s">'"'</span><span class="p">)</span> <span class="k">return</span> <span class="p">(</span><span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span><span class="p">)</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span> <span class="n">c</span> <span class="o">=</span> <span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">()</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> <span class="k">print</span> <span class="s">'Response code:'</span><span class="p">,</span> <span class="n">typ</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> <span class="k">print</span> <span class="s">'Server response:'</span><span class="p">,</span> <span class="n">line</span> <span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">parse_list_response</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Parsed response:'</span><span class="p">,</span> <span class="p">(</span><span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span><span class="p">)</span> </pre></div> </div> <p>Notice that the server quotes the mailbox name if it includes spaces, but we need to strip those quotes to use the mailbox name in other calls back to the server later.</p> <div class="highlight-python"><pre>$ python imaplib_list_parse.py Response code: OK Server response: (\HasNoChildren) "." INBOX Parsed response: ('\\HasNoChildren', '.', 'INBOX') Server response: (\HasNoChildren) "." "Apple Mail To Do" Parsed response: ('\\HasNoChildren', '.', 'Apple Mail To Do') Server response: (\HasChildren) "." "Archive" Parsed response: ('\\HasChildren', '.', 'Archive') Server response: (\HasNoChildren) "." "Archive.2008" Parsed response: ('\\HasNoChildren', '.', 'Archive.2008')</pre> </div> <p><tt class="xref py py-meth docutils literal"><span class="pre">list()</span></tt> takes arguments to let you ask for mailboxes in part of the hierarchy. For example, to list sub-folders of <tt class="docutils literal"><span class="pre">Archive</span></tt>, you can pass a value as the <em>directory</em> argument:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">from</span> <span class="nn">imaplib_connect</span> <span class="kn">import</span> <span class="n">open_connection</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span> <span class="n">c</span> <span class="o">=</span> <span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="n">directory</span><span class="o">=</span><span class="s">'Archive'</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> <span class="k">print</span> <span class="s">'Response code:'</span><span class="p">,</span> <span class="n">typ</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> <span class="k">print</span> <span class="s">'Server response:'</span><span class="p">,</span> <span class="n">line</span> </pre></div> </div> <p>Only the single subfolder is returned:</p> <div class="highlight-python"><pre>$ python imaplib_list_subfolders.py Response code: OK Server response: (\HasNoChildren) "." "Archive.2008"</pre> </div> <p>Alternately, to list folders matching a pattern you can pass the <em>pattern</em> argument:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">from</span> <span class="nn">imaplib_connect</span> <span class="kn">import</span> <span class="n">open_connection</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span> <span class="n">c</span> <span class="o">=</span> <span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="n">pattern</span><span class="o">=</span><span class="s">'*Archive*'</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> <span class="k">print</span> <span class="s">'Response code:'</span><span class="p">,</span> <span class="n">typ</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> <span class="k">print</span> <span class="s">'Server response:'</span><span class="p">,</span> <span class="n">line</span> </pre></div> </div> <p>In this case, both <tt class="docutils literal"><span class="pre">Archive</span></tt> and <tt class="docutils literal"><span class="pre">Archive.2008</span></tt> are included in the response.</p> <div class="highlight-python"><pre>$ python imaplib_list_pattern.py Response code: OK Server response: (\HasChildren) "." "Archive" Server response: (\HasNoChildren) "." "Archive.2008"</pre> </div> </div> <div class="section" id="mailbox-status"> <h2>Mailbox Status<a class="headerlink" href="#mailbox-status" title="Permalink to this headline">¶</a></h2> <p>Use <tt class="xref py py-meth docutils literal"><span class="pre">status()</span></tt> to ask for aggregated information about the contents. The standard defines these <em>status conditions</em>:</p> <dl class="docutils"> <dt>MESSAGES</dt> <dd>The number of messages in the mailbox.</dd> <dt>RECENT</dt> <dd>The number of messages with the Recent flag set.</dd> <dt>UIDNEXT</dt> <dd>The next unique identifier value of the mailbox.</dd> <dt>UIDVALIDITY</dt> <dd>The unique identifier validity value of the mailbox.</dd> <dt>UNSEEN</dt> <dd>The number of messages which do not have the Seen flag set.</dd> </dl> <p>The status conditions must be formatted as a space separated string enclosed in parentheses, the encoding for a “list” in the IMAP4 specification.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">re</span> <span class="kn">from</span> <span class="nn">imaplib_connect</span> <span class="kn">import</span> <span class="n">open_connection</span> <span class="kn">from</span> <span class="nn">imaplib_list_parse</span> <span class="kn">import</span> <span class="n">parse_list_response</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span> <span class="n">c</span> <span class="o">=</span> <span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> <span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">parse_list_response</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">print</span> <span class="n">c</span><span class="o">.</span><span class="n">status</span><span class="p">(</span><span class="n">mailbox_name</span><span class="p">,</span> <span class="s">'(MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN)'</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The return value is the usual tuple containing a response code and a list of information from the server. In this case, the list contains a single string formatted with the name of the mailbox in quotes, then the status conditions and values in parentheses.</p> <div class="highlight-python"><pre>$ python imaplib_status.py ('OK', ['"INBOX" (MESSAGES 1 RECENT 0 UIDNEXT 3 UIDVALIDITY 1222003700 UNSEEN 1)']) ('OK', ['"Apple Mail To Do" (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1222003706 UNSEEN 0)']) ('OK', ['"Archive" (MESSAGES 0 RECENT 0 UIDNEXT 1 UIDVALIDITY 1222003809 UNSEEN 0)']) ('OK', ['"Archive.2008" (MESSAGES 1 RECENT 0 UIDNEXT 2 UIDVALIDITY 1222003831 UNSEEN 0)'])</pre> </div> </div> <div class="section" id="selecting-a-mailbox"> <h2>Selecting a Mailbox<a class="headerlink" href="#selecting-a-mailbox" title="Permalink to this headline">¶</a></h2> <p>The basic mode of operation, once the client is authenticated, is to <em>select</em> a mailbox and then interrogate the server regarding messages in the mailbox. The connection is stateful, so once a mailbox is selected all commands operate on messages in that mailbox until a new mailbox is selected.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">)</span> <span class="k">print</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="n">num_msgs</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">print</span> <span class="s">'There are </span><span class="si">%d</span><span class="s"> messages in INBOX'</span> <span class="o">%</span> <span class="n">num_msgs</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The response data contains the total number of messages in the mailbox.</p> <div class="highlight-python"><pre>$ python imaplib_select.py OK ['1'] There are 1 messages in INBOX</pre> </div> <p>If an invalid mailbox is specified, the response code is <tt class="docutils literal"><span class="pre">NO</span></tt>.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'Does Not Exist'</span><span class="p">)</span> <span class="k">print</span> <span class="n">typ</span><span class="p">,</span> <span class="n">data</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The data contains an error message describing the problem.</p> <div class="highlight-python"><pre>$ python imaplib_select_invalid.py NO ["Mailbox doesn't exist: Does Not Exist"]</pre> </div> </div> <div class="section" id="searching-for-messages"> <h2>Searching for Messages<a class="headerlink" href="#searching-for-messages" title="Permalink to this headline">¶</a></h2> <p>Once the mailbox is selected, use <tt class="xref py py-meth docutils literal"><span class="pre">search()</span></tt> to retrieve the ids of messages in the mailbox.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="kn">from</span> <span class="nn">imaplib_list_parse</span> <span class="kn">import</span> <span class="n">parse_list_response</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">mailbox_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">mailbox_data</span><span class="p">:</span> <span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">parse_list_response</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">mailbox_name</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'ALL'</span><span class="p">)</span> <span class="k">print</span> <span class="n">mailbox_name</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>Message ids are assigned by the server, and are implementation dependent. The IMAP4 protocol makes a distinction between sequential ids for messages at a given point in time during a transaction and UID identifiers for messages, but not all servers seem to bother.</p> <div class="highlight-python"><pre>$ python imaplib_search_all.py INBOX OK ['1'] Apple Mail To Do OK [''] Archive OK [''] Archive.2008 OK ['1']</pre> </div> <p>In this case, <tt class="docutils literal"><span class="pre">INBOX</span></tt> and <tt class="docutils literal"><span class="pre">Archive.2008</span></tt> each have a diffrerent message with id <tt class="docutils literal"><span class="pre">1</span></tt>. The other mailboxes are empty.</p> </div> <div class="section" id="search-criteria"> <h2>Search Criteria<a class="headerlink" href="#search-criteria" title="Permalink to this headline">¶</a></h2> <p>A variety of other search criteria can be used, including looking at dates for the message, flags, and other headers. Refer to section 6.4.4. of <span class="target" id="index-1"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc3501.html"><strong>RFC 3501</strong></a> for complete details.</p> <p>As one example, to look for messages with <tt class="docutils literal"><span class="pre">'test</span> <span class="pre">message</span> <span class="pre">2'</span></tt> in the subject, the search criteria could be constructed as:</p> <div class="highlight-python"><pre>(SUBJECT "test message 2")</pre> </div> <p>This example finds all messages with the title “test message 2” in all mailboxes:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="kn">from</span> <span class="nn">imaplib_list_parse</span> <span class="kn">import</span> <span class="n">parse_list_response</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">mailbox_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">mailbox_data</span><span class="p">:</span> <span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">parse_list_response</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">mailbox_name</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'(SUBJECT "test message 2")'</span><span class="p">)</span> <span class="k">print</span> <span class="n">mailbox_name</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>There is only one such message in the account, and it is in the <tt class="docutils literal"><span class="pre">INBOX</span></tt>.</p> <div class="highlight-python"><pre>$ python imaplib_search_subject.py INBOX OK ['1'] Apple Mail To Do OK [''] Archive OK [''] Archive.2008 OK ['']</pre> </div> <p>Search criteria can also be combined.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="kn">from</span> <span class="nn">imaplib_list_parse</span> <span class="kn">import</span> <span class="n">parse_list_response</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">typ</span><span class="p">,</span> <span class="n">mailbox_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">list</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">mailbox_data</span><span class="p">:</span> <span class="n">flags</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">,</span> <span class="n">mailbox_name</span> <span class="o">=</span> <span class="n">parse_list_response</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">mailbox_name</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'(FROM "Doug" SUBJECT "test message 2")'</span><span class="p">)</span> <span class="k">print</span> <span class="n">mailbox_name</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The combination is treated as a logical <em>and</em> operation.</p> <div class="highlight-python"><pre>$ python imaplib_search_from.py INBOX OK ['1'] Apple Mail To Do OK [''] Archive OK [''] Archive.2008 OK ['']</pre> </div> </div> <div class="section" id="fetching-messages"> <h2>Fetching Messages<a class="headerlink" href="#fetching-messages" title="Permalink to this headline">¶</a></h2> <p>The identifiers returned by <tt class="xref py py-meth docutils literal"><span class="pre">search()</span></tt> are used to retrieve the contents, or partial contents, of messages for further processing via <tt class="xref py py-meth docutils literal"><span class="pre">fetch()</span></tt>. <tt class="xref py py-meth docutils literal"><span class="pre">fetch()</span></tt> takes 2 arguments, the message ids to fetch and the portion(s) of the message to retrieve.</p> <p>The <em>message_ids</em> argument is a comma separated list of ids (<tt class="docutils literal"><span class="pre">"1"</span></tt>, <tt class="docutils literal"><span class="pre">"1,2"</span></tt>) or id ranges (<tt class="docutils literal"><span class="pre">1:2</span></tt>). The <em>message_parts</em> argument is an IMAP list of message segment names. As with search criteria for <tt class="xref py py-meth docutils literal"><span class="pre">search()</span></tt>, the IMAP protocol specifies named message segments so clients can efficiently retrieve only the parts of the message they actually need. For example, to print the headers of the messages in a mailbox, we could <tt class="xref py py-meth docutils literal"><span class="pre">fetch()</span></tt> the headers using <tt class="docutils literal"><span class="pre">BODY.PEEK[HEADER]</span></tt>.</p> <div class="admonition note"> <p class="first admonition-title">Note</p> <p class="last">Another way to fetch the headers would be simply <tt class="docutils literal"><span class="pre">BODY[HEADERS]</span></tt>, but that form implicitly marks the message as read, which is undesirable in many cases.</p> </div> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">imaplib</span><span class="o">.</span><span class="n">Debug</span> <span class="o">=</span> <span class="mi">4</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="s">'1'</span><span class="p">,</span> <span class="s">'(BODY.PEEK[HEADER] FLAGS)'</span><span class="p">)</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">msg_data</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The return value of <tt class="xref py py-meth docutils literal"><span class="pre">fetch()</span></tt> has been partially parsed so it is somewhat harder to work with than the return value of <tt class="xref py py-meth docutils literal"><span class="pre">list()</span></tt>. If we turn on debugging, we can see the complete interaction between the client and server to understand why this is so.</p> <div class="highlight-python"><pre>$ python imaplib_fetch_raw.py 13:12.54 imaplib version 2.58 13:12.54 new IMAP4 connection, tag=CFKH 13:12.54 < * OK dovecot ready. 13:12.54 > CFKH0 CAPABILITY 13:12.54 < * CAPABILITY IMAP4rev1 SORT THREAD=REFERENCES MULTIAPPEND UNSELECT IDLE CHILDREN LISTEXT LIST-SUBSCRIBED NAMESPACE AUTH=PLAIN 13:12.54 < CFKH0 OK Capability completed. 13:12.54 CAPABILITIES: ('IMAP4REV1', 'SORT', 'THREAD=REFERENCES', 'MULTIAPPEND', 'UNSELECT', 'IDLE', 'CHILDREN', 'LISTEXT', 'LIST-SUBSCRIBED', 'NAMESPACE', 'AUTH=PLAIN') 13:12.54 > CFKH1 LOGIN example "password" 13:13.18 < CFKH1 OK Logged in. 13:13.18 > CFKH2 EXAMINE INBOX 13:13.20 < * FLAGS (\Answered \Flagged \Deleted \Seen \Draft $NotJunk $Junk) 13:13.20 < * OK [PERMANENTFLAGS ()] Read-only mailbox. 13:13.20 < * 2 EXISTS 13:13.20 < * 1 RECENT 13:13.20 < * OK [UNSEEN 1] First unseen. 13:13.20 < * OK [UIDVALIDITY 1222003700] UIDs valid 13:13.20 < * OK [UIDNEXT 4] Predicted next UID 13:13.20 < CFKH2 OK [READ-ONLY] Select completed. 13:13.20 > CFKH3 FETCH 1 (BODY.PEEK[HEADER] FLAGS) 13:13.20 < * 1 FETCH (FLAGS ($NotJunk) BODY[HEADER] {595} 13:13.20 read literal size 595 13:13.20 < ) 13:13.20 < CFKH3 OK Fetch completed. 13:13.20 > CFKH4 CLOSE 13:13.21 < CFKH4 OK Close completed. 13:13.21 > CFKH5 LOGOUT 13:13.21 < * BYE Logging out 13:13.21 BYE response: Logging out 13:13.21 < CFKH5 OK Logout completed. [('1 (FLAGS ($NotJunk) BODY[HEADER] {595}', 'Return-Path: <dhellmann@example.com>\r\nReceived: from example.com (localhost [127.0.0.1])\r\n\tby example.com (8.13.4/8.13.4) with ESMTP id m8LDTGW4018260\r\n\tfor <example@example.com>; Sun, 21 Sep 2008 09:29:16 -0400\r\nReceived: (from dhellmann@localhost)\r\n\tby example.com (8.13.4/8.13.4/Submit) id m8LDTGZ5018259\r\n\tfor example@example.com; Sun, 21 Sep 2008 09:29:16 -0400\r\nDate: Sun, 21 Sep 2008 09:29:16 -0400\r\nFrom: Doug Hellmann <dhellmann@example.com>\r\nMessage-Id: <200809211329.m8LDTGZ5018259@example.com>\r\nTo: example@example.com\r\nSubject: test message 2\r\n\r\n'), ')']</pre> </div> <p>The response from the <tt class="docutils literal"><span class="pre">FETCH</span></tt> command starts with the flags, then indicates that there are 595 bytes of header data. The client contructs a tuple with the response for the message, and then closes the sequence with a single string containing the <tt class="docutils literal"><span class="pre">)</span></tt> the server sends at the end of the fetch response. Because of this formatting, it may be easier to fetch different pieces of information separately, or to recombine the response and parse it yourself.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="k">print</span> <span class="s">'HEADER:'</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="s">'1'</span><span class="p">,</span> <span class="s">'(BODY.PEEK[HEADER])'</span><span class="p">)</span> <span class="k">for</span> <span class="n">response_part</span> <span class="ow">in</span> <span class="n">msg_data</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">response_part</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span> <span class="k">print</span> <span class="n">response_part</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">print</span> <span class="s">'BODY TEXT:'</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="s">'1'</span><span class="p">,</span> <span class="s">'(BODY.PEEK[TEXT])'</span><span class="p">)</span> <span class="k">for</span> <span class="n">response_part</span> <span class="ow">in</span> <span class="n">msg_data</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">response_part</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span> <span class="k">print</span> <span class="n">response_part</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">print</span> <span class="s">'</span><span class="se">\n</span><span class="s">FLAGS:'</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="s">'1'</span><span class="p">,</span> <span class="s">'(FLAGS)'</span><span class="p">)</span> <span class="k">for</span> <span class="n">response_part</span> <span class="ow">in</span> <span class="n">msg_data</span><span class="p">:</span> <span class="k">print</span> <span class="n">response_part</span> <span class="k">print</span> <span class="n">imaplib</span><span class="o">.</span><span class="n">ParseFlags</span><span class="p">(</span><span class="n">response_part</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>Fetching values separately has the added benefit of making it easy to use <tt class="xref py py-func docutils literal"><span class="pre">ParseFlags()</span></tt> to parse the flags from the response.</p> <div class="highlight-python"><pre>$ python imaplib_fetch_separately.py HEADER: Return-Path: <dhellmann@example.com> Received: from example.com (localhost [127.0.0.1]) by example.com (8.13.4/8.13.4) with ESMTP id m8LDTGW4018260 for <example@example.com>; Sun, 21 Sep 2008 09:29:16 -0400 Received: (from dhellmann@localhost) by example.com (8.13.4/8.13.4/Submit) id m8LDTGZ5018259 for example@example.com; Sun, 21 Sep 2008 09:29:16 -0400 Date: Sun, 21 Sep 2008 09:29:16 -0400 From: Doug Hellmann <dhellmann@example.com> Message-Id: <200809211329.m8LDTGZ5018259@example.com> To: example@example.com Subject: test message 2 BODY TEXT: second message FLAGS: 1 (FLAGS ($NotJunk)) ('$NotJunk',)</pre> </div> </div> <div class="section" id="whole-messages"> <h2>Whole Messages<a class="headerlink" href="#whole-messages" title="Permalink to this headline">¶</a></h2> <p>As illustrated above, the client can ask the server for individual parts of the message separately. It is also possible to retrieve the entire message as an <span class="target" id="index-2"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc2822.html"><strong>RFC 2822</strong></a> formatted mail message and parse it with classes from the <tt class="xref py py-mod docutils literal"><span class="pre">email</span></tt> module.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">email</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">,</span> <span class="n">readonly</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="s">'1'</span><span class="p">,</span> <span class="s">'(RFC822)'</span><span class="p">)</span> <span class="k">for</span> <span class="n">response_part</span> <span class="ow">in</span> <span class="n">msg_data</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">response_part</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span><span class="n">response_part</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="p">[</span> <span class="s">'subject'</span><span class="p">,</span> <span class="s">'to'</span><span class="p">,</span> <span class="s">'from'</span> <span class="p">]:</span> <span class="k">print</span> <span class="s">'</span><span class="si">%-8s</span><span class="s">: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">header</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">msg</span><span class="p">[</span><span class="n">header</span><span class="p">])</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>The parser in the <tt class="xref py py-mod docutils literal"><span class="pre">email</span></tt> module make it very easy to access and manipulate messages. This example prints just a few of the headers for each message.</p> <div class="highlight-python"><pre>$ python imaplib_fetch_rfc822.py SUBJECT : test message 2 TO : example@example.com FROM : Doug Hellmann <dhellmann@example.com></pre> </div> </div> <div class="section" id="uploading-messages"> <h2>Uploading Messages<a class="headerlink" href="#uploading-messages" title="Permalink to this headline">¶</a></h2> <p>To add a new message to a mailbox, pass it to the <tt class="xref py py-meth docutils literal"><span class="pre">append()</span></tt> method.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">time</span> <span class="kn">import</span> <span class="nn">email.message</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">new_message</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">Message</span><span class="p">()</span> <span class="n">new_message</span><span class="o">.</span><span class="n">set_unixfrom</span><span class="p">(</span><span class="s">'pymotw'</span><span class="p">)</span> <span class="n">new_message</span><span class="p">[</span><span class="s">'Subject'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'subject goes here'</span> <span class="n">new_message</span><span class="p">[</span><span class="s">'From'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'pymotw@example.com'</span> <span class="n">new_message</span><span class="p">[</span><span class="s">'To'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'example@example.com'</span> <span class="n">new_message</span><span class="o">.</span><span class="n">set_payload</span><span class="p">(</span><span class="s">'This is the body of the message.</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span> <span class="k">print</span> <span class="n">new_message</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">,</span> <span class="s">''</span><span class="p">,</span> <span class="n">imaplib</span><span class="o">.</span><span class="n">Time2Internaldate</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()),</span> <span class="nb">str</span><span class="p">(</span><span class="n">new_message</span><span class="p">))</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="p">[</span><span class="n">msg_ids</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'ALL'</span><span class="p">)</span> <span class="k">for</span> <span class="n">num</span> <span class="ow">in</span> <span class="n">msg_ids</span><span class="o">.</span><span class="n">split</span><span class="p">():</span> <span class="n">typ</span><span class="p">,</span> <span class="n">msg_data</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="s">'(BODY.PEEK[HEADER])'</span><span class="p">)</span> <span class="k">for</span> <span class="n">response_part</span> <span class="ow">in</span> <span class="n">msg_data</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">response_part</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span> <span class="k">print</span> <span class="s">'</span><span class="se">\n</span><span class="si">%s</span><span class="s">:'</span> <span class="o">%</span> <span class="n">num</span> <span class="k">print</span> <span class="n">response_part</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <div class="highlight-python"><pre>pymotw Subject: subject goes here From: pymotw@example.com To: example@example.com This is the body of the message. 1: Return-Path: <dhellmann@example.com> Received: from example.com (localhost [127.0.0.1]) by example.com (8.13.4/8.13.4) with ESMTP id m8LDTGW4018260 for <example@example.com>; Sun, 21 Sep 2008 09:29:16 -0400 Received: (from dhellmann@localhost) by example.com (8.13.4/8.13.4/Submit) id m8LDTGZ5018259 for example@example.com; Sun, 21 Sep 2008 09:29:16 -0400 Date: Sun, 21 Sep 2008 09:29:16 -0400 From: Doug Hellmann <dhellmann@example.com> Message-Id: <200809211329.m8LDTGZ5018259@example.com> To: example@example.com Subject: test message 2 2: Return-Path: <doug.hellmann@example.com> Message-Id: <0D9C3C50-462A-4FD7-9E5A-11EE222D721D@example.com> From: Doug Hellmann <doug.hellmann@example.com> To: example@example.com Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v929.2) Subject: lorem ipsum Date: Sun, 21 Sep 2008 12:53:16 -0400 X-Mailer: Apple Mail (2.929.2) 3: pymotw Subject: subject goes here From: pymotw@example.com To: example@example.com</pre> </div> </div> <div class="section" id="moving-and-copying-messages"> <h2>Moving and Copying Messages<a class="headerlink" href="#moving-and-copying-messages" title="Permalink to this headline">¶</a></h2> <p>Once a message is on the server, it can be moved or copied without downloading it using <tt class="xref py py-meth docutils literal"><span class="pre">move()</span></tt> or <a class="reference internal" href="../copy/index.html#module-copy" title="copy: Provides functions for duplicating objects using shallow or deep copy semantics."><tt class="xref py py-meth docutils literal"><span class="pre">copy()</span></tt></a>. These methods operate on message id ranges, just as <tt class="xref py py-meth docutils literal"><span class="pre">fetch()</span></tt> does.</p> <p>This example script creates a new mailbox under <tt class="docutils literal"><span class="pre">Archive</span></tt> and copies the read messages from <tt class="docutils literal"><span class="pre">INBOX</span></tt> into it.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="c"># Find the "SEEN" messages in INBOX</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'INBOX'</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="p">[</span><span class="n">response</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'SEEN'</span><span class="p">)</span> <span class="k">if</span> <span class="n">typ</span> <span class="o">!=</span> <span class="s">'OK'</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">response</span><span class="p">)</span> <span class="c"># Create a new mailbox, "Archive.Today"</span> <span class="n">msg_ids</span> <span class="o">=</span> <span class="s">','</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">' '</span><span class="p">))</span> <span class="n">typ</span><span class="p">,</span> <span class="n">create_response</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s">'Archive.Today'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'CREATED Archive.Today:'</span><span class="p">,</span> <span class="n">create_response</span> <span class="c"># Copy the messages</span> <span class="k">print</span> <span class="s">'COPYING:'</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="n">c</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">msg_ids</span><span class="p">,</span> <span class="s">'Archive.Today'</span><span class="p">)</span> <span class="c"># Look at the results</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'Archive.Today'</span><span class="p">)</span> <span class="n">typ</span><span class="p">,</span> <span class="p">[</span><span class="n">response</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'ALL'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'COPIED:'</span><span class="p">,</span> <span class="n">response</span> <span class="k">finally</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <div class="highlight-python"><pre>$ python imaplib_archive_read.py CREATED Archive.Today: ['Create completed.'] COPYING: 1,2 COPIED: 1 2</pre> </div> <p>Running the same script again shows the importance to checking return codes. Instead of raising an exception, the call to <tt class="xref py py-meth docutils literal"><span class="pre">create()</span></tt> to make the new mailbox reports that the mailbox already exists.</p> <div class="highlight-python"><pre>$ python imaplib_archive_read.py CREATED Archive.Today: ['Mailbox exists.'] COPYING: 1,2 COPIED: 1 2 3 4</pre> </div> </div> <div class="section" id="deleting-messages"> <h2>Deleting Messages<a class="headerlink" href="#deleting-messages" title="Permalink to this headline">¶</a></h2> <p>Although most modern mail clients use a “Trash folder” model for working with deleted messages, the messages are not usually moved into an actual folder. Instead, their flags are updated to add <tt class="docutils literal"><span class="pre">\Deleted</span></tt>. <em>Emptying the trash</em> is implemented through an <tt class="docutils literal"><span class="pre">EXPUNGE</span></tt> command. This example script finds the archived messages with “Lorem ipsum” in the subject, sets the deleted flag, then shows that the messages are still present in the folder by querying the server again.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">imaplib</span> <span class="kn">import</span> <span class="nn">imaplib_connect</span> <span class="kn">from</span> <span class="nn">imaplib_list_parse</span> <span class="kn">import</span> <span class="n">parse_list_response</span> <span class="n">c</span> <span class="o">=</span> <span class="n">imaplib_connect</span><span class="o">.</span><span class="n">open_connection</span><span class="p">()</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'Archive.Today'</span><span class="p">)</span> <span class="c"># What ids are in the mailbox?</span> <span class="n">typ</span><span class="p">,</span> <span class="p">[</span><span class="n">msg_ids</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'ALL'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Starting messages:'</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="c"># Find the message(s)</span> <span class="n">typ</span><span class="p">,</span> <span class="p">[</span><span class="n">msg_ids</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'(SUBJECT "Lorem ipsum")'</span><span class="p">)</span> <span class="n">msg_ids</span> <span class="o">=</span> <span class="s">','</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">msg_ids</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">' '</span><span class="p">))</span> <span class="k">print</span> <span class="s">'Matching messages:'</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="c"># What are the current flags?</span> <span class="n">typ</span><span class="p">,</span> <span class="n">response</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">msg_ids</span><span class="p">,</span> <span class="s">'(FLAGS)'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Flags before:'</span><span class="p">,</span> <span class="n">response</span> <span class="c"># Change the Deleted flag</span> <span class="n">typ</span><span class="p">,</span> <span class="n">response</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">store</span><span class="p">(</span><span class="n">msg_ids</span><span class="p">,</span> <span class="s">'+FLAGS'</span><span class="p">,</span> <span class="s">r'(\Deleted)'</span><span class="p">)</span> <span class="c"># What are the flags now?</span> <span class="n">typ</span><span class="p">,</span> <span class="n">response</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">msg_ids</span><span class="p">,</span> <span class="s">'(FLAGS)'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Flags after:'</span><span class="p">,</span> <span class="n">response</span> <span class="c"># Really delete the message.</span> <span class="n">typ</span><span class="p">,</span> <span class="n">response</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">expunge</span><span class="p">()</span> <span class="k">print</span> <span class="s">'Expunged:'</span><span class="p">,</span> <span class="n">response</span> <span class="c"># What ids are left in the mailbox?</span> <span class="n">typ</span><span class="p">,</span> <span class="p">[</span><span class="n">msg_ids</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="s">'ALL'</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Remaining messages:'</span><span class="p">,</span> <span class="n">msg_ids</span> <span class="k">finally</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="n">c</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span> </pre></div> </div> <p>This example explicitly calls <tt class="xref py py-meth docutils literal"><span class="pre">expunge()</span></tt> to remove the messages, but calling <tt class="xref py py-meth docutils literal"><span class="pre">close()</span></tt> has the same effect. The difference is the client is not notified about the deletions when you call <tt class="xref py py-meth docutils literal"><span class="pre">close()</span></tt>.</p> <div class="highlight-python"><pre>$ python imaplib_delete_messages.py Starting messages: 1 2 3 4 Matching messages: 1,3 Flags before: ['1 (FLAGS (\\Seen $NotJunk))', '3 (FLAGS (\\Seen \\Recent $NotJunk))'] Flags after: ['1 (FLAGS (\\Deleted \\Seen $NotJunk))', '3 (FLAGS (\\Deleted \\Seen \\Recent $NotJunk))'] Expunged: ['1', '2'] Remaining messages: 1 2</pre> </div> <div class="admonition-see-also admonition seealso"> <p class="first admonition-title">See also</p> <dl class="last docutils"> <dt><a class="reference external" href="http://docs.python.org/library/imaplib.html">imaplib</a></dt> <dd>The standard library documentation for this module.</dd> <dt><a class="reference external" href="http://www.imap.org/about/whatisIMAP.html">What is IMAP?</a></dt> <dd>imap.org description of the IMAP protocol</dd> <dt><a class="reference external" href="http://www.washington.edu/imap/">University of Washington IMAP Information Center</a></dt> <dd>Good resource for IMAP information, along with source code.</dd> <dt><span class="target" id="index-3"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc3501.html"><strong>RFC 3501</strong></a></dt> <dd>Internet Message Access Protocol</dd> <dt><span class="target" id="index-4"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc2822.html"><strong>RFC 2822</strong></a></dt> <dd>Internet Message Format</dd> <dt><a class="reference external" href="http://snipplr.com/view/7955/imap-backup-script/">IMAP Backup Script</a></dt> <dd>A script to backup email from an IMAP server.</dd> <dt><tt class="xref py py-mod docutils literal"><span class="pre">rfc822</span></tt></dt> <dd>The <tt class="xref py py-mod docutils literal"><span class="pre">rfc822</span></tt> module includes an <span class="target" id="index-5"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc822.html"><strong>RFC 822</strong></a> / <span class="target" id="index-6"></span><a class="rfc reference external" href="http://tools.ietf.org/html/rfc2822.html"><strong>RFC 2822</strong></a> parser</dd> <dt><tt class="xref py py-mod docutils literal"><span class="pre">email</span></tt></dt> <dd>The <tt class="xref py py-mod docutils literal"><span class="pre">email</span></tt> module for parsing email messages.</dd> <dt><a class="reference internal" href="../mailbox/index.html#module-mailbox" title="mailbox: Access and manipulate email archives."><tt class="xref py py-mod docutils literal"><span class="pre">mailbox</span></tt></a></dt> <dd>Local mailbox parser.</dd> <dt><a class="reference internal" href="../ConfigParser/index.html#module-ConfigParser" title="ConfigParser: Read/write configuration files similar to Windows INI files"><tt class="xref py py-mod docutils literal"><span class="pre">ConfigParser</span></tt></a></dt> <dd>Read and write configuration files.</dd> <dt><a class="reference external" href="http://freshfoo.com/wiki/CodeIndex">IMAPClient</a></dt> <dd>A higher-level client for talking to IMAP servers, written by Menno Smits.</dd> </dl> </div> </div> </div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="../SimpleXMLRPCServer/index.html" title="SimpleXMLRPCServer – Implements an XML-RPC server." >next</a> |</li> <li class="right" > <a href="../Cookie/index.html" title="Cookie – HTTP Cookies" >previous</a> |</li> <li><a href="../contents.html">PyMOTW</a> »</li> <li><a href="../internet_protocols.html" >Internet Protocols and Support</a> »</li> </ul> </div> <div class="footer"> © Copyright Doug Hellmann. Last updated on Oct 24, 2010. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>. <br/><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/" rel="license"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png"/></a> </div> </body> </html>