<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">

<channel>
	<title>FastMail.FM Weblog</title>
	
	<link>http://blog.fastmail.fm</link>
	<description>Blog for FastMail.FM announcements, news and comments</description>
	<lastBuildDate>Tue, 24 Jan 2012 20:17:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain="blog.fastmail.fm" port="80" path="/?rsscloud=notify" registerProcedure="" protocol="http-post" />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>FastMail.FM Weblog</title>
		<link>http://blog.fastmail.fm</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.fastmail.fm/osd.xml" title="FastMail.FM Weblog" />
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/fastmailblog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="fastmailblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://blog.fastmail.fm/?pushpress=hub" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">fastmailblog</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>New File Storage backend</title>
		<link>http://blog.fastmail.fm/2012/01/24/new-file-storage-backend/</link>
		<comments>http://blog.fastmail.fm/2012/01/24/new-file-storage-backend/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 20:17:56 +0000</pubDate>
		<dc:creator>brongondwana</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://blog.fastmail.fm/?p=1108</guid>
		<description><![CDATA[You may notice that the Files screen loads quite a lot faster now, particularly if you have many folders. The File Storage backend has been in need of an overhaul for a long time.  In order to have reliable cache expiry, it was quite single threaded.  We have been throwing around various ideas about how [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1108&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>You may notice that the Files screen loads quite a lot faster now, particularly if you have many folders.</p>
<p>The File Storage backend has been in need of an overhaul for a long time.  In order to have reliable cache expiry, it was quite single threaded.  We have been throwing around various ideas about how to make those changes for a while, and today I finally set a full day aside, ignoring all other issues, and tested a few things.</p>
<p>One major thing has changed since I first wrote the VFS code 6 years ago.  We&#8217;re not constrained by memory for metadata any more.  The VFS had small limits set to avoid blowing out the memory on an individual web process.  Well.  Our smallest web server has 24Gb RAM now.  The newer ones have 48.  The smallest DB server has 64Gb RAM.  There&#8217;s no point in caching hot data to disk, because it will be in memory anyway.</p>
<p>So the eventual change was to throw away all the caching layers except one very temporary in-memory one.  There were 1 disk (tmpfs) and two in-memory layers of caching before, so it probably actually saves memory anyway.</p>
<p>The code was also very general, which is fine &#8211; but a couple of carefully thought out queries later, I could make one DB fetch to get the full directory tree, plus metadata, and pre-populate the in-memory cache with the fields it was about to ask for.  This, again, is much more efficient than pulling the data from a local cache and checking it for staleness.</p>
<p>The end result &#8211; faster response, simpler code, and a few bugs (particularly with long-lived FTP connections) cleared up.</p>
<p>I also backported all the changes to the oldweb interface, so attachments on the compose screen still work, and the Files screen there still works.</p>
<p>The take-home lesson from all this, keep it simple stupid.  The caching complexity isn&#8217;t needed any more, if it ever was, and the simpler architecture will help.  I didn&#8217;t even have to make any DB schema changes (except dropping a couple of no-longer-used Cache management tables)</p>
<p>There should be no user-visible changes from any of this.  The APIs are all identical for our application layers: webdav, ftp, websites and the Files screen are all the same.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1108&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/01/24/new-file-storage-backend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c55ece7022f0678e7b270ec72115b394?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">brongondwana</media:title>
		</media:content>
	</item>
		<item>
		<title>Monthly bandwidth limits removed</title>
		<link>http://blog.fastmail.fm/2012/01/09/monthly-bandwidth-limits-removed/</link>
		<comments>http://blog.fastmail.fm/2012/01/09/monthly-bandwidth-limits-removed/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 04:46:23 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1105</guid>
		<description><![CDATA[TL;DR: All monthly bandwidth limits for emails and files have been removed. Existing hourly limits still apply, and new daily limits have been added. The monthly sum of the new daily limits is significantly higher than the old monthly limits. More details: When building an email service, one of the things we realised quickly early [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1105&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.urbandictionary.com/define.php?term=tl%3Bdr">TL;DR</a>: All monthly bandwidth limits for emails and files have been removed. Existing hourly limits still apply, and new daily limits have been added. The monthly sum of the new daily limits is significantly higher than the old monthly limits.</p>
<p>More details: When building an email service, one of the things we realised quickly early on is that you have to deal with abuse and resource limiting issues. If you don&#8217;t set any limits, people will abuse your service.</p>
<p>Because we always regarded speed and reliability as highly important, when we first chose our data center, we picked a place with a great network (<a href="http://www.nyi.net/">NYI</a>), however that came with higher bandwidth costs, which meant that we had to put systems in place to track and limit users monthly bandwidth usage.</p>
<p>Additionally over time we added systems to track email sending and receiving in real time, and added hourly limits to stop mass mail floods or spam sending runs.</p>
<p>Since adding these limits, we&#8217;ve found that the short term limits have become more important to stop abuse, while the monthly limits have become less and less of an issue, and from today, we&#8217;re now removing all monthly bandwidth quotas.</p>
<p>We are still implementing hourly quotas, and have also added daily quotas, though the sum of these daily quotas over a month is significantly higher than the previous monthly quotas and is a large increase for all users.</p>
<h3></h3>
<h2>Email bandwidth quotas (all in MB)</h2>
<table style="line-height:normal;border-collapse:collapse;" border="0" cellspacing="0" cellpadding="0" width="748">
<col style="width:59pt;" width="79" />
<col style="width:67pt;" width="89" />
<col style="width:61pt;" width="82" />
<col style="width:73pt;" width="97" />
<col style="width:61pt;" width="82" />
<tbody>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23" width="98">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="111" align="center"><font face="Calibri"><font color="#000000"><strong>Recv hourly</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="111" align="center"><font face="Calibri"><font color="#000000"><strong>Sent hourly</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="101" align="center"><font face="Calibri"><font color="#000000"><strong>Sent+recv hourly</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="101" align="center"><font face="Calibri"><font color="#000000"><strong>Sent+recv daily</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="121" align="center"><font face="Calibri"><font color="#000000"><strong>Sent+recv monthly                <br />(daily x 30)</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="101" align="center"><font face="Calibri"><font color="#000000"><strong>Old (sent+recv) monthly</strong></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23"><font face="Calibri"><font color="#000000"><strong>Personal</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Guest</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>30 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>30 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>120 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>3,600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>160 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Member</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>120 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>240 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>7,200 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>160 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Ad free</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>120 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>240 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>7,200 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>640 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Full</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>300 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>300 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,200 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>36,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,200 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Enhanced</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>120,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23"><font face="Calibri"><font color="#000000"><strong>Family</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68">&#160;</td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Lite</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>300 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>300 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,200 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>36,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>800 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Everyday</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>120,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,600 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Superior</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>8,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>240,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23"><font face="Calibri"><font color="#000000"><strong>Business</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68">&#160;</td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Basic</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>300 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>300 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,200 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>36,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,600 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Standard</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>120,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Professional</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>8,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>240,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>16,000 </font></font></font></td>
</tr>
</tbody>
</table>
<p>&#160;</p>
<h2>File bandwidth quotas (all in MB)</h2>
<table style="line-height:normal;border-collapse:collapse;" border="0" cellspacing="0" cellpadding="0" width="525">
<col style="width:59pt;" width="79" />
<col style="width:67pt;" width="89" />
<col style="width:61pt;" width="82" />
<tbody>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23" width="98">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="111" align="center"><font face="Calibri"><font color="#000000"><strong>Hourly</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="111" align="center"><font face="Calibri"><font color="#000000"><strong>Daily</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="101" align="center"><font face="Calibri"><font color="#000000"><strong>Monthly                <br />(daily x 30)</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" width="101" align="center"><font face="Calibri"><font color="#000000"><strong>Old monthly</strong></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23"><font face="Calibri"><font color="#000000"><strong>Personal</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl69" align="center">&#160;</td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Guest</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>10 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>20 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>80 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Member</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>10 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>20 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>80 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Ad free</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>10 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>20 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>600 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>160 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Full</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>500 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>30,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Enhanced</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>16,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23"><font face="Calibri"><font color="#000000"><strong>Family</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Lite</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>500 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>30,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>160 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Everyday</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Superior</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>3,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>6,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>180,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>40,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl65" height="23"><font face="Calibri"><font color="#000000"><strong>Business</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl71">&#160;</td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Basic</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>500 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>30,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>320 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Standard</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>1,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>2,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>60,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>4,000 </font></font></font></td>
</tr>
<tr style="height:14.4pt;">
<td style="padding-left:12px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl70" height="23"><font face="Calibri"><font color="#000000"><strong>Professional</strong></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>3,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl66"><font face="Calibri"><font color="#000000"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>6,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl67"><font face="Calibri"><font color="#376091"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>180,000 </font></font></font></td>
<td style="padding-left:1px;padding-right:1px;vertical-align:bottom;padding-top:1px;" class="xl68"><font face="Calibri"><font color="#953735"><span><font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font>8,000 </font></font></font></td>
</tr>
</tbody>
</table>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1105&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/01/09/monthly-bandwidth-limits-removed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>Building the new AJAX mail UI part 1: Instant notifications of new emails via eventsource/server-sent events</title>
		<link>http://blog.fastmail.fm/2012/01/09/building-the-new-ajax-mail-ui-part-1-instant-notifications-of-new-emails-via-eventsourceserver-sent-events/</link>
		<comments>http://blog.fastmail.fm/2012/01/09/building-the-new-ajax-mail-ui-part-1-instant-notifications-of-new-emails-via-eventsourceserver-sent-events/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 01:10:01 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1103</guid>
		<description><![CDATA[With the release of the new AJAX user interface into testing on the Fastmail beta server, we decided that it might be interesting to talk about the technology that has gone into making the new interface work. This post is the first of a series of technical posts we plan to do over the next [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1103&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>With the release of the <a href="http://blog.fastmail.fm/2011/12/23/new-webmail-user-interface-being-tested-on-beta-server/">new AJAX user interface into testing on the Fastmail beta server</a>, we decided that it might be interesting to talk about the technology that has gone into making the new interface work. This post is the first of a series of technical posts we plan to do over the next few months, documenting some of the interesting work and technologies we&#8217;ve used to power the new interface. Regular users can skip these posts, but we hope technical users find them interesting.</p>
<p>We&#8217;re starting the series by looking at how we push instant notifications of new email from the server to the web application running in your browser. The communication mechanism we are using is the native <a href="http://dev.w3.org/html5/eventsource/">eventsource/server-sent events</a> object. Our reasons for choosing this were threefold:</p>
<ol>
<li>It has slightly broader browser support than websockets (<a href="http://caniuse.com/eventsource">eventsource</a> vs <a href="http://caniuse.com/websockets">websockets</a>) </li>
<li>We already had a well defined JSON RPC API, using XmlHttpRequest objects to request data from the server, so the only requirement we had was for notifications about new data, which is exactly what eventsource was designed for </li>
<li>For browsers that don&#8217;t support a native eventsource object, we could fallback to emulating it closely enough without too much extra code (more below), so we need only maintain one solution. </li>
</ol>
<p>We&#8217;re using native eventsource support in Opera 11+, Chrome 6+, Safari 5+ and Firefox 6+. For older Firefox versions, the native object is simulated using an XmlHttpRequest object; Firefox allows you to read data as it is streaming. Internet Explorer unfortunately doesn&#8217;t, and whilst there are ways of doing push using script tags in a continually loading iframe, they felt hacky and less robust, so we just went with a <a href="http://en.wikipedia.org/wiki/Push_technology#Long_polling">long polling solution</a> there for now. It uses the same code as the older-Firefox eventsource simulation object, the only difference is that the server has to close the connection after each event is pused; the client then reestablishes a new connection immediately. The effect is the same, it&#8217;s just a little less efficient.</p>
<p>Once you have an eventsource object, be it native or simulated, using it for push notifications in the browser is easy; just point it at the right URL, then wait for events to be fired on the object as data is pushed. In the case of mail, we just send a &#8216;something has changed&#8217; notification. Whenever a new notification arrives, we invalidate the cache and refresh the currently displayed view, fetching the new email.</p>
<p>On the server side, the event push implementation had a few requirements and a few quirks to work with our existing infrastructure.</p>
<p>Because eventsource connections are long lived, we need to use a system that can scale to a potentially very large number of simultaneous open connections. We already use <a href="http://nginx.org/">nginx</a> on our front end servers for http, imap and pop proxying. nginx uses a small process pool with a non-blocking event model and <a href="http://en.wikipedia.org/wiki/Epoll">epoll</a> on Linux, so it can scale to a very large number of simultaneous connections. We regularly see over 30,000 simultaneous http, imap and pop connections to a frontend machine (mostly SSL connections), with less than 1/10th of total CPU being used.</p>
<p>However, with a large number of client connections to nginx, we&#8217;d still have to proxy them to some backend process that could handle the large number of simultaneous connections. Fortunately, there is an alternative event based approach.</p>
<p>After a little bit of searching, we found a <a href="https://github.com/wandenberg/nginx-push-stream-module/">third party push stream module</a> for nginx that was nearly compatible with the W3C eventsource specification. We contacted the author, and thankfully he was willing to make the changes required to make it fully compatible with the eventsource spec and incorporate those changes back into the master version. Thanks <a href="http://br.linkedin.com/pub/wandenberg-peixoto/8/82a/525">Wandenberg Peixoto</a>!</p>
<p>Rather than proxying a connection, the module accepts a connection, holds it open, and connects it to an internal subscriber &quot;channel&quot;. You can then use POST requests to the matching publisher URL channel to send messages to the subscriber, and the messages will be sent to the client over the open connection.</p>
<p>This means you don&#8217;t have to hold lots of internal network proxy connections open and deal with that scaling, instead you just have to send POST requests to nginx when an &quot;event&quot; occurs. This is done via a backend process that listens for events from cyrus (our IMAP server), such as when new emails are delivered to a mailbox, and (longer term) when any change is made to a mailbox.</p>
<p>Two other small issues also need to be dealt with. First is that only logged in users should be able to connect to an eventsource channel, and second is that we have two separate frontend servers and clients connect randomly to one of the other because each hostname resolves to two IP addresses, so the backend needs to send POST requests to the correct frontend nginx server the user is connected to.</p>
<p>We do the first by accepting the client connection, proxying to a backend mod_perl server which does the standard session and cookie authentication, and then use nginx&#8217;s internal <a href="http://wiki.nginx.org/X-accel">X-Accel-Redirect mechanism</a> to do an internal redirect that hooks the connection to the correct subscriber channel. For the second, we add a &quot;X-Frontend&quot; header to each proxied request, so that the mod_perl backend knows which server the client is connected to.</p>
<p>The stripped down version of the nginx configuration looks like this:</p>
<pre><code>    # clients connect to this URL to receive events
    location ^~ /events/ {
      # proxy to backend, it'll do authentication and X-Accel-Redirect
      # to /sub/ if user is authenticated, or return error otherwise
      proxy_set_header   X-Frontend   frontend1;
      proxy_pass         http://backend/events/;
    }
    location ^~ /subchannel/ {
      internal;
      push_stream_subscriber;
      push_stream_eventsource_support on;
      push_stream_content_type &quot;text/event-stream; charset=utf-8&quot;;
    }
    # location we POST to from backend to push events to subscribers
    location ^~ /pubchannel/ {
      push_stream_publisher;
      # prevent anybody but us from publishing
      allow   10.0.0.0/8;
      deny    all;
    }</code></pre>
<p>Putting the whole process together, the steps are as follows:</p>
<ol>
<li>Client connects to https://example.com/events/ </li>
<li>Request is proxied to a mod_perl server </li>
<li>The mod_perl server does the usual session and user authentication </li>
<li>If not successful, an error is returned, otherwise we continue </li>
<li>The mod_perl server generates a channel number based on the user and session key </li>
<li>It then sends a POST to the nginx process (picking the right one based on the X-Frontend header) to create a new channel </li>
<li>It then returns an X-Accel-Redirect response to nginx which tells nginx to internally redirect and connect the client to the subscriber channel </li>
<li>It then contacts an event pusher daemon on the users backend IMAP server to let it know that the user is now waiting for events. It tells the daemon the user, the channel id, and the frontend server. After doing that, the mod_perl request is complete and the process is free to service other requests </li>
<li>On the backend IMAP server, the pusher daemon now waits for events from cyrus, and filters out events for that user </li>
<li>When an event is received, it sends a POST request to the frontend server to push the event over the eventsource connection to the client </li>
<li>One of the things the nginx module returns in response to the PUSH request is a &quot;number of active subscribers&quot; value. This should be 1, but if it drops to 0, we know that the client has dropped its connection, so at that point we don&#8217;t need to monitor or push any more events for that channel, and internally cleanup so we don&#8217;t push any more events for that user and channel. The nginx push stream module automatically does this on the frontend as well. </li>
<li>If a client drops a connection and re-connects (in the same login session), it&#8217;ll get the same channel id. This avoids potentially creating lots of channels </li>
</ol>
<p>In the future, we will be pushing events when any mailbox changes are made, not just a new email delivery (e.g. change made in an IMAP client, a mobile client, or another web login session). We don&#8217;t currently do this because we need to filter out notifications due to actions made by the same client; since it already knows about these, invalidating the cached would be very inefficient.</p>
<p>In general this all works as expected in all supported browsers and is really very easy to use. We have however come across a few issues to do with re-establishing lost connections. For example, when the computer goes to sleep then wakes up, the connection will have probably been lost. Opera has a bug in that it doesn&#8217;t realise this and keeps showing that the connection is OPEN (in readyState 1).</p>
<p>We&#8217;ve also found a potential related issue with the spec itself: &quot;Any other HTTP response code not listed here, and any network error that prevents the HTTP connection from being established in the first place (e.g. DNS errors), must cause the user agent to fail the connection&quot;. This means that if you lose internet connection (for example pass through a tunnel on the train), the eventsource will try to reconnect, find there&#8217;s no network and fail permanently. It will not make any further attempts to connect to the server once a network connection is found again. This same problem can cause a race condition when waking a computer from sleep as it often takes a few seconds to re-establish the internet connection. If the browser tries to re-establish the eventsource connection before the network is up, it will therefore permanently fail.</p>
<p>This spec problem can be worked around by observing the error event. If the readyState property is now CLOSED (in readyState 2), we set a 30 second timeout. When this fires, we create a new eventsource object to replace the old one (you can&#8217;t reuse them) which will then try connecting again; essentially this is manually recreating the reconnect behaviour.</p>
<p>The Opera bug in not detecting it&#8217;s lost a connection after waking from sleep can be fixed by detecting when the computer has been asleep and manually re-establishing the connection, even if it&#8217;s apparently open. To do this, we set a timeout for say 60s, then when it fires we compare the timestamp with when the timeout was set. If the difference is greater than (say) 65s, it&#8217;s probable the computer has been asleep (thus delaying the timeout&#8217;s firing), and so we again create a new eventsource object to replace the old one.</p>
<p>Lastly, it was reasonably straight forward to implement a fully compatible eventsource implementation in Firefox using just a normal XmlHttpRequest object, thereby making this feature work in FF3.5+ (we haven&#8217;t tested further back, but it may work in earlier versions too). The only difference is that the browser can&#8217;t release from memory any of the data received over the eventsource connection until the connection is closed (and they could be really long lived), as you can always access it all through the XHR responseText property. However, we don&#8217;t actually know if the other browsers actually make this optimisation with their native eventsource implementations, and given the data pushed through the eventsource connection is normally quite small, this certainly isn&#8217;t an issue in practice.</p>
<p>This means we support Opera/Firefox/Chrome/Safari with the same server implementation. To add Internet Explorer to the mix we use a long polling approach. To make the server support long polling all we do is make IE set a header on an XmlHttpRequest connection (we use X-Long-Poll: Yes), and if the server sees that header it closes the connection after every event is pushed; other than that it&#8217;s exactly the same. This also means IE can share FF&#8217;s eventsource emulation class with minimal changes.</p>
<p>The instant notification of new emails is one of core features of the new interface that allows the blurring of boundaries between traditional email clients and webmail clients. Making this feature work, and work in a way that we knew was scalable going forward was an important requirement for the new interface. We&#8217;ve achieved this with a straight forward client solution, and in a way that elegantly integrates with our existing backend infrastructure.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1103/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1103&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/01/09/building-the-new-ajax-mail-ui-part-1-instant-notifications-of-new-emails-via-eventsourceserver-sent-events/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>Change of default MX records for domains</title>
		<link>http://blog.fastmail.fm/2012/01/06/change-of-default-mx-records-for-domains/</link>
		<comments>http://blog.fastmail.fm/2012/01/06/change-of-default-mx-records-for-domains/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 02:34:05 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1101</guid>
		<description><![CDATA[This post contains some technical information mostly useful for people that host email for their own domain at FastMail. TL;DR: If you host email for your domain at FastMail, but host the DNS for your domain at an external DNS provider, we recommend you login to your DNS provider and change the two MX records [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1101&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post contains some technical information mostly useful for people that host email for their own domain at FastMail.</p>
<p><a href="http://www.urbandictionary.com/define.php?term=tl%3Bdr">TL;DR</a>: If you host email for your domain at FastMail, but host the DNS for your domain at an external DNS provider, we recommend you login to your DNS provider and change the two MX records for your domain from in[12].smtp.messagingengine.com to in[12]-smtp.messagingengine.com. i.e. replace the first dot (&#8216;.&#8217;) with a dash (&#8216;-&#8217;)</p>
<p>If you host email for your domain at FastMail, and you host the DNS for your domain at FastMail, no change is required, it&#8217;s all automatically been done.</p>
<p>More details: For many years, the default MX records for domains hosted at FastMail have been <strong>in1.smtp.messagingengine.com</strong> and <strong>in2.smtp.messagingengine.com</strong>.</p>
<p>However it turns out there&#8217;s a small problem with this. The hostnames in[12].smtp.messagingengine.com don&#8217;t match the wildcard *.messagingengine.com SSL certificate we have (similar to <a href="http://blog.fastmail.fm/2009/08/26/proxy-server-names-changed/">this previous issue</a>). So if a remote system uses <a href="http://blog.fastmail.fm/2009/04/16/opportunistic-ssltls-encryption-on-incoming-emails/">opportunistic TLS encryption to send email to us</a>, the connection will be encrypted, but it may be reported as &quot;Untrusted&quot; because the certificate doesn&#8217;t match.</p>
<p>This isn&#8217;t disastrous, but it is annoying and exposes a potential man-in-the-middle attack.</p>
<p>So we&#8217;ve gone and changed the DNS MX records for all domains hosted at FastMail to default to <strong>in1-smtp.messagingengine.com</strong> and <strong>in2-smtp.messagingengine.com</strong>.</p>
<p>For users that use us to host DNS for their domains, no change is required on your behalf, all of this has been automatically updated.</p>
<p>For users that use an external DNS provider, we recommend you update the MX records for your domains at your DNS hosting provider. We&#8217;ll continue to support the old in[12].smtp values for some time and alert users if/when we discontinue it, but the sooner you make the change, the better it is for the secure transmission of email to your domain.</p>
<p>We&#8217;ve <a href="http://www.fastmail.fm/help/domain_management_setup.html">updated our documentation</a> to reflect these new values.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1101&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2012/01/06/change-of-default-mx-records-for-domains/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>New webmail user interface being tested on beta server</title>
		<link>http://blog.fastmail.fm/2011/12/23/new-webmail-user-interface-being-tested-on-beta-server/</link>
		<comments>http://blog.fastmail.fm/2011/12/23/new-webmail-user-interface-being-tested-on-beta-server/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 05:33:57 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1099</guid>
		<description><![CDATA[Just in time for Christmas, we&#8217;re releasing our new webmail interface for testing on our beta server. The new interface is the culmination of many months of work from many different team members, and has a number of new and powerful features. Full AJAX design with caching, pre-fetching and optimistic actions Rather than having to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1099&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Just in time for Christmas, we&#8217;re releasing our new webmail interface for testing on our <a href="http://beta.fastmail.fm/">beta server</a>.</p>
<p>The new interface is the culmination of many months of work from many different team members, and has a number of new and powerful features.</p>
<ol>
<li>Full AJAX design with caching, pre-fetching and optimistic actions
<p>Rather than having to reload the entire page on each view or action, only the data that is needed is loaded from the server and displayed on the page. After you&#8217;ve viewed a message, that data is cached while you&#8217;re logged in, so viewing the message again is instant. While viewing a message, next and previous messages are pre-loaded so moving between messages is very quick. When applying an action (e.g. move message, delete message, etc.), the action is immediately applied on the screen and sent to the server making actions appear instant.</p>
<p>Like the previous interface, there&#8217;s many keyboard shortcuts like &#8216;j&#8217; and &#8216;k&#8217; to move to the next/previous message, &#8216;x&#8217; to mark message, &#8216;m&#8217; to move the current/selected message(s), &#8216;g&#8217; to search the folder listing, and &#8216;.&#8217; (dot) to bring up the action menu for the current/selected message(s).</p>
<p>All these features put together make using the new interface one of the fastest mail experiences available.</p>
</li>
<li>Full conversations support across folders
<p>All messages are grouped together into conversations. A conversation represents the back and forth sending of messages on a particular topic. The conversation system we&#8217;ve built works across folders, so when clicking on a conversation to read it, you&#8217;ll see a stream of all related messages in all folders, including any messages filed into other folders, your own sent messages in your Sent Items folder, and any unfinished drafts you might have started in reply to a message in a conversation.</p>
<p>This allows you to quickly see the historical context of any new message without having to dig through your saved messages to see the past messages, or what you sent in your last message.</p>
</li>
<li>Archiving is the new default action
<p>After looking at the statistics of mailboxes on our system, we found that many people didn&#8217;t create any folders in their accounts, and instead just kept everything in their Inbox. This results in a large and cluttered Inbox, and makes it harder to find messages that need dealing with or responding to. Because of the large increase in storage space available to most people relative to the volume of email they get, the old paradigm of deleting email as soon as you&#8217;ve read it is less relevant, and instead it&#8217;s better just to save it in an Archive.</p>
<p>So to make managing your email easier, we&#8217;ve now made Archive the default action. You can think of Archiving an email as &quot;I just don&#8217;t want to see this in my Inbox any more, but I don&#8217;t want to permanently delete it either&quot;. </p>
</li>
<li>Push updates when new email arrives
<p>When new emails arrive in your Inbox, they&#8217;ll be immediately pushed to your browser, no need to refresh to see when new emails have arrived.</p>
</li>
</ol>
<p>We hope you enjoy trying out the new interface and the powerful new features.</p>
<p>A further note: the new interface is a work in progress. Look out for further updates posted to our blog in the new year.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1099/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1099/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1099/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1099&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2011/12/23/new-webmail-user-interface-being-tested-on-beta-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>New Opera/Fastmail office</title>
		<link>http://blog.fastmail.fm/2011/12/19/new-operafastmail-office/</link>
		<comments>http://blog.fastmail.fm/2011/12/19/new-operafastmail-office/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 01:43:23 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/?p=1097</guid>
		<description><![CDATA[After many months of planning and organisation, the Opera mail services team/Fastmail have finally moved in to the new Opera Australia office in Melbourne, Australia. The bold new entrance. The photo doesn&#8217;t do justice to the great textured floor. All the Melbourne staff, from left: Andrew, Neil, Marian, Alfie (front), Rob, Richard (front) and Greg. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1097&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>After many months of planning and organisation, the Opera mail services team/Fastmail have finally moved in to the new <a href="http://www.opera.com/company/contact/">Opera Australia office</a> in <a href="http://maps.google.com.au/maps?q=melbourne,+australia">Melbourne, Australia</a>.</p>
<p><a href="http://fastmailblog.files.wordpress.com/2011/12/entrance_small.jpg"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="entrance_small" border="0" alt="entrance_small" src="http://fastmailblog.files.wordpress.com/2011/12/entrance_small_thumb.jpg?w=404&#038;h=304" width="404" height="304" /></a></p>
<p>The bold new entrance. The photo doesn&#8217;t do justice to the great <a href="http://www.polyflor.com.au/saarfloor-noppe-stud-tile-warm-red.html">textured floor</a>.</p>
<p><a href="http://fastmailblog.files.wordpress.com/2011/12/staff_small.jpg"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="staff_small" border="0" alt="staff_small" src="http://fastmailblog.files.wordpress.com/2011/12/staff_small_thumb.jpg?w=404&#038;h=304" width="404" height="304" /></a></p>
<p>All the Melbourne staff, from left: Andrew, Neil, Marian, Alfie (front), Rob, Richard (front) and Greg.</p>
<p><a href="http://fastmailblog.files.wordpress.com/2011/12/breakout_small.jpg"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="breakout_small" border="0" alt="breakout_small" src="http://fastmailblog.files.wordpress.com/2011/12/breakout_small_thumb.jpg?w=404&#038;h=304" width="404" height="304" /></a></p>
<p>Our nice big break-out room and kitchen area.</p>
<p><a href="http://fastmailblog.files.wordpress.com/2011/12/street_small.jpg"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="street_small" border="0" alt="street_small" src="http://fastmailblog.files.wordpress.com/2011/12/street_small_thumb.jpg?w=404&#038;h=304" width="404" height="304" /></a></p>
<p>All the offices have big windows to let in lots of natural light.</p>
<p>Thanks to Alfie for all his hard work in organising the building, fit out and move to the new office.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1097/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1097/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1097/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1097/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1097/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1097/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1097/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1097/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1097&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2011/12/19/new-operafastmail-office/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>

		<media:content url="http://fastmailblog.files.wordpress.com/2011/12/entrance_small_thumb.jpg" medium="image">
			<media:title type="html">entrance_small</media:title>
		</media:content>

		<media:content url="http://fastmailblog.files.wordpress.com/2011/12/staff_small_thumb.jpg" medium="image">
			<media:title type="html">staff_small</media:title>
		</media:content>

		<media:content url="http://fastmailblog.files.wordpress.com/2011/12/breakout_small_thumb.jpg" medium="image">
			<media:title type="html">breakout_small</media:title>
		</media:content>

		<media:content url="http://fastmailblog.files.wordpress.com/2011/12/street_small_thumb.jpg" medium="image">
			<media:title type="html">street_small</media:title>
		</media:content>
	</item>
		<item>
		<title>iOS 5 and mail application access patterns</title>
		<link>http://blog.fastmail.fm/2011/11/10/ios-5-and-mail-application-access-patterns/</link>
		<comments>http://blog.fastmail.fm/2011/11/10/ios-5-and-mail-application-access-patterns/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 04:37:00 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/2011/11/10/ios-5-and-mail-application-access-patterns/</guid>
		<description><![CDATA[This post contains some observations about how the mail application in iOS 5 appears to interact with IMAP servers. We&#8217;re posting this mostly as a reference for people interested. In iOS settings, you can choose a &#34;fetch interval&#34;, which is: Manually (never fetches automatically) Every 15 minutes Every 30 minutes Every hour Push (only shown [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1088&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post contains some observations about how the mail application in iOS 5 appears to interact with IMAP servers. We&#8217;re posting this mostly as a reference for people interested.</p>
<p>In iOS settings, you can choose a &quot;fetch interval&quot;, which is: </p>
<ul>
<li>Manually (never fetches automatically)</li>
<li>Every 15 minutes </li>
<li>Every 30 minutes </li>
<li>Every hour </li>
<li>Push (only shown on servers supporting it, which I believe is currently only Exchange servers or Yahoo Mail)</li>
</ul>
<p>If you choose &quot;Manually&quot;, then there is no persistent connection once you exit the mail app. </p>
<p>If you choose any other interval, then a background daemon holds a persistent connection to the mail server. We don&#8217;t know exactly why they hold the connection open, and we&#8217;re not sure if it leaves the connection in IDLE state to get updates pushed to it. The main advantage of holding it open is probably skipping the overhead of re-authenticating/handshaking, but there&#8217;s also no good reason to explicitly close the connection after every fetch given that IMAP is supposed to be long-lived.</p>
<p>If you have these fetch intervals set, and then break your network connection, then iOS will attempt to reconnect the next time it wants to fetch your mail again.</p>
<p>Note that the intervals listed appear to be only approximate. iOS appears to be smart about batching requests together, so it gets as much work done as it can while the phone is awake or the network connection is &quot;up&quot;. Also, opening the mail app, or opening a folder in the mail app, will often trigger a refresh too.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1088/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1088/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1088/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1088/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1088/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1088/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1088/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1088/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1088&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2011/11/10/ios-5-and-mail-application-access-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>"View" link removed from attachments on message read screen in "Public Terminal" mode</title>
		<link>http://blog.fastmail.fm/2011/10/28/view-link-removed-from-attachments-on-message-read-screen-in-public-terminal-mode/</link>
		<comments>http://blog.fastmail.fm/2011/10/28/view-link-removed-from-attachments-on-message-read-screen-in-public-terminal-mode/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 02:54:53 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/2011/10/28/view-link-removed-from-attachments-on-message-read-screen-in-public-terminal-mode/</guid>
		<description><![CDATA[When you enable the &#34;Public Terminal&#34; option on the login screen, Fastmail sets the &#34;no-cache&#34; and &#34;no-store&#34; cache control headers on every page. This means that browsers should not store a copy of the pages you visit (e.g. emails you read) to their local disk. Even after you logout of your session and leave the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1087&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When you enable the &quot;Public Terminal&quot; option on the login screen, Fastmail sets the <a href="http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/">&quot;no-cache&quot; and &quot;no-store&quot; cache control headers</a> on every page. This means that browsers should not store a copy of the pages you visit (e.g. emails you read) to their local disk. Even after you logout of your session and leave the computer, someone comes along and tries to view a page in the browser history, it should re-check with the server first, which of course will return &quot;this user is now logged out, show the login page instead&quot;.</p>
<p>However this is a problem with this whole setup related to attachments. When an email has an attachment, the content of the attachment might be in a form the browser doesn&#8217;t understand (e.g. Microsoft Word document). In that case, the browser has to save a copy of the attachment to the local disk, and then launch Microsoft Word to open the file.</p>
<p>Now in the case of the &quot;View&quot; link, the saving to disk would be done automatically into a temporary file storage area. However in IE, if you try and download an SSL document with the no-cache or no-store attributes set, IE will explicitly not save the file to disk, and then when it tries to launch Microsoft Word to read the file, you&#8217;ll get a &quot;file does not exist&quot; error or the like.</p>
<p><a href="http://support.microsoft.com/kb/812935">http://support.microsoft.com/kb/812935</a>    <br /><a href="http://support.microsoft.com/kb/815313">http://support.microsoft.com/kb/815313</a></p>
<p>For other browsers, it appears they work around this problem by actually saving a copy to disk in the temporary storage area, but they delete the file when you close the browser (at least that&#8217;s what Firefox did when I tested). That still potentially does leave the file on disk for some time.</p>
<p>To ensure the best privacy possible, while still allowing people to view attached documents in &quot;Public Terminal&quot; mode, we&#8217;ve decided to do the following:</p>
<ul>
<li>When you login with the &quot;Public terminal&quot; mode, we&#8217;ve removed the &quot;View&quot; link next to attachments. This solves two problems; the unexpected &quot;file not found&quot; in IE, and the privacy concern of storing attachments to disk in the temporary file area of other browsers</li>
<li>We&#8217;ve left the &quot;View&quot; link next to image attachments, because the web browser can display images itself, without launching a separate program, so it can obey the &quot;no-cache&quot;/&quot;no-store&quot; directives</li>
<li>With the &quot;Download&quot; link (which automatically brings up a &quot;Save as…&quot; dialog box), we&#8217;ve removed the &quot;no-cache&quot; and &quot;no-store&quot; settings, which means that IE will let you download it and save it somewhere so you can open it to view the document.</li>
</ul>
<p>We like this solution because it makes things clearer to the user. In &quot;Public Terminal&quot; mode, if you want to view an attachment, you have to download it first, explicitly save it somewhere and then view it. The alternative approach of letting the browser do it either fails (IE), or causes an auto-save of the file to a temporary area which leaves it temporarily cached on the machine when the user doesn&#8217;t expect it.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1087/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1087/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1087/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1087/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1087/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1087/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1087/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1087/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1087&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2011/10/28/view-link-removed-from-attachments-on-message-read-screen-in-public-terminal-mode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>TCP keepalive, iOS 5 and NAT routers</title>
		<link>http://blog.fastmail.fm/2011/10/27/tcp-keepalive-ios-5-and-nat-routers/</link>
		<comments>http://blog.fastmail.fm/2011/10/27/tcp-keepalive-ios-5-and-nat-routers/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 03:48:34 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/2011/10/27/tcp-keepalive-ios-5-and-nat-routers/</guid>
		<description><![CDATA[This post contains some very technical information. For users just interested in the summary: If over the next week you experience an increase in frozen, non-responding or broken IMAP connections, please contact our support team (use the &#34;Support&#34; link at the top of the http://www.fastmail.fm homepage) with details. Please make sure you include your operating [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1086&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post contains some very technical information. For users just interested in the summary:</p>
<p><strong>If over the next week you experience an increase in frozen, non-responding or broken IMAP connections, please contact our support team (use the &quot;Support&quot; link at the top of the </strong><a href="http://www.fastmail.fm"><strong>http://www.fastmail.fm</strong></a><strong> homepage) with details. Please make sure you include your operating system, email software, how you connect to the internet, and what modem/router/network connection you use in your report.</strong></p>
<p>The long story: The IMAP protocol is designed as a long lived connection protocol. That is, your email client connects from your computer to the server, and stays connected for as long as possible.</p>
<p>In many cases, the connection remains open, but completely idle for extended periods of time while your email client is running but you are doing other things.</p>
<p>In general while a connection is idle, no data at all is sent between the server and the client, but they both know the connection still exists, so as soon as data is available on one side, it can send it to the other just fine.</p>
<p>There is a problem in some cases though. If you have a home modem and wireless network, then you are usually using a system called <a href="http://en.wikipedia.org/wiki/Network_address_translation">NAT</a> that allows multiple devices on your wireless network to connect to the internet through one connection. For NAT to work, your modem/router must keep a mapping for every connection from any device inside your network to any server on the internet.</p>
<p>The problem is some modems/routers have very poor NAT implementations that &quot;forget&quot; the NAT mapping for any connection that&#8217;s been idle for 5 minutes or more (some appear to be 10 minutes or more). What this means is that if an IMAP connection remains idle with no communication for 5 minutes, then the connection is broken.</p>
<p>In itself this wouldn&#8217;t be so bad, but the way the connection is broken is that rather than telling the client &quot;this connection has been closed&quot;, packets from the client or server just disappear which causes some nasty user visible behaviour.</p>
<p>The effect is that if you leave your email client idle for 5 minutes and the NAT connection is lost, if you then try and do something with the client (e.g. read or move an email), the client tries to send the appropriate command to the server. But the TCP packets that contain the command never arrive at the server, but neither are RST packets sent back that would tell the client that there&#8217;s any problem with the connection, the packets just disappear. So the local computer tries to send again after a timeout period, and again a few more times, until usually about 30 seconds later, it finally gives up and marks the connection as dead, and finally sends that information back up to the email client, which shows some &quot;connection was dropped by the server&quot; type message.</p>
<p>From a user perspective, it&#8217;s a really annoying failure mode that looks like a problem with our server, even though it&#8217;s really because of a poor implementation of NAT in their modem.</p>
<p>However this is a workaround for this. At the TCP connection level, there&#8217;s a feature called <a href="http://en.wikipedia.org/wiki/Keepalive#TCP_keepalive">keepalive</a> that allows the operating system to send regular &quot;is this connection still open?&quot; type packets back and forth between the server and the client. By default keepalive isn&#8217;t turned on for connections, but it is possible to turn it on via a socket option. nginx, our frontend IMAP proxy, allows you to turn this on via a <a href="http://wiki.nginx.org/MailCoreModule#so_keepalive">so_keepalive configuration option</a>.</p>
<p>However even after you&#8217;ve enabled this option, the default time between keepalive &quot;ping&quot; packets is 2 hours. Fortunately again, there&#8217;s a Linux kernel tuneable <a href="http://www.linuxinsight.com/proc_sys_net_ipv4_tcp_keepalive_time.html">net.ipv4.tcp_keepalive_time</a> that lets you control this value.</p>
<p>By lowering this value to 4 minutes, it causes TCP keepalive packets to be sent over open but idle IMAP connections from the server to the client every 4 minutes. The packets themselves don&#8217;t contain any data, but what they do do is cause any existing NAT connection to be marked as &quot;alive&quot; on the users modem/router. So poor routers with NAT connections that would normally timeout after 5 minutes of inactivity are kept alive, so the user doesn&#8217;t see the nasty broken connection problem described above, and neither is there a visible downside to the user either.</p>
<p>So this is how things have been for the last 4-5 years, which has worked great.</p>
<p>Unfortunately, there&#8217;s a new and recent problem that has now appeared.</p>
<p>iOS 5 now uses long lived persistent IMAP connections (apparently previous versions only used short lived connections). The problem is that our ping packets every 4 minutes mean that the device (iPhone/iPad/iPod) is &quot;woken up&quot; every 4 minutes as well. This means the device never goes into a deeper sleep mode, which causes significantly more battery drain when you setup a connection to the Fastmail IMAP server on iOS 5 devices.</p>
<p>Given the rapid increase in use of mobile devices like iPhones, and the big difference in battery life it can apparently cause, this is a significant issue.</p>
<p>So we&#8217;ve decided to re-visit the need for enabling so_keepalive in the first place. Given the original reason was due to poor NAT routers with short NAT table timeouts, that was definitely an observed problem a few years back, but we&#8217;re not sure how much of a problem it is now. It&#8217;s possible that the vast majority of modems/routers available in the last few years have much better NAT implementations. Unfortunately there&#8217;s no way to easily test this, short of actually disabling keepalive, and waiting for users to report issues.</p>
<p>So we&#8217;ve done that now on mail.messagingengine.com, and we&#8217;ll see over the next week what sort of reports we get. Depending on the number, there&#8217;s a few options we have:</p>
<ol>
<li>If there&#8217;s lots of problem reports, we&#8217;d re-enable keepalive by default, but setup an alternate server name like mail-mobile.messagingengine.com that has keepalive disabled, and tell mobile users to use that server name instead. The problem with this is many devices now have auto configuration systems enabled, so users don&#8217;t even have to enter a server name, so we&#8217;d have to work out how to get that auto configuration to use a different server name</li>
<li>If there&#8217;s not many problem reports, we&#8217;d leave keepalive off by default, but setup an alternative server name like mail-keepalive.messagingengine.com that has keepalive enabled, and for users that report connection &quot;freezing&quot; problems, we&#8217;d tell them to switch to using that server name instead</li>
<li>Ideally, we&#8217;d detect what sort of client was connecting, and turn on/off keepalive as needed. This might be possible using software like <a href="http://en.wikipedia.org/wiki/P0f">p0f</a>, but integrating that with nginx would require a bit of work, and still leaves you with the problem of an iPhone user that is usually in their office/home all day and uses a wireless network with a poor NAT router, would they prefer the longer battery life, or better connectivity experience.</li>
</ol>
<p>I&#8217;ll update this post in a week or two when we have some more data.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1086/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1086/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1086/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1086/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1086/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1086/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1086/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1086/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1086&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2011/10/27/tcp-keepalive-ios-5-and-nat-routers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
		<item>
		<title>DKIM signing outgoing email with From address domain</title>
		<link>http://blog.fastmail.fm/2011/10/12/dkim-signing-outgoing-email-with-from-address-domain/</link>
		<comments>http://blog.fastmail.fm/2011/10/12/dkim-signing-outgoing-email-with-from-address-domain/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 06:02:29 +0000</pubDate>
		<dc:creator>Rob Mueller</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">https://fastmailblog.wordpress.com/2011/10/12/dkim-signing-outgoing-email-with-from-address-domain/</guid>
		<description><![CDATA[DKIM is an email authentication standard that allows senders of email to sign an email with a particular domain, and for receivers of the email to confirm that the email was signed by that domain and hasn&#8217;t been altered. There&#8217;s some more information about how DKIM is useful in this previous blog post. We&#8217;ve been [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1083&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/DomainKeys_Identified_Mail">DKIM</a> is an email authentication standard that allows senders of email to sign an email with a particular domain, and for receivers of the email to confirm that the email was signed by that domain and hasn&#8217;t been altered. There&#8217;s some more information about how DKIM is useful in <a href="http://blog.fastmail.fm/2010/01/06/truedomain-anti-phishing-and-email-authentication/">this previous blog post</a>. We&#8217;ve been DKIM signing <a href="http://blog.fastmail.fm/2009/08/13/all-outbound-email-now-being-dkim-signed/">all email sent via FastMail for the last 2 years</a>.</p>
<p>In the original design of the DKIM, the domain that signed the email had no particular relationship to the domain in the From address of the email. This was particularly useful for large email providers like us. We have 10,000&#8242;s of domains, but would sign all email with just our &quot;generic&quot; messagingengine.com domain.</p>
<p>However this state of affairs is beginning to change. Standards like <a href="http://en.wikipedia.org/wiki/Author_Domain_Signing_Practices">Author Domain Signing Practices</a> explicitly link the domain of the email address in the From header of the email to the DKIM signing domain. Also recently Gmail has changed their web interface so that email sent <a href="http://mail.google.com/support/bin/answer.py?answer=1311182">with a From domain that&#8217;s different to the DKIM signing domain</a> may be shown with an extra &quot;via messagingengine.com&quot; notice next to the sender name.</p>
<p>So we&#8217;ve now rolled out new code that changes how all emails sent through FastMail are DKIM signed. We always DKIM sign with messagingengine.com (as we always have), but we also now sign with a separate key for the domain used in the From address header where possible (see below for more details).</p>
<p>For most users, there should be no noticeable difference. For users that use virtual domains at FastMail, or have their own domain in a family/business, then when you send via FastMail, Gmail should no longer show &quot;via messagingengine.com&quot; on the received message (if your DNS is correctly setup, see below for more details).</p>
<p>For users that host their DNS with FastMail (eg. nameservers for your domain are ns1.messagingengine.com and ns2.messagingengine.com), this will &quot;just work&quot;. We&#8217;ve generated DKIM public/private keys for all domains in our database, and automatically do so when new domains are added. We also publish the public keys for all domains via ns1.messagingengine.com/ns2.messagingengine.com.</p>
<p>In general if you can, we highly recommend hosting your DNS with us. For most cases the default settings we provide &quot;just work&quot;, and if you need to customise your DNS, our control panel allows you to add any records of any type, without the arbitrary limitations many other DNS providers have.</p>
<p>However for users that host DNS for their domains externally and want to continue to do so, you&#8217;ll have to explicitly add the DKIM public key using your domain hosters DNS management interface. Unfortunately there&#8217;s 100&#8242;s of different DNS providers out there, so we can&#8217;t give specific directions for each one.</p>
<p>The general steps are:</p>
<ol>
<li>Login to your FastMail account and go to Options –&gt; Virtual Domains (or Manage –&gt; Domains for a family/business account). </li>
<li>Scroll to the bottom, and you&#8217;ll see a new &quot;DKIM signing keys&quot; section. For each domain you have, you&#8217;ll see a DKIM public key.</li>
<li>Login to your DNS provider, and create a new TXT record for each domain listed and use the value in the &quot;Public Key&quot; column as the TXT record data to publish.</li>
</ol>
<p><strong>Important</strong>: Note that you have to add the TXT record for the domain name shown in the DKIM signing keys section, which will be <em>mesmtp._domainkey.yourdomain.com</em>, do <strong>not</strong> add it for the base domain name <em>yourdomain.com</em>, that won&#8217;t work.</p>
<p>That should be it.</p>
<p>Note that initially each domain is marked as DKIM disabled (Enabled column = [ ]). While a domain is DKIM disabled, we won&#8217;t sign any sent emails. This is to avoid DKIM signing failures when the receiving side tries to lookup the public signature and fails to find it. We regularly check each domain to see if the correct public key TXT record is being published. If it is, we mark the domain in our database as &quot;DKIM enabled&quot; (Enabled column = [*]), and then begin signing sent emails.</p>
<p>So after you setup the records at your DNS provider, you should wait a few hours, then check this table again to see that the domain is now correctly DKIM enabled.</p>
<p>Some other technical notes:</p>
<p>There&#8217;s currently no way to change the public/private key used to sign emails or upload new ones. We always generate our own key pair for each domain and use the DKIM selector &quot;mesmtp&quot; to sign emails. This shouldn&#8217;t be a problem. If you&#8217;re transitioning from another provider to FastMail, you can use our custom DNS to publish the DKIM record of the previous provider with it&#8217;s selector as well as our own during the transition. Vice-versa for transitioning away from FastMail. The only other reason to change the selector would be if the private key was compromised, which should never happen as it&#8217;s stored securely in FastMail&#8217;s systems.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fastmailblog.wordpress.com/1083/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fastmailblog.wordpress.com/1083/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fastmailblog.wordpress.com/1083/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fastmailblog.wordpress.com/1083/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fastmailblog.wordpress.com/1083/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fastmailblog.wordpress.com/1083/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fastmailblog.wordpress.com/1083/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fastmailblog.wordpress.com/1083/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fastmail.fm&amp;blog=1210258&amp;post=1083&amp;subd=fastmailblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fastmail.fm/2011/10/12/dkim-signing-outgoing-email-with-from-address-domain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/04c1074e27cb01a497180afaf1a58a42?s=96&amp;d=identicon&amp;r=G" medium="image">
			<media:title type="html">robm</media:title>
		</media:content>
	</item>
	</channel>
</rss>

