<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The GITS Blog &#187; smtp</title>
	<atom:link href="http://ginstrom.com/scribbles/tag/smtp/feed/" rel="self" type="application/rss+xml" />
	<link>http://ginstrom.com/scribbles</link>
	<description>Random scribbling about programming, translation, and Japan</description>
	<lastBuildDate>Wed, 20 Apr 2011 05:09:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>A module to send email simply in Python</title>
		<link>http://ginstrom.com/scribbles/2009/03/15/a-module-to-send-email-simply-in-python/</link>
		<comments>http://ginstrom.com/scribbles/2009/03/15/a-module-to-send-email-simply-in-python/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 09:14:13 +0000</pubDate>
		<dc:creator>Ryan Ginstrom</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[smtp]]></category>

		<guid isPermaLink="false">http://ginstrom.com/scribbles/?p=898</guid>
		<description><![CDATA[Update: I've released version 0.3 of the mailer module. See the mailer home page for details and the latest version. The email and smtplib modules in Python are very powerful, but they're also a bit complex when you just want to send an email. I wrote the mailer module as a front end to these [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update</strong>: I've released version 0.3 of the mailer module. See the <a href="/code/mailer.html">mailer home page</a> for details and the latest version.</p>
<p>The <a href="http://docs.python.org/library/email.html">email</a> and <a href="http://docs.python.org/library/smtplib.html">smtplib</a> modules in Python are very powerful, but they're also a bit complex when you just want to send an email.</p>
<p>I wrote the <a href="/code/mailer_0.1.zip">mailer module</a> as a front end to these two modules, in order to make the task of sending email in Python using SMTP as simple as possible.</p>
<p>Below are some examples.</p>
<h3>Send a simple plain text email</h3>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">import</span> mailer</p>
<p>message = mailer.<span class="me1">Message</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
message.<span class="me1">From</span> = <span class="st0">&quot;me@example.com&quot;</span><br />
message.<span class="me1">To</span> = <span class="st0">&quot;you@example.com&quot;</span><br />
message.<span class="me1">Subject</span> = <span class="st0">&quot;My Vacation&quot;</span><br />
message.<span class="me1">Body</span> = <span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;letter.txt&quot;</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>mailer = mailer.<span class="me1">Mailer</span><span class="br0">&#40;</span><span class="st0">'mail.example.com'</span><span class="br0">&#41;</span><br />
mailer.<span class="me1">send</span><span class="br0">&#40;</span>message<span class="br0">&#41;</span></div>
<h3>Send an email with an attachment</h3>
<div class="dean_ch" style="white-space: wrap;">
message = mailer.<span class="me1">Message</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
message.<span class="me1">From</span> = <span class="st0">&quot;me@example.com&quot;</span><br />
message.<span class="me1">To</span> = <span class="st0">&quot;you@example.com&quot;</span><br />
message.<span class="me1">Subject</span> = <span class="st0">&quot;My Vacation&quot;</span><br />
message.<span class="me1">Body</span> = <span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;letter.txt&quot;</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
message.<span class="me1">attach</span><span class="br0">&#40;</span><span class="st0">&quot;picture.jpg&quot;</span><span class="br0">&#41;</span></p>
<p>mailer = mailer.<span class="me1">Mailer</span><span class="br0">&#40;</span><span class="st0">'mail.example.com'</span><span class="br0">&#41;</span><br />
mailer.<span class="me1">send</span><span class="br0">&#40;</span>message<span class="br0">&#41;</span></div>
<h3>Send an HTML email</h3>
<div class="dean_ch" style="white-space: wrap;">
message = mailer.<span class="me1">Message</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
message.<span class="me1">From</span> = <span class="st0">&quot;me@example.com&quot;</span><br />
message.<span class="me1">To</span> = <span class="st0">&quot;you@example.com&quot;</span><br />
message.<span class="me1">Subject</span> = <span class="st0">&quot;My Vacation&quot;</span><br />
message.<span class="me1">Body</span> = <span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;letter.txt&quot;</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
message.<span class="me1">Html</span> = <span class="st0">&quot;&quot;</span><span class="st0">&quot;This email is in &lt;b&gt;HTML&lt;/b&gt;.<br />
&lt;a href=&quot;</span>http://example.<span class="me1">com</span><span class="st0">&quot;&gt;Here's a link.&lt;/a&gt;&quot;</span><span class="st0">&quot;&quot;</span></p>
<p>mailer = mailer.<span class="me1">Mailer</span><span class="br0">&#40;</span><span class="st0">'mail.example.com'</span><span class="br0">&#41;</span><br />
mailer.<span class="me1">send</span><span class="br0">&#40;</span>message<span class="br0">&#41;</span></div>
<p><a href="/code/mailer_0.1.zip">Download the mailer module (zip file)</a>.</p>
<p><strong>Edit:</strong> Here's the source code of the mailer module.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co1">#coding: UTF8</span><br />
<span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
mailer module</p>
<p>Simple front end to the smtplib and email modules,<br />
to simplify sending email.</p>
<p>A lot of this code was taken from the online examples in the<br />
email module documentation:<br />
http://docs.python.org/library/email-examples.html</p>
<p>Released under MIT license.</p>
<p>Sample code:</p>
<p>import mailer</p>
<p>message = mailer.Message()<br />
message.From = &quot;</span>me@example.<span class="me1">com</span><span class="st0">&quot;<br />
message.To = &quot;</span>you@example.<span class="me1">com</span><span class="st0">&quot;<br />
message.Subject = &quot;</span>My Vacation<span class="st0">&quot;<br />
message.Body = open(&quot;</span>letter.<span class="me1">txt</span><span class="st0">&quot;, &quot;</span>rb<span class="st0">&quot;).read()<br />
message.attach(&quot;</span>picture.<span class="me1">jpg</span><span class="st0">&quot;)</p>
<p>mailer = mailer.Mailer('mail.example.com')<br />
mailer.send(message)</p>
<p>&quot;</span><span class="st0">&quot;&quot;</span><br />
<span class="kw1">import</span> <span class="kw3">smtplib</span></p>
<p><span class="co1"># Import the email modules we'll need</span><br />
<span class="kw1">from</span> <span class="kw3">email</span> <span class="kw1">import</span> encoders<br />
<span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">message</span> <span class="kw1">import</span> Message<br />
<span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">mime</span>.<span class="me1">audio</span> <span class="kw1">import</span> MIMEAudio<br />
<span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">mime</span>.<span class="me1">base</span> <span class="kw1">import</span> MIMEBase<br />
<span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">mime</span>.<span class="me1">image</span> <span class="kw1">import</span> MIMEImage<br />
<span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">mime</span>.<span class="me1">multipart</span> <span class="kw1">import</span> MIMEMultipart<br />
<span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">mime</span>.<span class="me1">text</span> <span class="kw1">import</span> MIMEText</p>
<p><span class="co1"># For guessing MIME type based on file name extension</span><br />
<span class="kw1">import</span> <span class="kw3">mimetypes</span></p>
<p><span class="kw1">from</span> <span class="kw3">os</span> <span class="kw1">import</span> path</p>
<p>__version__ = <span class="st0">&quot;0.1&quot;</span><br />
__author__ = <span class="st0">&quot;Ryan Ginstrom&quot;</span><br />
__license__ = <span class="st0">&quot;MIT&quot;</span></p>
<p><span class="kw1">class</span> Mailer<span class="br0">&#40;</span><span class="kw2">object</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
&nbsp; &nbsp; Represents an SMTP connection.</p>
<p>&nbsp; &nbsp; Use login() to log in with a username and password.<br />
&nbsp; &nbsp; &quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, host=<span class="st0">&quot;localhost&quot;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">host</span> = host<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._usr = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._pwd = <span class="kw2">None</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> login<span class="br0">&#40;</span><span class="kw2">self</span>, usr, <span class="kw3">pwd</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._usr = usr<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._pwd = <span class="kw3">pwd</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> send<span class="br0">&#40;</span><span class="kw2">self</span>, msg<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Send one message or a sequence of messages.</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; Every time you call send, the mailer creates a new<br />
&nbsp; &nbsp; &nbsp; &nbsp; connection, so if you have several emails to send, pass<br />
&nbsp; &nbsp; &nbsp; &nbsp; them as a list:<br />
&nbsp; &nbsp; &nbsp; &nbsp; mailer.send([msg1, msg2, msg3])<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;</span><span class="st0">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server = <span class="kw3">smtplib</span>.<span class="me1">SMTP</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">host</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>._usr <span class="kw1">and</span> <span class="kw2">self</span>._pwd:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; server.<span class="me1">login</span><span class="br0">&#40;</span><span class="kw2">self</span>._usr, <span class="kw2">self</span>._pwd<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> m <span class="kw1">in</span> msg:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._send<span class="br0">&#40;</span>server, m<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">TypeError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._send<span class="br0">&#40;</span>server, msg<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; server.<span class="me1">quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _send<span class="br0">&#40;</span><span class="kw2">self</span>, server, msg<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Sends a single message using the server<br />
&nbsp; &nbsp; &nbsp; &nbsp; we created in send()<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;</span><span class="st0">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; me = msg.<span class="me1">From</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; you = <span class="br0">&#91;</span>x.<span class="me1">strip</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">for</span> x <span class="kw1">in</span> msg.<span class="me1">To</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;,&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server.<span class="me1">sendmail</span><span class="br0">&#40;</span>me, you, msg.<span class="me1">as_string</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">class</span> Message<span class="br0">&#40;</span><span class="kw2">object</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
&nbsp; &nbsp; Represents an email message.</p>
<p>&nbsp; &nbsp; Set the To, From, Subject, and Body attributes as plain-text strings.<br />
&nbsp; &nbsp; Optionally, set the Html attribute to send an HTML email, or use the<br />
&nbsp; &nbsp; attach() method to attach files.</p>
<p>&nbsp; &nbsp; Even when sending an HTML email, you have to set the Body<br />
&nbsp; &nbsp; attribute as the alternative text version.</p>
<p>&nbsp; &nbsp; Send using the Mailer class.<br />
&nbsp; &nbsp; &quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">attachments</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._to = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">From</span> = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">Subject</span> = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">Body</span> = <span class="kw2">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">Html</span> = <span class="kw2">None</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _get_to<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; addrs = <span class="kw2">self</span>._to.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&quot;;&quot;</span>, <span class="st0">&quot;,&quot;</span><span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;,&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;, &quot;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#91;</span>x.<span class="me1">strip</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> x <span class="kw1">in</span> addrs<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">def</span> _set_to<span class="br0">&#40;</span><span class="kw2">self</span>, to<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._to = to</p>
<p>&nbsp; &nbsp; To = <span class="kw2">property</span><span class="br0">&#40;</span>_get_to, _set_to,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doc=<span class="st0">&quot;&quot;</span><span class="st0">&quot;The recipient(s) of the email.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Separate multiple recipients with commas or semicolons&quot;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> as_string<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;Get the email as a string to send in the mailer&quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> <span class="kw2">self</span>.<span class="me1">attachments</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">self</span>._plaintext<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">self</span>._multipart<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _plaintext<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;Plain text email with no attachments&quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> <span class="kw2">self</span>.<span class="me1">Html</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg = MIMEText<span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">Body</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg &nbsp;= <span class="kw2">self</span>._with_html<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._set_info<span class="br0">&#40;</span>msg<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> msg.<span class="me1">as_string</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _with_html<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;There's an html part&quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; outer = MIMEMultipart<span class="br0">&#40;</span><span class="st0">'alternative'</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; part1 = MIMEText<span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">Body</span>, <span class="st0">'plain'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; part2 = MIMEText<span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">Html</span>, <span class="st0">'html'</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; outer.<span class="me1">attach</span><span class="br0">&#40;</span>part1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outer.<span class="me1">attach</span><span class="br0">&#40;</span>part2<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> outer</p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _set_info<span class="br0">&#40;</span><span class="kw2">self</span>, msg<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; msg<span class="br0">&#91;</span><span class="st0">'Subject'</span><span class="br0">&#93;</span> = <span class="kw2">self</span>.<span class="me1">Subject</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; msg<span class="br0">&#91;</span><span class="st0">'From'</span><span class="br0">&#93;</span> = <span class="kw2">self</span>.<span class="me1">From</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; msg<span class="br0">&#91;</span><span class="st0">'To'</span><span class="br0">&#93;</span> = <span class="kw2">self</span>.<span class="me1">To</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _multipart<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;The email has attachments&quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; msg = MIMEMultipart<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; msg.<span class="me1">attach</span><span class="br0">&#40;</span>MIMEText<span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">Body</span>, <span class="st0">'plain'</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._set_info<span class="br0">&#40;</span>msg<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; msg.<span class="me1">preamble</span> = <span class="kw2">self</span>.<span class="me1">Subject</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> filename <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">attachments</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._add_attachment<span class="br0">&#40;</span>msg, filename<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> msg.<span class="me1">as_string</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _add_attachment<span class="br0">&#40;</span><span class="kw2">self</span>, outer, filename<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; ctype, encoding = <span class="kw3">mimetypes</span>.<span class="me1">guess_type</span><span class="br0">&#40;</span>filename<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> ctype <span class="kw1">is</span> <span class="kw2">None</span> <span class="kw1">or</span> encoding <span class="kw1">is</span> <span class="kw1">not</span> <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># No guess could be made, or the file is encoded (compressed), so</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># use a generic bag-of-bits type.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctype = <span class="st0">'application/octet-stream'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; maintype, subtype = ctype.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">'/'</span>, <span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fp = <span class="kw2">open</span><span class="br0">&#40;</span>filename, <span class="st0">'rb'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> maintype == <span class="st0">'text'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Note: we should handle calculating the charset</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg = MIMEText<span class="br0">&#40;</span>fp.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, _subtype=subtype<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> maintype == <span class="st0">'image'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg = MIMEImage<span class="br0">&#40;</span>fp.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, _subtype=subtype<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> maintype == <span class="st0">'audio'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg = MIMEAudio<span class="br0">&#40;</span>fp.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, _subtype=subtype<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg = MIMEBase<span class="br0">&#40;</span>maintype, subtype<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg.<span class="me1">set_payload</span><span class="br0">&#40;</span>fp.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Encode the payload using Base64</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; encoders.<span class="me1">encode_base64</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fp.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Set the filename parameter</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; msg.<span class="me1">add_header</span><span class="br0">&#40;</span><span class="st0">'Content-Disposition'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'attachment'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; filename=path.<span class="me1">basename</span><span class="br0">&#40;</span>filename<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outer.<span class="me1">attach</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> attach<span class="br0">&#40;</span><span class="kw2">self</span>, filename<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Attach a file to the email. Specify the name of the file;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Message will figure out the MIME type and load the file.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;</span><span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">attachments</span>.<span class="me1">append</span><span class="br0">&#40;</span>filename<span class="br0">&#41;</span></div>
]]></content:encoded>
			<wfw:commentRss>http://ginstrom.com/scribbles/2009/03/15/a-module-to-send-email-simply-in-python/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
	</channel>
</rss>

