<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4403526088545417126</id><updated>2010-07-02T03:45:10.019-04:00</updated><title type='text'>Coding Frenzy</title><subtitle type='html'>Code and thoughts; posted occasionally.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codingfrenzy.alexpmay.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default'/><link rel='alternate' type='text/html' href='http://codingfrenzy.alexpmay.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alex</name><uri>http://www.blogger.com/profile/04839463833553068390</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4403526088545417126.post-6442225596922031241</id><published>2008-01-09T11:52:00.000-05:00</published><updated>2008-01-24T00:19:29.578-05:00</updated><title type='text'>AJAX, Django, RoR</title><content type='html'>Michael has a &lt;a href="http://mrlauer.wordpress.com/2008/01/07/django-ajax-scriptaculous/"&gt;couple &lt;/a&gt;of &lt;a href="http://mrlauer.wordpress.com/2008/01/03/django-and-ajax/"&gt;posts &lt;/a&gt;on ajax and django.  Since we occasionally discuss the merits and faults of rails and django, I thought I would provide a similar example in rails (version 2.02). At the end of this post I've included the entire source code of a rails application that creates a search form, submits the search string via XMLHttpRequest, generates random search data, updates the search results independently of the rest of the  page, and for kicks - makes the search results flash.&lt;br /&gt;&lt;br /&gt;It is simple but instructive.  To my eye, it is more elegant than the django code. for a couple of reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No JavaScript.  I love JavaScript and have written plenty of it, but for simple and moderately complex things rails gets the abstraction correct.  Rails' ajax helpers (form_remote_tag and page in this case), do all the work for you.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Easy reuse of partials.   Michael had to jump through a few hoops to reuse his 'searchresults' partial (partial in rails == tag in djago).  This is because django is not aware of the ajax library and thus cannot provide facilities to automate the reuse.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Edit:  My apologies for the code formatting.  The formatter I used does not recognize the html.erb syntax, and made a mess of the entire code block.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="comment"&gt;# 1) create a rails application by running "rails ajaxform" at a command prompt&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# 2) create the files listed below&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# 3) start the server by running "script/server" (mac,*nix) or "ruby script/server" (windows)&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# 4) point your webrowser at http://localhost:3000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# ----- app/views/foos/search.html.erb -----&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="ident"&gt;form_remote_tag&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:url=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:action=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;search&lt;/span&gt;&lt;span class="punct"&gt;'})&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;&amp;lt;%= text_field_tag('search_str') %&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; submit_tag 'Search' %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&amp;lt;%&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:partial=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;search_results&lt;/span&gt;&lt;span class="punct"&gt;'%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;&lt;br /&gt;# ----- app/views/foos/_search_results.html.erb -----&lt;br /&gt;&amp;lt;div id='search_results'&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; @search_results.size &amp;gt; 0 ? @search_results.collect do |result| "&amp;lt;p&amp;gt;&lt;span class="expr"&gt;#{result}&lt;/span&gt;&amp;lt;/p&amp;gt;" end.join : "No Search Results" %&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;# ----- app/views/foos/search.js.rjs--------&lt;br /&gt;page[:search_results].replace(:partial&lt;/span&gt;&lt;span class="punct"&gt;=&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;search_results&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:search_results&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;visual_effect&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:pulsate&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  &lt;span class="comment"&gt;# just for fun!`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# ----- app/controllers/foos_controller.rb -----&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;FoosController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ApplicationController&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;search&lt;/span&gt;&lt;br /&gt;&lt;span class="attribute"&gt;@search_results&lt;/span&gt;&lt;span class="punct"&gt;=[]&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;search_str&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:search_str&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="attribute"&gt;@search_results&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;..&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)).&lt;/span&gt;&lt;span class="ident"&gt;collect&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;ii&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{search_str}&lt;/span&gt; + &lt;span class="expr"&gt;#{ii}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;respond_to&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;js&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# ----- app/views/layouts/application.html.erb -----&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;head&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt;javascript_include_tag :defaults%&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;%&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;yield&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;&amp;lt;/body&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;html&amp;gt;&lt;span class="normal"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4403526088545417126-6442225596922031241?l=codingfrenzy.alexpmay.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingfrenzy.alexpmay.com/feeds/6442225596922031241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=4403526088545417126&amp;postID=6442225596922031241' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/6442225596922031241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/6442225596922031241'/><link rel='alternate' type='text/html' href='http://codingfrenzy.alexpmay.com/2008/01/ajax-django-ror.html' title='AJAX, Django, RoR'/><author><name>Alex</name><uri>http://www.blogger.com/profile/04839463833553068390</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09379139710158844634'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4403526088545417126.post-7655751526525588818</id><published>2007-12-07T11:58:00.001-05:00</published><updated>2007-12-07T12:05:23.939-05:00</updated><title type='text'>How to Format Ruby Code in a Blog Post</title><content type='html'>My previous post was the first time I had ever presented ruby code in a post.  &lt;a href="http://blog.wolfman.com/articles/2006/05/26/howto-format-ruby-code-for-blogs"&gt;This article&lt;/a&gt; saved me the hassle of figuring it out how to make it look pretty (I stuck the css directly into my blogger template).  Thanks Wolfmann.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4403526088545417126-7655751526525588818?l=codingfrenzy.alexpmay.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingfrenzy.alexpmay.com/feeds/7655751526525588818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=4403526088545417126&amp;postID=7655751526525588818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/7655751526525588818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/7655751526525588818'/><link rel='alternate' type='text/html' href='http://codingfrenzy.alexpmay.com/2007/12/how-to-format-ruby-code-in-blog-post.html' title='How to Format Ruby Code in a Blog Post'/><author><name>Alex</name><uri>http://www.blogger.com/profile/04839463833553068390</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09379139710158844634'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4403526088545417126.post-1810525486832888684</id><published>2007-12-07T10:18:00.001-05:00</published><updated>2008-01-24T00:20:12.239-05:00</updated><title type='text'>Sending GMail from a Standalone Ruby Script</title><content type='html'>As part of my rails application, I need to send emails from a stand alone ruby script.  For example, the back end of my rails application is a (currently) small postgres database.  The easiest way to back it up is to send a database dump to myself via gmail.&lt;br /&gt;&lt;br /&gt;There are several tutorials on how to &lt;a href="http://www.stephenchu.com/2006_06_01_archive.html"&gt;send gmail directly from a rails app&lt;/a&gt;.  Presented here is a method for doing it from a standalone script.  This method assumes rails is installed, but the script itself runs outside of any rails application.  In my case in the wee hours of the morning as a cron job.&lt;br /&gt;&lt;br /&gt;Usage of this script would be something like:&lt;br /&gt;&lt;pre&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;send_gmail&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;={&lt;/span&gt;&lt;span class="symbol"&gt;:to=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;name@domain.com&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:subject=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;subject&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:body=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;'}&lt;/span&gt;&lt;br /&gt;&lt;span class="constant"&gt;SendGMail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;send_gmail&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The script can also handle attachments, albeit in an unusual way.  Instead of giving it a file, you give it the data directly, along with a filename, mime_type, and transfer encoding:&lt;br /&gt;&lt;pre&gt;&lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;={&lt;/span&gt;&lt;span class="symbol"&gt;:mime_type=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;application/x-gzip&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:body=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;make_body&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:transfer_encoding=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;base64&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:filename=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;backup.tar.gz&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;]=&lt;/span&gt;&lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It should be easy enough to modify the script to handle files as attachments directly, but I didn't have such a need.&lt;br /&gt;&lt;br /&gt;Here is the complete listing.  My thanks to Stephun Chu, as most of this is cribbed from his aforementioned &lt;a href="http://www.stephenchu.com/2006_06_01_archive.html"&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Edit: Fixed syntax error - Thanks Nolan!  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;send_gmail.rb&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;#!/usr/bin/env ruby&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;actionmailer&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;action_mailer&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;openssl&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;net/smtp&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;SendGMail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="attribute"&gt;@user_name&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;username@domain.com&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="attribute"&gt;@domain&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;domain.com&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="attribute"&gt;@password&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;password&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;SendGMail.send_gmail&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;raw_attachments&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetch&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:raw_attachements&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;[])&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;has_key?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;raw_attachments&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;push&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;TMail&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:to&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;date&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;from&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="attribute"&gt;@user_name&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;subject&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:subject&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;main&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;main&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;TMail&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;main&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;hsh&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:body&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;main&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;main&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_content_type&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;text/plain&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;'=&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;utf-8&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;push&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;main&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;raw_attachment&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;raw_attachments&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;part&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;TMail&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;transfer_encoding&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:transfer_encoding&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:body&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;transfer_encoding&lt;/span&gt; &lt;span class="punct"&gt;||&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="punct"&gt;").&lt;/span&gt;&lt;span class="ident"&gt;downcase&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;base64&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;&lt;br /&gt;     &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;TMail&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base64&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;folding_encode&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;quoted-printable&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;     &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;pack&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;M*&lt;/span&gt;&lt;span class="punct"&gt;")&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;     &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;body&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt; &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;transfer_encoding&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;transfer_encoding&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_content_type&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:mime_type&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:filename&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_content_disposition&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;attachment&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;filename&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;raw_attachment&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:filename&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;push&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;part&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_content_type&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;multipart&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mixed&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;br /&gt;&lt;span class="constant"&gt;ActionMailer&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;deliver&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;mail&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;ActionMailer&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;smtp_settings&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="symbol"&gt;:address&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;smtp.gmail.com&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;&lt;br /&gt;&lt;span class="symbol"&gt;:domain&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@domain&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span class="symbol"&gt;:authentication&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:plain&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span class="symbol"&gt;:port&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;587&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span class="symbol"&gt;:user_name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@user_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span class="symbol"&gt;:password&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@password&lt;/span&gt;&lt;br /&gt;&lt;span class="punct"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;Net&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SMTP&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;class_eval&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;private&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;do_start&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;helodomain&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;secret&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;authtype&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;IOError&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;SMTP session already started&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@started&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;check_auth_args&lt;/span&gt; &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;secret&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;authtype&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;user&lt;/span&gt; &lt;span class="keyword"&gt;or&lt;/span&gt; &lt;span class="ident"&gt;secret&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="ident"&gt;sock&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;timeout&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@open_timeout&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="constant"&gt;TCPSocket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@address&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@port&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Net&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;InternetMessageIO&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sock&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read_timeout&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;60&lt;/span&gt; &lt;span class="comment"&gt;#@read_timeout&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;debug_output&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;STDERR&lt;/span&gt; &lt;span class="comment"&gt;#@debug_output&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="ident"&gt;check_response&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;critical&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;recv_response&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt; &lt;span class="punct"&gt;})&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;do_helo&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;helodomain&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;openssl library not installed&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="keyword"&gt;defined?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;OpenSSL&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;starttls&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;ssl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;OpenSSL&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SSL&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SSLSocket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sock&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;ssl&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sync_close&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;ssl&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Net&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;InternetMessageIO&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;ssl&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read_timeout&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;60&lt;/span&gt; &lt;span class="comment"&gt;#@read_timeout&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;debug_output&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;STDERR&lt;/span&gt; &lt;span class="comment"&gt;#@debug_output&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;do_helo&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;helodomain&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="ident"&gt;authenticate&lt;/span&gt; &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;secret&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;authtype&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;user&lt;/span&gt;&lt;br /&gt; &lt;span class="attribute"&gt;@started&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;ensure&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="attribute"&gt;@started&lt;/span&gt;&lt;br /&gt;   &lt;span class="comment"&gt;# authentication failed, cancel connection.&lt;/span&gt;&lt;br /&gt;     &lt;span class="attribute"&gt;@socket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; &lt;span class="attribute"&gt;@started&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; &lt;span class="attribute"&gt;@socket&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;closed?&lt;/span&gt;&lt;br /&gt;   &lt;span class="attribute"&gt;@socket&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;do_helo&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;helodomain&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;begin&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@esmtp&lt;/span&gt;&lt;br /&gt;     &lt;span class="ident"&gt;ehlo&lt;/span&gt; &lt;span class="ident"&gt;helodomain&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;     &lt;span class="ident"&gt;helo&lt;/span&gt; &lt;span class="ident"&gt;helodomain&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;Net&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;ProtocolError&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@esmtp&lt;/span&gt;&lt;br /&gt;     &lt;span class="attribute"&gt;@esmtp&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;br /&gt;     &lt;span class="attribute"&gt;@error_occured&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;br /&gt;     &lt;span class="keyword"&gt;retry&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;   &lt;span class="keyword"&gt;raise&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;starttls&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;getok&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;STARTTLS&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;quit&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;begin&lt;/span&gt;&lt;br /&gt;   &lt;span class="ident"&gt;getok&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;QUIT&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;EOFError&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;OpenSSL&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SSL&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;SSLError&lt;/span&gt;&lt;br /&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4403526088545417126-1810525486832888684?l=codingfrenzy.alexpmay.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingfrenzy.alexpmay.com/feeds/1810525486832888684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=4403526088545417126&amp;postID=1810525486832888684' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/1810525486832888684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/1810525486832888684'/><link rel='alternate' type='text/html' href='http://codingfrenzy.alexpmay.com/2007/12/sending-gmail-from-standalone-ruby.html' title='Sending GMail from a Standalone Ruby Script'/><author><name>Alex</name><uri>http://www.blogger.com/profile/04839463833553068390</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09379139710158844634'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4403526088545417126.post-1910556975063628052</id><published>2007-11-15T13:55:00.000-05:00</published><updated>2007-11-16T11:54:55.778-05:00</updated><title type='text'>Syntax Coloring for Dynamic Stylesheets</title><content type='html'>I often need to dynamically generate stylesheets.  Thankfully this path is well worn and solutions are readily available for Ruby on Rails.  I chose the ERb/CSS based solution presented here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.hasmanythrough.com/2006/03/23/dirt-simple-rcss-templates"&gt;Dirt Simple .rcss templates&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.hasmanythrough.com/2007/10/18/simpler-than-dirt-restful-dynamic-css"&gt;Simpler than dirt: RESTful Dynamic CSS&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;If you're in the market, I'd also recommend  looking at &lt;a href="http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html"&gt;Sass (Syntactically Awesome StyleSheets)&lt;/a&gt;.   I'll explain my choice in favor of ERb/CSS in a future post.&lt;br /&gt;&lt;br /&gt;One of the issues with the ERb/CSS solution is that editors are not aware of the syntax.  To remedy this, I have created a plugin for ActiveState's Komodo IDE .&lt;br /&gt;&lt;br /&gt;The plugins are here (with the usual &lt;a href="http://www.alexpmay.com/disclaimer"&gt;disclaimer&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.alexpmay.com/css-erb-highlight-only-1.0.0-ko.xpi"&gt;css-erb-highlight-only-1.0.0-ko.xpi&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.alexpmay.com/css-erb-highlight-and-check-1.0.0-ko.xpi"&gt;css-erb-highlight-and-check-1.0.0-ko.xpi&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.alexpmay.com/rcss-highlight-only-1.0.0-ko.xpi"&gt;rcss-highlight-only-1.0.0-ko.xpi&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.alexpmay.com/rcss-highlight-and_check-1.0.0-ko.xpi"&gt;rcss-highlight-and_check-1.0.0-ko.xpi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The "highlight-and-check" versions provide syntax highlighting, syntax checking, and auto indentation.  However due to a shortcoming in ActiveState's tools, the syntax checking is imperfect and you will see syntax errors where there are none.  I will remedy this as soon at the tools allow.&lt;br /&gt;&lt;br /&gt;It should go without saying that the "highlight-only" versions only provide syntax highlighting, and the  "css-erb" and  "rcss" versions provide  the functionality for the ".css.erb" and ".rcss" extensions respectively.&lt;br /&gt;&lt;br /&gt;In a future post, I hope detail how these extensions were created.&lt;br /&gt;&lt;br /&gt;I'm using  Komodo IDE 4.2 on Mac OS X, but I believe the extensions will work in all Komodo 4 products.  Please let me know if they don't.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4403526088545417126-1910556975063628052?l=codingfrenzy.alexpmay.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingfrenzy.alexpmay.com/feeds/1910556975063628052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=4403526088545417126&amp;postID=1910556975063628052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/1910556975063628052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4403526088545417126/posts/default/1910556975063628052'/><link rel='alternate' type='text/html' href='http://codingfrenzy.alexpmay.com/2007/11/syntax-coloring-for-dynamic-css.html' title='Syntax Coloring for Dynamic Stylesheets'/><author><name>Alex</name><uri>http://www.blogger.com/profile/04839463833553068390</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09379139710158844634'/></author><thr:total>0</thr:total></entry></feed>