<?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; email</title>
	<atom:link href="http://ginstrom.com/scribbles/tag/email/feed/" rel="self" type="application/rss+xml" />
	<link>http://ginstrom.com/scribbles</link>
	<description>Random scribbling about programming, translation, and Japan</description>
	<lastBuildDate>Fri, 11 May 2012 05:10:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>mailer version 0.5 released</title>
		<link>http://ginstrom.com/scribbles/2009/05/28/mailer-version-05-released/</link>
		<comments>http://ginstrom.com/scribbles/2009/05/28/mailer-version-05-released/#comments</comments>
		<pubDate>Thu, 28 May 2009 01:02:05 +0000</pubDate>
		<dc:creator>Ryan Ginstrom</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[mailer]]></category>

		<guid isPermaLink="false">http://ginstrom.com/scribbles/?p=1094</guid>
		<description><![CDATA[I've released version 0.5 of my mailer python module for sending emails. Thanks to a patch from Douglas Mayle, this version makes it possible to send HTML emails with attachments (previous versions only let you do one or the other). Project homepage pypi page]]></description>
			<content:encoded><![CDATA[<p>I've released version 0.5 of my <a href="http://pypi.python.org/pypi/mailer/">mailer python module</a> for sending emails. Thanks to a patch from Douglas Mayle, this version makes it possible to send HTML emails with attachments (previous versions only let you do one or the other).</p>
<ul>
<li><a href="/code/mailer.html">Project homepage</a></li>
<li><a href="http://pypi.python.org/pypi/mailer/">pypi page</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ginstrom.com/scribbles/2009/05/28/mailer-version-05-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Version 0.2 of mailer module released</title>
		<link>http://ginstrom.com/scribbles/2009/03/29/version-02-of-mailer-module-released/</link>
		<comments>http://ginstrom.com/scribbles/2009/03/29/version-02-of-mailer-module-released/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 02:45:19 +0000</pubDate>
		<dc:creator>Ryan Ginstrom</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[mailer]]></category>
		<category><![CDATA[module]]></category>

		<guid isPermaLink="false">http://ginstrom.com/scribbles/?p=927</guid>
		<description><![CDATA[I updated my mailer module (blogged about here) to version 0.2, and also uploaded it to pyPI. Improvements in this version: Default arguments in Message.__init__() method Support for non-ascii charsets (in body and subject) Support for Python 2.4 With the support for non-ascii encodings, you can now do this: from mailer import Mailer from mailer [...]]]></description>
			<content:encoded><![CDATA[<p>I updated my mailer module (<a href="/scribbles/2009/03/15/a-module-to-send-email-simply-in-python/">blogged about here</a>) to version 0.2, and also uploaded it to <a href="http://pypi.python.org/pypi/mailer/">pyPI</a>.</p>
<p>Improvements in this version:</p>
<ul>
<li>Default arguments in Message.__init__() method</li>
<li>Support for non-ascii charsets (in body and subject)</li>
<li>Support for Python 2.4</li>
</ul>
<p>With the support for non-ascii encodings, you can now do this:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">from</span> mailer <span class="kw1">import</span> Mailer<br />
<span class="kw1">from</span> mailer <span class="kw1">import</span> Message</p>
<p>mailer = Mailer<span class="br0">&#40;</span><span class="st0">'smtp.example.com'</span><span class="br0">&#41;</span></p>
<p>msg = Message<span class="br0">&#40;</span>From=<span class="st0">&quot;me@example.com&quot;</span>, To=<span class="st0">&quot;you@example.com&quot;</span><span class="br0">&#41;</span><br />
msg.<span class="me1">Subject</span> = <span class="st0">&quot;テキストメール&quot;</span><br />
msg.<span class="me1">Body</span> = <span class="st0">&quot;これは、日本語のキストメールでございます。&quot;</span><br />
msg.<span class="me1">charset</span> = <span class="st0">&quot;utf-8&quot;</span></p>
<p>mailer.<span class="me1">send</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</span></div>
<p>And the Message instance will properly encode the subject line and message body. Note that there's currently no support for Unicode strings; you've got to pass in encoded strings.</p>
<p>Thanks to everyone who provided feedback on this module.</p>
<p>The mailer module also has a <a href="/code/mailer.html">home page</a>.</p>
<p>The full code of the new module is below.</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"># this is to support name changes</span><br />
<span class="co1"># from version 2.4 to version 2.5</span><br />
<span class="kw1">try</span>:<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span> <span class="kw1">import</span> encoders<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">header</span> <span class="kw1">import</span> make_header<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">message</span> <span class="kw1">import</span> Message<br />
&nbsp; &nbsp; <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 />
&nbsp; &nbsp; <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 />
&nbsp; &nbsp; <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 />
&nbsp; &nbsp; <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 />
&nbsp; &nbsp; <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<br />
<span class="kw1">except</span> <span class="kw2">ImportError</span>:<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span> <span class="kw1">import</span> Encoders as encoders<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">Header</span> <span class="kw1">import</span> make_header<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">MIMEMessage</span> <span class="kw1">import</span> Message<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">MIMEAudio</span> <span class="kw1">import</span> MIMEAudio<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">MIMEBase</span> <span class="kw1">import</span> MIMEBase<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">MIMEImage</span> <span class="kw1">import</span> MIMEImage<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">MIMEMultipart</span> <span class="kw1">import</span> MIMEMultipart<br />
&nbsp; &nbsp; <span class="kw1">from</span> <span class="kw3">email</span>.<span class="me1">MIMEText</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.2&quot;</span><br />
__author__ = <span class="st0">&quot;Ryan Ginstrom&quot;</span><br />
__license__ = <span class="st0">&quot;MIT&quot;</span><br />
__description__ = <span class="st0">&quot;A module to send email simply in Python&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; num_msgs = <span class="kw2">len</span><span class="br0">&#40;</span>msg<span class="br0">&#41;</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<br />
&nbsp; &nbsp; plain-text strings. Optionally, set the Html attribute<br />
&nbsp; &nbsp; to send an HTML email, or use the attach() method<br />
&nbsp; &nbsp; to attach files.</p>
<p>&nbsp; &nbsp; Use the charset property to send messages using other<br />
&nbsp; &nbsp; than us-ascii</p>
<p>&nbsp; &nbsp; If you specify an attachments argument, it should be a<br />
&nbsp; &nbsp; list of attachment filenames: [&quot;</span>file1.<span class="me1">txt</span><span class="st0">&quot;, &quot;</span>file2.<span class="me1">txt</span><span class="st0">&quot;]</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>, To=<span class="kw2">None</span>, From=<span class="kw2">None</span>, Subject=<span class="kw2">None</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Body=<span class="kw2">None</span>, Html=<span class="kw2">None</span>, attachments=<span class="kw2">None</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; charset=<span class="kw2">None</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">attachments</span> = attachments <span class="kw1">or</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>._to = To<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">From</span> = From<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">Subject</span> = Subject<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">Body</span> = Body<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">Html</span> = Html<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">charset</span> = charset <span class="kw1">or</span> <span class="st0">'us-ascii'</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; <span class="st0">&quot;&quot;</span><span class="st0">&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Making this a property so we can be permissive about<br />
&nbsp; &nbsp; &nbsp; &nbsp; how to set the &quot;</span>To<span class="st0">&quot; field, i.e.<br />
&nbsp; &nbsp; &nbsp; &nbsp; me;you/me,you/me; you/me, you<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;</span><span class="st0">&quot;&quot;</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<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 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="st0">'plain'</span>, <span class="kw2">self</span>.<span class="me1">charset</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="kw2">self</span>.<span class="me1">charset</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="kw2">self</span>.<span class="me1">charset</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; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">charset</span> == <span class="st0">'us-ascii'</span>:<br />
&nbsp; &nbsp; &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; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subject = <span class="kw2">unicode</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">Subject</span>, <span class="kw2">self</span>.<span class="me1">charset</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; msg<span class="br0">&#91;</span><span class="st0">'Subject'</span><span class="br0">&#93;</span> = <span class="kw2">str</span><span class="br0">&#40;</span>make_header<span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#40;</span>subject,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">charset</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</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="kw2">self</span>.<span class="me1">charset</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</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># (compressed), so 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>, <span class="st0">'attachment'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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<br />
&nbsp; &nbsp; &nbsp; &nbsp; the file; Message will figure out the MIME type<br />
&nbsp; &nbsp; &nbsp; &nbsp; 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/29/version-02-of-mailer-module-released/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<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>
		<item>
		<title>End of an era: Goodbye, fax-to-email service</title>
		<link>http://ginstrom.com/scribbles/2009/01/15/end-of-an-era-goodbye-fax-to-email-service/</link>
		<comments>http://ginstrom.com/scribbles/2009/01/15/end-of-an-era-goodbye-fax-to-email-service/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 11:49:28 +0000</pubDate>
		<dc:creator>Ryan Ginstrom</dc:creator>
				<category><![CDATA[freelancing]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[fax]]></category>
		<category><![CDATA[modern]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[translation]]></category>

		<guid isPermaLink="false">http://ginstrom.com/scribbles/?p=805</guid>
		<description><![CDATA[Faxes used to be an essential tool for translators, but they seem to be going the way of the dodo these days. Back when faxes were on thermal paper and I got most of my translation documents via fax, having a fax-to-email service was a godsend. It was quicker and cheaper, the faxes were easier [...]]]></description>
			<content:encoded><![CDATA[<p>Faxes used to be an essential tool for translators, but they seem to be going the way of the dodo these days. Back when faxes were on thermal paper and I got most of my translation documents via fax, having a fax-to-email service was a godsend. It was quicker and cheaper, the faxes were easier to manage, and the image quality was better.</p>
<p>I've been using a fax-to-email service for almost 10 years now. I've most recently been using a Japanese service named <a href="http://faxcast.ne.jp/">faxcast</a>. Last month I got a notice from them saying that they were effectively raising their fee by $50/year (by getting rid of their yearly plan, where we paid 10 months' worth for a year).</p>
<p>This caused me to reexamine my fax usage. Going back over the past year, I found that I've only received two faxes through the service, neither of which were work related. Nowadays, almost all the translation documents I get are in electronic form. Companies that used to send me faxes now scan them themselves and send them as PDF attachments via email.</p>
<p>So there's really not much use in me keeping up this service. I have a fax machine in my office for the rare occasion that anyone would want to send me a fax, and $300/year for a service I never use is a bit much. I therefore decided to cancel my fax-to-email service as of January 20. I guess I should thank faxcast for raising their prices and making me reconsider their service (although it might not be exactly the effect they were hoping for &lt;g&gt;).</p>
]]></content:encoded>
			<wfw:commentRss>http://ginstrom.com/scribbles/2009/01/15/end-of-an-era-goodbye-fax-to-email-service/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Virus scam targeting translators</title>
		<link>http://ginstrom.com/scribbles/2008/10/11/virus-scam-targeting-translators/</link>
		<comments>http://ginstrom.com/scribbles/2008/10/11/virus-scam-targeting-translators/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 05:27:00 +0000</pubDate>
		<dc:creator>Ryan Ginstrom</dc:creator>
				<category><![CDATA[translation]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[scam]]></category>
		<category><![CDATA[translator]]></category>

		<guid isPermaLink="false">http://ginstrom.com/scribbles/?p=419</guid>
		<description><![CDATA[A number of translators have been receiving scam emails containing a virus attachment, disguised as a file to be translated. Here's the text of the email I received: Subject: High Quality Translation I haven't seen you for weeks I need this document translated, and the translation is to be of high quality. The attorney asked [...]]]></description>
			<content:encoded><![CDATA[<p>A number of translators have been receiving scam emails containing a virus attachment, disguised as a file to be translated. Here's the text of the email I received:</p>
<blockquote><p>
<strong>Subject: High Quality Translation</strong></p>
<p>I haven't seen you for weeks</p>
<p> I need this document translated, and the translation is to be of high quality.<br />
The attorney asked me to be especially careful with page 2. As I need to submit the document tomorrow, please have it checked and translated for me today.</p>
<p> I have deposited $150 to your credit card account that you gave me the last time.<br />
Let me know if any questions occur.</p>
<p> P.S. The document is in the ZIP-compressed MS Word file attached to this message.<br />
I look forward to getting the result ASAP.</p>
<p>So long<br />
Irene Sutherland</p></blockquote>
<p>It came with the attachment "Document.zip," which as you might expect contains a rather new virus (some anti-virus software is apparently failing to pick it up).</p>
<p>Several other translators have reported receiving it. The attack is somewhat novel in that it specifically targets translators. I used to get a lot of scam emails along the lines of "my daughter requires an interpreter near your hometown on date X"; presumably to be followed with a request for funds to "facilitate" the process. In my memory, however, this is the first time I've received a virus scam with a "translate this" angle. Beware, translators!</p>
]]></content:encoded>
			<wfw:commentRss>http://ginstrom.com/scribbles/2008/10/11/virus-scam-targeting-translators/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

