The situation
SpamJammer had two beginnings: a business I walked away from, and an inbox I could no longer use.
Back then, people talked in newsgroups: public discussion forums run by universities and other organizations, read in programs like Netscape Communicator. Every post showed its author’s email address, and every newsgroup had a topic. I realized I knew what each group was about and how to reach the people in it, so I wrote software to collect those addresses and built a business on them, 321 Email, which created targeted email lists. There were no laws against bulk email yet, and hardly anyone called it spam. Within the first four hours, $1,000 in credit-card orders had come in. That was addictive.
The engineering was the fun part. In a room at home I ran about twenty cloned computers, each set up to boot two ways under Windows 95. In one configuration a machine used my ISDN lines to pull its next job from the database; then it rebooted into the other, changed its own dial plan, and called out over an ordinary phone line through a fresh internet provider. When a job finished, it rebooted and fetched the next one. I could feed it new account details from a web form and run the whole thing remotely. It was crude, and it was a kid’s project, but it was a semi-autonomous system I could steer from anywhere. Getting past each barrier was the challenge that kept me at it.
Internet providers didn’t share my enthusiasm. They shut my accounts down, I opened new ones, and I kept building systems to get around being shut down. I was a dumb kid. None of it was illegal, and it was fascinating how quickly the money came. But that constant need to evade felt deceitful, and in the end it felt dirty. I didn’t want that feeling anymore, so I shut 321 Email down and put my effort into fighting unsolicited email instead of sending it. That decision pointed me at the problem SpamJammer would solve.
The other beginning was my own inbox. I used Bigfoot.com, a service that gave you one email address for life and forwarded your mail wherever it needed to go. People were switching internet providers constantly, and rather than hand friends and family a new address every time, you gave them your Bigfoot address. An address that never changes also collects years of junk mail. Nothing at the time checked whether a sender was a real person, so I built a tool that did: the first version was a Visual Basic 6 program that handled the confirmations for me. Once I showed it to a few people, it took on a life of its own.
Why it was hard
Stopping spam sounds like a filtering problem. In practice, it touched almost every part of how email moves.
- Email is asynchronous. A held message has to wait while its sender is contacted, and the system has to match a confirmation that arrives later to the message it belongs to, while still receiving, scanning, retrying, and delivering everything else.
- The first tools gave little help. The original service ran on classic Active Server Pages, with all of its processing on the server. Parameterized queries existed only in a limited form and weren’t foolproof, and there were no ORMs or data layers to lean on. So I built my own layer that examined, stripped and cleansed every incoming string to protect against SQL injection.
- Larger companies wouldn’t touch Microsoft. The companies with the most to gain ran their mail on Linux and Unix systems and wanted nothing built on Microsoft tools, .NET or Java.
- One person can’t run everyone’s mail. As a hosted service, every customer depended on me personally keeping it running.
- Corporate mail had to keep flowing. Anything placed in front of a company’s mail servers had to fit alongside them, be simple to adopt, and keep working as volume grew.
The approach and the decisions behind it
The idea at the center of SpamJammer was simple: before judging a message, ask its sender to prove they were a real person. Everything else followed from making that work at scale.
- Verify the sender, not just the message.
- SpamJammer used URL confirmation to check that mail came from a real, legitimate sender before it was delivered. What it confirmed was the pair: this sender writing to this recipient. I had never seen URL confirmation used this way before, and with the appliances it was the novel part of SpamJammer.
- Hold mail instead of delivering it.
- Incoming mail from an unknown sender was queued rather than delivered immediately, so nothing reached the recipient until its sender had confirmed.
- Make every confirmation unique.
- Each confirmation carried its own globally unique identifier, a GUID, so every link pointed to exactly one confirmation.
- Rewrite for the enterprise’s platforms.
- SpamJammer had already been ported more than once. To win over the bigger customers, I ported it again, to a mix of ANSI C and C++ on Linux, which let it sit comfortably beside corporate email servers.
- Own the mail transfer agent.
- Rather than bolt confirmation onto someone else’s mail server, I built the system around a custom, high-performance mail transfer agent that handled receiving, queuing, scanning, retrying, and delivery, and kept track of the state of every message.
- Ship it as an appliance.
- The idea came from GNAT Box, an all-in-one firewall you simply bought and plugged in. It was the first appliance of any kind I had seen; everyone else built their firewalls on a Unix box. SpamJammer became a server with its software already configured and the machine locked down, so a company racked it instead of administering it and ran everything from a web interface.
- Let the appliances organize themselves.
- A new unit broadcast to find the units already running, exchanged its role and a pairing key with them, and joined the environment. Its screen showed a countdown explaining how it was about to join; if nobody stepped in within 60 seconds, it accepted those settings. Zero configuration was the whole goal: growing capacity meant powering on a box, not reconfiguring a system.
How it works
Before the appliances, SpamJammer ran as a hosted service at SpamJammer.com. From the sender’s point of view, the first message to a SpamJammer user came back with a request: click this link to confirm you sent it.
- Mail arrives at the relay. A message from a sender the recipient hasn’t confirmed reaches SpamJammer instead of going straight to the inbox.
- The message is held. SpamJammer places it in a queue rather than delivering it.
- The sender is asked to confirm. SpamJammer sends the sender a confirmation link built on a unique identifier.
- Confirmed mail is delivered. When the sender clicks the link, the held message completes its delivery. Only confirmed senders get through.
- The pair is remembered. Once a person has confirmed a sender and recipient combination, later mail between them goes straight through. Users could still block a domain, an address, a subject or words in the body; confirmation was the first line of defense, removing the vast majority of unwanted mail.
From a service to an appliance
The hosted service proved the idea, but I was the one running all of it, and that was becoming painful. The bigger opportunity was in the enterprise, and enterprises needed something they could put in a rack and trust. I found a Midwest manufacturer that would brand rack-mounted servers, and we produced customized 1U and 2U units, each with a distinctive yellow bezel carrying the SpamJammer logo and its software already in place.
At the heart of every unit was the custom mail transfer agent, built to receive, queue, scan, retry, and deliver millions of messages while correlating each confirmation with the mail it released.
The appliances were modular. An edge device took mail in and handled initial filtering and storage, a processing server did the spam filtering and scanning, and a mail server gave users web access and gave administrators user management. When a company added another SpamJammer box, it detected the units already running, performed a handshake, and negotiated its role in the environment on its own. The result was a system that was scalable and fault-tolerant, run from a control panel designed for people who were not email specialists.
Outcomes
- A personal tool became an enterprise product. SpamJammer grew from a program for my own inbox, to a hosted service at SpamJammer.com, to plug-and-play rack appliances for corporate mail.
- It scaled by adding hardware. New appliances joined the cluster and took on a role without manual reconfiguration.
- Non-technical administrators could run it, through a control panel built for people who did not manage mail servers for a living.
- It was acquired without a pitch. The offer came informally, over lunch, from someone with the authority to make it who already knew about SpamJammer. A major antivirus company bought it, and it became the core engine for its anti-spam offerings.
My role
I founded SpamJammer and was its only developer. I wrote the first version as a Visual Basic 6 tool, turned it into a web service in Active Server Pages, then rewrote it in ANSI C and C++ around the custom mail transfer agent and moved it to Linux for the enterprise market. I worked with the manufacturer to turn the software into locked-down rack appliances, and took the product from my own inbox to the enterprise systems that a major antivirus company acquired. I built it on the side, outside my day job, and I wasn’t chasing a sale; it was right place, right time.