Thursday, December 17, 2009

The Rendering/Inbox Preview tool is back in action

Our rendering/inbox preview tool is back in action, after a hiatus for the last month where the only client that rendered properly was GMail.

Now, four of the clients will consistently display (Gmail, Outlook, Thunderbird, and Windows Mail), and we're working on bringing AOL, Hotmail, and Yahoo! Mail back to life.

The reason this tool is so difficult to maintain and service is because a) We coded this feature from scratch, and Inbox Rendering is an extremely difficult process from a software development perspective, and b) Webmail clients are constantly changing, and when a change is made to its login process or its interface, we have to re-code our app to render that client all over again.

Friday, December 11, 2009

SMTP service now supports large attachments

The JangoMail SMTP relay service now supports sending large file attachments in email. Before, there was a limit of approximately 2 MB in total file attachments. Now, there is NO theoretical limit, so the SMTP service can handle file attachments as large as 10 or 20 MB. Of course, email may not be the best medium to transmit such large files, but it is possible with our system.

JangoSMTP: The Stand-Alone SMTP Service with open tracking, click tracking, DKIM signing, and more.

JangoMail: The SMTP Service combined with email broadcast service.

Saturday, December 05, 2009

Review of Megabus WiFi Internet access

Running a fast-paced high tech company like JangoMail, I need to be as productive as possible. I am usually either in Chicago (where I live) or in Dayton, Ohio (where I grew up, and where JangoMail is headquartered). Normally I drive between the two cities, because non-stop flights between Chicago and Dayton are upwards of $1,000. Recently, I was told of a bus service called Megabus, which operates a bus route between Cincinnati and Chicago with WiFi Internet access, so tonight, I gave it a shot. With the WiFi, I figured taking the bus I figured would allow me to work for six hours rater than drive for six hours.

What I wanted to know

Prior to buying my ticket, I wanted to know the following about the Megabus WiFi access:

1. How fast was it? Would it be like dialup, or a T1?

2. Were there any connectivity restrictions? Could I remote into a JangoMail server and deploy a new feature? Could I use GoToMyPC to access my main workstation in Chicago?

3. Were there power outlets available? My laptop battery only lasts four hours, and my trip was six.

Googling got me nowhere, as nobody has documented in detail experiences with Megabus's WiFi, so hence the purpose of this article.

To all tech executives, sysadmins, and those that like to make their web app better while travelling between cities, this article's for you.

Network Settings

The above screenshot shows my network settings after connecting to the wireless network with SSID MEGABUS - 64184. Note that I manually put in the DNS server of in an attempt to get around the network's web site blocking, however my attempt was futile.

The Speed

The speed various greatly depending on whether the bus is moving or stationary. While stationary, I got reasonable high-speed access. I ran this speed test which shows that I was getting near T1 speeds on the download.

Above speed was while bus was stationary at Indianapolis stop.

Above speed test was while bus was in route, half-way between Indianapolis and Chicago.

The speed between Cincinnati and Indianapolis was the slowest of all, but unfortunately I did not capture a speed test screenshot during that portion of the trip.

Port Blocking

All connectivity, except to ports 80 and 443, and DNS lookups, are blocked:
  1. I could not ping any of our servers.
  2. I could not FTP to our server.
  3. I could not connect on port 25 to any mail servers.
  4. I could not Remote Desktop into any servers.
  5. I could not use GoToMyPC to connect to my workstation.
Web Site Blocking

Additionally, the WiFi service uses OpenDNS to block many web sites. While I was able to read and respond to email via GMail, and browse Facebook, the following sites were blocked:
  1. MySpace
  2. Google Docs (at, which was odd, because most other Google services were available
  3. Nerve

Because it was an OpenDNS based block, I suspected that switching to Google's new public DNS server ( might be a workaround to the blocking. I manually set my Windows TCP/IP settings to use as its DNS server rather than the one dynamically assigned by DHCP, but to no avail. The sites were still blocked, redirecting me to an OpenDNS message.

The WiFi service is provided by a company called Saucon, and it is free.

Power Outlets on Megabus

There were no power outlets on my bus from Cincinnati to Chicago, but I've read (insert link) that some buses do have outlets.


For the official Megabus Saucon WiFi Terms of Use, that you must agree to right when you connect, is here:

Wikipedia entry on Megabus -

Megabus Home page -, which oddly enough when I just visited, gave me:

Shocking that the site goes offline EVERY DAY for 3 hours. In our world of real-time, mission-critical everything, I'm surprised that they would sacrifice 12.5% of the time they could be selling tickets. JangoMail, which I'd imagine is a far more complex app than Megabus's web site, has maintenance running on the back-end almost constantly, and we rarely go offline.

Tuesday, November 24, 2009

Test Out Our New Survey Tool

We just launched the first ever Silverlight-based Survey Design Tool. You can now design and publish email survey invites through the JangoMail interface and view your survey results for each individual participant.

Set Up Instructions

1. Click on the new Surveys tab. If you don't have Microsoft's Silverlight Platform installed, you will be prompted to install it at this time. Survey recipients see the survey on a regular webpage and will not need to download Silverlight.

2. Click the Create a New Survey button to get started. Then choose the Blank survey option.
3. To create a new question, click in the box under Create a new item.

Edit the question and answer points by deleting the text that is currently there and typing in your own.
To use a pre-defined set of answers, click the down arrow next to your answer set.
To add space for short text answers and comment sections, click on the down arrow in the box under Create a new item. Then click on the type of answer you would like.

4. When you are done creating your survey, click the Save button.
5. To make the survey available for people to respond, you must publish it. Click on the Publish tab and then click Publish Survey. Here you will get a link that you can send to people to fill out your survey.
6. Set your survey to end by navigating to the Close tab and entering in when the survey should close. You can choose to end it immediately, on a certain date, or after a given number of responses.

Send the Survey
1. When you publish your survey you will be provided with a link. Copy that link.
2. Create an email message in the Messages section as you normally would. Paste in the link that you copied where appropriate. After testing your email and your link, send the email out to your survey list.

View Results
View Recipient-Level Results by clicking on My Surveys in the Surveys section. Click on the Results button next to the survey that you would like to view results for.

We will soon add results in our Reporting and Analytics section as well.

Monday, November 23, 2009

Test our new no-frames interface

Our new no-frames user interface is ready to be tested. To switch to the no-frames interface, login to your account and click the "Switch to No-Frames" link. You can always switch back to the old frames interface if you want to later.

Below is the first screen of the new interface:

Along with the absence of frames, there are three key navigational differences:
  1. The "Account Info" section is no longer a main tab. It is a link in the top area.
  2. The "Help" section is no longer a main tab. It is a link in the top area.
  3. There is a new tab called "Surveys". You can now design and publish and email survey invites to your email lists. The Surveys feature is also in beta. The survey builder runs on Microsoft's Silverlight platform, so if you don't have Silverlight installed, the first time you click on the "Surveys" tab you'll be asked to install Silverlight.
The new no-frames interface will now be the basis for a whole host of user interface improvements, including improved text styling, contextual help, more videos, easier navigation, and clearer organization. Stay tuned for these improvements and future blog posts on how to use Surveys.

Error handling for the SMTP Relay Service


We've launched a new error handling system for the SMTP relay system. There are a number of reasons why a message sent through the SMTP relay may result in an error. For example:

1. If the recipient address is on your account's bounce list, then a "bounce" error will be thrown.
2. If the recipient address is on your account's unsubscribe list, then an "unsubscribe" error will be thrown.
3. If your account is over its sending limits, a "Over Account Limit" error will be thrown.
4. If a badly formed email message is passed through the relay, a "parsing" error will be thrown.

These errors are only detected after a message is received by the SMTP relay, so the error will NOT appear during the SMTP conversation with

When an error is detected, the error notification can be emailed to the Account Manager and/or the From Address on the email that resulted in the error. Additionally, the error is available for viewing under Reporting in the Transactional Emails section.

To set your error handling preferences, go to Settings --> SMTP Relay and set the two relevant checkboxes appropriately.


1. If you know that you regularly attempt to relay emails to addresses on your Unsubscribe and Bounce lists, you may wish to turn off the email notifications for errors entirely, as this could result in a large volume of emails to you.

2. To decide whether or not the error should also be sent to the From Address, consider what type of transactional emails you're sending through the SMTP relay. If the From Address is an address at your organization, then it's probably okay for the From Address to also receive errors. But, if you're sending social networking "You have a new message from John" type emails, where the From Address is that of one of your users, you probably don't want your users to receive error notifications from JangoMail. In this case, uncheck the box to send errors to the From Address.

Thursday, November 19, 2009

Eight Steps to Optimize Email Deliverability Using JangoMail

Email deliverability is a key concern for most email marketers, and at JangoMail, we think we do a pretty good job of ensuring the highest possible inbox placement of our clients' emails. JangoMail is a highly customizable platform, from sending speeds, to email headers, to SMTP protocol level customizations. Taking advantage of certain settings and features can help ensure high email deliverability.

Some of these steps involve separating yourself from other JangoMail clients. It's not that JangoMail accepts spammers, but JangoMail does accept different levels of opt-in email marketing. For example, some customers use single opt-in, while other customers use confirmed opt-in. Generally, customers using confirmed opt-in experience higher deliverability. Therefore, different JangoMail clients have different reputations with ISPs, so if two clients are both using a From Address for example, they both can impact the reputation of the domain

The Eight Steps:

Following the below steps will solve most email delivery issues to major consumer ISPs, like Yahoo, Hotmail, Gmail, and AOL.

  1. Use your own domain name in the FROM address. Brand your messages using your own domain name in the FROM address. This requires using an SPF record (see #5 below) that includes If you use, the delivery of your messages is mixed in with everyone else using as their FROM address. All JangoMail accounts come with the option to use as the FROM address on email campaigns, but that's meant to help smaller volume users to get started, and is provided as a convenience to our clients. If you have your own domain name, use it - it only helps.

    a. In order to separate your reputation from other clients using as their FROM address, use an actual company (or based on your domain name/website) email address, such as

    b. You can also send using a subdomain within your company, using an address such as And, if you want JangoMail to handle reply management for that subdomain (our branded subdomain feature), let us know via a support ticket. Replies to your messages can be forwarded to an address of your choosing (replies normally go to the FROM address you used in your message). For instructions, see the PDF Setting up a Branded Sub-Domain.

    Who should do this? The technical person who manages your domain's DNS settings.
  2. Use a custom tracking domain based on your domain name. The tracking domain is the domain referenced in the URLs for our open-tracking mechanism, click tracking, the unsubscribe link used in your CAN-SPAM footer, the forward-to-friend link, the view-as-a-web-page link, and other links that offer tracking in your email messages. By default, every JangoMail account is assigned a system tracking domain that is shared amongst multiple clients. Example names are and By setting up your own tracking domain, you can isolate yourself from the activities of our other clients. Create a CNAME record in your DNS that points to (that's "jango" without the "a"). Then, go to Settings --> Tracking --> Tracking Domain and enter your tracking domain name. If your domain is, then setting up makes for the perfect tracking domain. A URL that looks more like you than us helps with your branding. See our blog article for more information.

    Who should do this? The technical person who manages your domain's DNS settings.
  3. Use a Domain Key based on the domain name you use in your FROM address. Yahoo and other email providers look for DKIM signatures in the headers of email messages. The presence of a DKIM signature fosters a sense of trust that the email was sent by who was purported to send the email. To set up a domain key in JangoMail, see our PDF entitled Setting up DomainKeys/DKIM with JangoMail. Note: Yahoo requires that you have a "postmaster" address at your domain.

    Who should do this? The technical person who manages your domain's DNS settings.
  4. After creating a DomainKeys/DKIM record, click the link in the confirmation email sent from Yahoo to postmaster@yourdomain. Whe you enable a new domain key in your accoutnt, we upload it to Yahoo so that they can process complaints properly and report them back to JangoMail via a "Feedback Loop." Yahoo has a special process where they send a confirmation email to postmaster@yourdomain, and that email message contains a link that must be clicked by you in order to activate the Feedback Loop. If you do not do this, complaints will not be properly reported, and your delivery to Yahoo email address may be negatively impacted by recipients that complain over and over and aren't added to your unsubscribe list.

    Who should do this? The person who has access to the postmaster@domain account for your domain. Usually this is your organization's system administrator.
  5. Add or edit the SPF record for your domain. An SPF record authorizes someone else (JangoMail, in this case) to send on behalf of your domain. This marks the "smtp.mail" header information with your domain, not ours, and messages sent to a gmail address, as an example, won't display "your_domain_name via" Instructions can be found in the PDF How to Publish SPF Records in JangoMail.

    Who should do this? The technical person who manages your domain's DNS settings.
  6. If you're sending HTML email, make sure you include a corresponding plain text message. Spam filters tend to add a point or so to messages that do not include a plain text component. This is as easy as setting the Plain Text Message to "auto-generate" (see the screenshot below.)  This will cause a plain text message to be generated (based on your HTML message) at the time of email sending. If the auto-generated message isn't good enough, you can also edit the plain text or simply create your own.

    Who should do this? The person using JangoMail.
  7. Enroll in the Sender Score Certified program. In order to be accepted, you must have a complaint rate of 0 to 0.1%, plus meet some other requirements. Once enrolled, your emails are sent from IP addresses that are certified. Hotmail virtually guarantees inbox placement for emails sent from certified IPs, and Yahoo prioritizes emails sent from certified IPs.

    Who should do this? The person using JangoMail.
  8. If using click-tracking, anchor text should be phrases, not URLs. Some spam filters look closely at how you use links to determine whether the link is legitimate or fraudulent. They do this to prevent phishing scams--a type of scam where an email pretends to be a request from a legitimate company in order to get the login credentials of that company's user, or take you to some other completely unrelated site. For more information on phishing, see the Wikipedia article on phishing. The best way to explain good links versus bad links is with an example:

    Good Link: <a href="">Visit our web site.</a>

    Bad Link - the visible link is to browniekitchen, but the actual link is to somewhere else: <a href=""></a>

    What makes the bad link bad is that the anchor text is a URL, and that domain in that URL does not match the domain in the link destination. Phishing filters look for this domain mismatch. In the good example, however, the anchor text is not a URL to begin with, so the phishing filter will accept it as legitimate.

    Who should do this? The person designing your email campaigns.
Further Reading
For more information on general JangoMail deliverability practices, see our Deliverability page on our web site.

Additionally, there are simple steps that any email marketer can take with the content of messages to ensure high deliverability. The content-related issues are covered in the PDF document Optimizing Email Deliverability.

Friday, November 06, 2009

How we scaled up the JangoSMTP service to accommodate the ING New York City Marathon

Overview of the New York City Marathon and its Email Alerts

It was a sunny mid-September day when my head of sales informed me that the systems integrator for the 2009 New York City Marathon was looking at our SMTP service for the delivery of alert emails on runners during the marathon. Given that our SMTP relay service was relatively new at the time, we saw this as an opportunity to demonstrate the powerful tracking features and performance capabilities of our service.

Having tried other email vendors and their own internal systems in the past, the marathon was looking to avoid past issues, such as large delays in the delivery of the email alerts and email blocking issues with consumer ISPs like GMail and Hotmail.

The marathon had about 42,000 total runners. Friends and family members of each runner could "subscribe" to a runner, such that whenever the runner reached a checkpoint during the marathon, an email alert would be sent to the subscribers of that runner. This would be done electronically via a Chronotrack D-Tag. For more information on the electronic tracking of runners, see

My team was told to expect anywhere from 400,000 to 2,000,000 email alerts to be sent out during the race. That represents an average of 10 to 50 email alerts per runner, depending on how many individuals subscribe to a particular runner.

The Speed Problem

The JangoSMTP service has been a single-node service since its launch earlier in 2009. It was serviced by one single fault-tolerant, RAID-based, multiple-CPU, high memory Windows server located at The SMTP service works by receiving email at, and then passing emails along to one of JangoMail's 40 outbound SMTP senders for delivery to the final recipient. The server could receive an unlimited amount of emails and saturate our upstream Internet provider's bandwidth, but it could only process, add tracking, and transmit to the outbound SMTP senders over the Internet at a rate of 250 emails/minute. I therefore calculated:

250 emails/minute x 60 = 15,000 emails/hour

Based on past marathon results, I estimated that the fastest runners would complete the race in about 2 hours, and the slowest runners would complete the race in about 6 hours. However, the marathon would be initiated in 3 waves of 14,000 runners each, distributed over an hour the morning of the marathon. So 6 hours of running time, plus an added hour for the start of the last wave, meant 7 hours of sending email.

7 hours x 15,000 emails/hour = 105,000 emails over 7 hours

Uh oh. We weren't nearly fast enough. Even at the minimum expected volume, we weren't fast enough by a factor of 4. And at the maximum expected volume, we only had 5% of the needed capacity.

The two bottlenecks were 1) the processing of an email message, meaning the dis-assembly and re-assembly to determine what user it belonged to and add tracking mechanisms, and 2) transmitting the email to a SMTP sender. Point #2 warrants more explanation. While there is no bottleneck for to receive emails from the outside world, there can be a bottleneck for to transmit emails, since must transmit the message to separate SMTP sender located on separate networks in separate data centers. This transmission happens over the Internet, and based on where the SMTP sender is located and the routing to it, speed can fluctuate.

Time to Scale Up

Load Balancing

We needed to scale up, and scale up fast. The initial plan was to order four more servers, and have them each serve as an additional SMTP receiver and processor for The JangoMail architecture does not employ the use of appliance-based load balancers, so I decided to handle the load balancing via our Domain Name System (DNS).

We created multiple DNS "A" records for, each with a Time to Live (TTL) of 60 seconds. Five "A" records were created in total, each with a different IP address. The first of the five was the original IP for, and the other four were for the four additional servers we commissioned.

By keeping the TTL at a short 60 seconds, I could make certain that each of the five servers would receive an equal load of email every minute. And since not all DNS servers on the net respect TTLs and sometimes do their own caching, I confirmed with our tech contact at the marathon that their systems would NOT cache the IPs for beyond the designated 60 second TTLs.

SQL Query Caching

Every email that arrives at is disassembled, tracked, re-assembled, and then passed to an outbound SMTP server for actual sending. In order to determine what email belongs to what user, and what tracking options each user has selected, the originating IP address of each email message is looked up against an IP Address table, and then once the user is determined from the IP address, the UserAccounts table in the core database is queried to determine what tracking/DomainKeys options the user has selected. These two queries combined took anywhere from 0.05 seconds to 0.2 seconds, depending on the load on the database at the time.

We shaved this time down to 0.001 seconds by caching the results of these queries and refreshing every five minutes.


Our custom SMTP architecture is a multi-threaded model, allowing for the simultaneous processing and delivery of emails across user accounts. We had been informed ahead of time that the marathon would trigger email alerts from two originating IP addresses. We therefore configured two dedicated processing threads on each of the 8 servers. This gave us 16 total processing threads, and also isolated the processing/delivery of the marathon's emails from our other clients' emails during the race.

Distributed Transactional Senders

The SMTP service is part of JangoMail's transactional email platform, which also includes the SendTransactionalEmail API method. All transactional emails are sent through the email sender that is assigned for a particular user. For fault-tolerance purposes, every user has a list of transactional email senders assigned to it, such that if the first email sender is unavailable or offline, the email is passed to the second, and to the third, and so on, until the email is successfully transmitted. This approach was great for fault-tolerance and redundancy, but not for scaleability. If the first server in the list was online and available, then it would receive all the transactional emails for that account.

I therefore decided to add an internally controlled user-level setting option to randomize the list of senders. Now, if a user's list of transactional senders included:

Sender1, Sender2, Sender3, Sender4

Now the servers would farm out the emails for delivery to any sender in the user's list at random, ensuring that as many transactional senders as were assigned would receive an equal load of emails to deliver, rather than having the first available sender do all the delivery. This also aided in resolving the bandwidth bottleneck with the SMTP senders mentioned earlier.

Still not fast enough - need 3 more servers

Given our SQL query optimizations, multi-threading, additional servers, the timing now looked like:

400 emails/minute/server x 5 servers = 2,000 emails/minute x 60 minutes = 120,000 emails/hour.

120,000 emails/hour x 7 hours = 840,000 emails over 7 hours

However, if the load was over 1 million emails, there would still be a delay. I decided to annex 3 additional servers that are already a part of the JangoMail network but weren't active on port 25, and turn them into 3 additional SMTP receivers. There were now 8 total DNS "A" records for

With just 48 hours before the marathon, we were informed that the expected outbound volume, based on the number of subscribers so far, would be about 750,000 emails.

And just in case all else failed...

While we've always believed in the performance and reliability of our code and architecture, we decided that for a project of this caliber, a backup plan was necessary in case our custom SMTP architecture was unable to perform. The JangoSMTP custom architecture is what allows emails that pass through the SMTP relay to be open and click-tracked, and stored in a database, so that SMTP logs can be viewed and reports can be generated based on open and click timing, domains, and geo-tracking reports based on IP addresses. However, the primary issue for the marathon, was to ensure the emails were delivered, and delivered on time. Therefore, a backup plan was put into place that could guarantee the emails would be delivered, even if we had to eliminate the tracking and logging based on our own custom architecture. If we found that JangoSMTP could not handle the load, we would replace the instances of the JangoSMTP receiver with Microsoft's built-in SMTP service (part of Internet Information Services), such that emails would be received and delivered to the final recipient, without any processing needed in between.

In order to isolate the marathon from our other clients in case this backup plan had to be put in place, we setup the domain, which mimiced the 8 A records for, and we asked the system integrators for the marathon to connect to instead of This would allow us to re-direct just their email on the day of the race if needed.

The Day of the Race - November 1, 2009

I awoke at 7:30 AM EST on that Sunday, after having been out the night prior for Halloween. The emails would begin trickling in at 8:30 AM EST for runner check-ins, and the first wave of the race was set to begin at 9:40 AM EST.

I was watching the race live on TV, while at the same time monitoring the traffic flows across our 8 instances of Emails were being received, processed, and sent quickly, and there was no backlog...until about 12:25 PM EST.

All three waves had been released, and runners from all three waves were triggering a massive volume of email alerts. From 12:25 PM EST to about 12:35 PM EST, there was a 4-5 minute delay with final delivery. Thankfully, the backlog period only lasted 10 minutes. It makes sense that approximately 3 hours after the release of the first wave, that the highest volume of email was passing through, since the greatest number of runners would still be running around this time.

Additionally, at about 1:00 PM EST, we discovered that and domains were blocking one of the IPs from which marathon email was sending. While we did have a mechanism by which domain-specific routes could be used, such that we could enable all email to go through one specific non-blocked IP address, the complexity of the randomization system we had added to accomodate the bandwidth bottleneck rendered this mechanism non-functional. I called our lead developer, who was on call, asked him to make a change to the sender-determination algorithm, and re-deployed our code across all 8 SMTP server instances. We were now able to route all email through a separate non-blocked SMTP sender. In the end, the marathon alert emails had less than a 0.3% blocking rate.

After 1:00 PM EST, no further email deliverability or backlog issues ensued.


We were thrilled that we were able to pull this off for the 2009 ING New York City Marathon. Even post-marathon, we continue to make performance and feature enhancements to our transactional email platform. If you have an important project for which sending email is critical, please get in touch with us, and we'll work as hard for you as we did for the marathon.

New API Method for Template-Driven Transactional Emails


Marketers can now create and edit Transactional Email Templates on the Send Email Page and without the help of their IT team.

To enable this, we launched a new API method: SendTransactionalEmailFromTemplate. Instead of passing the full details of the email message using the regular SendTransactionalEmail method, you can now simply pass the email Campaign ID and let your marketers use the JangoMail interface to dictate the email's creative content.

SendTransactionalEmailFromTemplate works like the SendTransactionalEmail method, but does not require you to enter FromEmail, FromName, Subject, MessagePlain, and MessageHTML. Instead you must enter CampaignID, PersonalizationValues, PersonalizationColDelimiter and PersonalizationFields.

Input Parameters

Your JangoMail account username

Your JangoMail account password

Marketers should create an Email Campaign as they normally would, starting on the Send Email Page (or just use the SendMassEmail API method). Once they create a campaign and send a test, you can find the Campaign ID in the Reporting and Analytics section of the JangoMail interface. Look in the ID column to find the Campaign ID.

The single email address to whom you want to send this email message.


JangoMail uses the following syntax for personalization and Marketers should continue to use this when creating transactional email templates. Mail-merge personalization tags can be used in the Subject, HTML Message, Plain Text Message, From Display Name, and From Email Address:

%%FieldName**Default Value%

The second version of the personalization syntax can be used in cases where the value of FieldName is blank, such that a default value is substituted instead of a blank. 


Specify a column delimiter as follows:
c for a comma
s for a space
n for a newline, or a hard break
t for a tab

A comma separated list of name/value pairs.  The names of the various options and their associated values are explained below.
You may specify:
TransactionalGroupID (a numeric ID of a previously created Transactional Group)
SkipUnsubCheck ("True" or "False")

You can also specify the following, but if not specified, values will pull from your original email campaign. User-specified values here will override values in your email campaign:

ReplyTo (any valid email address)
CC (any valid email address)
BCC (any valid email address)
CharacterSet (a character set like "ISO-8859-1" or "US-ASCII")
Encoding (either "7 bit" or "Quoted Printable" or "Base 64")
Priority (either "Low", "Medium", or "High") 
UseSystemMAILFROM ("True" or "False") 
Receipt ("True" or "False")
Wrapping (a numeric value from 0 to 100, with 0 meaning no wrapping takes place)
ClickTrack ("True" or "False") 
OpenTrack ("True" or "False")
NoClickTrackText ("True" or "False") 
Attachment1 (the name of a previously FTPd file, like "Invoice.pdf")
(the name of a previously FTPd file, like "Invoice.pdf")
Attachment3 (the name of a previously FTPd file, like "Invoice.pdf")
Attachment4 (the name of a previously FTPd file, like "Invoice.pdf")
Attachment5 (the name of a previously FTPd file, like "Invoice.pdf")


In the below example, the input parameters are:


This example assumes that the Subject and/or Body contains personalization placeholders for FirstName and OrderNumber.  In fact, for Campaign ID 265987456, the actual message is:

------BEGIN MESSAGE-------
Dear %%FirstName**Valued Customer%%,

Your order has shipped.  Your order number is %%OrderNumber%%.
------END MESSAGE-------

This transactional email will be open tracked.  To ensure that it will also be click tracked, we would add "ClickTrack=True" to the Options parameter.  If we wanted it to be a high priority message instead of the default medium priority, we could add "Priority=High", such that the full Options string would look like:,OpenTrack=True,ClickTrack=True,Priority=High

To test the operation using the HTTP POST protocol, visit the JangoMail API page on this method and click the Invoke button.

Frequently Asked Questions

Q. What's the difference between SendTransactionalEmailFromTemplate and SendTransactionalEmail?
A. When calling SendTransactionalEmail, you are passing in the full details of that email message, including the Subject, the HTML Message, the Plain Text Message, tracking options and much more.  However, if you've already created a template message in the Send Email section of the JangoMail web interface, you can call SendTransactionalEmailFromTemplate to send transactional emails and avoid having to pass in all the message details on every method call.  You simply reference the Campaign ID of the email message that you created in the Send Email section.

Q. I see there's a PersonalizationColDelimiter input paramter.  Where is the PersonalizationRowDelimiter input parameter?
A. Since this is a method to send a single transactional email, only one set of values can be provided for the single recipient of the email message.  There is no need for a row delimiter since the data should only be for one record.

Q. What is the TransactionalGroupID?
A. This is an optional setting that can be specified as part of the Options input parameter.  Transactional Groups are a way to categorize different types of transactional emails, like Order Confirmations, Shipping Notifications, and Thank You messages.  You can create different Transactional Groups using the web interface or by calling AddTransactionalGroup.  Every Group has a numeric ID assigned to it, and so to assign a particular transactional email to a Group, you can set the TransactionalGroupID.

Q. How do I send attachments with my transactional email?
A. You can specify the names of attachments in the Options input parameter.  However, the file names you specify must already be present in your account.  You should FTP your files to prior to calling this method with attachments.

Tuesday, October 27, 2009

Official Launch of, Our Stand-Alone SMTP Relay Service

We have just launched, a new stand-alone SMTP relay service and the first designed for email marketers.

Why use it?
JangoSMTP is the first SMTP relay service to offer open and click tracking. It also comes with a variety of features that contribute to its extreme deliverability
  • DomainKeys/DKIM Signing
  • SPF/SenderID Authentication
  • Sender Score Certification
  • Feedback Loops with ISPs
Visit our site for JangoSMTP's Full Features List.

Who is it for?
JangoSMTP can be utilized by users of desktop email clients (Outlook, Thunderbird, etc.),  Gmail users, and web programmers who send transactional emails through their own corporate servers.

Where can I learn more?
Go to for more information or Contact Us directly.

Monday, October 26, 2009

New API Method: AddTransactionalGroup

We just released a new API method for the JangoMail API which allows you to add a Transactional Group to your account:

  Adds a new Transactional Group to your account. Returns a string.

We also recently released 3 other transactional email API methods. These methods allow you to retrieve opens, clicks, unsubscribes, bounces, and complaint statistics for a single transactional email in your account.

Visit for a full list of our API methods.

Thursday, October 22, 2009

New Design: Features Page

JangoMail has a very comprehensive feature list and we've been working on a way to organize it so that it's easy to navigate. We want to make sure that our current and prospective customers are able to identify all of our capabilities and can easily find all of the information and tutorials we have on each feature.

We are excited to announce that we just relaunched our Email Features page, which now has an improved navigation system. You can expand each feature set and feature for more information. 

*Use the Table of Contents to find the feature category you are interested in.

*To navigate to a certain feature's description, video, tutorial or blog entry, simply click the arrow next to that feature.

  Then click on the link for the information you would like to see.

*To see a visual description of a certain feature, click on the name of that feature.

  A window will pop up with a visual description of the feature.

Browse through our new page yourself at: Let us know what you think!

Wednesday, October 21, 2009

Two SMTP Service Bug Fixes

Tonight we've deployed two bug fixes to the SMTP relay service:
  1. Previously, emails sent with very long Subject lines, such that the Subject line folded onto the next line, were improperly processed, and this could result in headers being visible in the email body. This is now fixed.
  2. Previously, emails sent with very long From lines, such that the From line folded onto the next line, were improperly processed, and this could result in the email not being transmitted to the final recipient at all. This is now fixed.
  3. Previously, encoded subject lines, such as:

    =?utf-8?Q?You've_received_=E2=82=A8229.64_($2.00_USD)_in_your_Surveyhead_?= =?utf-8?Q?account?=

    would not have their encoding preserved. This is also now fixed.
Technical Resources:

Those wishing to read about the allowance of folded lines as stated in the SMTP specification can do so here: Specifically, read section:


Monday, October 19, 2009

New Transactional Email API Methods

We have just released 3 new Transactional Email API Methods for the JangoMail Email Marketing API.

These new methods allow you to retrieve opens, clicks, unsubscribes, bounces, and complaint statistics for a single transactional email in your account:

  Retrieves statistics for a transactional email. Returns a .NET DataSet.

  Retrieves statistics for a transactional email. Returns a string.

  Retrieves statistics for a transactional email. Returns an XML document.

Saturday, September 19, 2009

Technical Discussion of How Social Networking Sites Send Transactional Email

Shortly after JangoMail launched its own transactional email platform, we took on a flood of new clients with a need to send "social networking" type transactional emails, including "You have a new message" notifications and "You have a new friend request" notifications. Then we launched our SMTP relay for email marketers, and the floodgates ripped off.

We're often asked what the best practices are from a technical standpoint, with respect to issues like Content, From Addressing, DomainKeys and DKIM, and SPF/SenderID. Should the content of a message sent from one member to another be included in the email notification, or should the recipient have to log in to the site to read the message? Should a "friend request" email come "from" the friend or "from" the social networking site? Should the email contain Plain Text, or HTML, or both? To best answer these questions, I've analyzed transactional email from the most notable social networking sites -- Facebook, LinkedIn, Friendster, and MySpace. Note that this is an article about the technical aspects of sending transactional email. If you're looking for an article on transactional email strategy (what to send, how often, to whom...), then you won't find that here, but you can in many other places.

The following are the properties of each social networking site's email that I will analyze:
  1. Presence of a DomainKeys header.
  2. Presence of a DKIM header.
  3. Sender Policy Framework (SPF) compliant email.
  4. The From Address
  5. The From Display Name
  6. The SMTP MAIL-FROM Address used in the SMTP transaction
  7. The Sender header, if present
  8. The Reply-To header, if present
  9. Use of a unique identifier in the SMTP MAIL-FROM address
  10. The content, particularly whether a friend's message is present in the Email Body, or whether the user must log in to read the message.
  11. The use of HTML versus Plain Text MIME parts.
Let's get started with the biggest social network of all, Facebook:


When somebody sends me a message on Facebook, I get an email notification with the Subject line:

"Mary Parker sent you a message on Facebook..."

The Body of the email contains the actual message, which is convenient, because it prevents me from having to log in to Facebook to read the message.

From Address:
From Name:
v=1; a=rsa-sha1;; s=q1-2009b; c=relaxed/relaxed;q=dns/txt;; t=1253415012;h=From:Subject:Date:To:MIME-Version:Content-Type;bh=fLwGefDfPrLKUK2vwWzaC5k5iNo=;b=DfJugajI0Fsc5FIppBQSfSAAiV+WuK1ugzc00USpIkJku3sUgcupO+TPua0Tcxw7qJDUE0yRohPMWz3jPwPfRA==;

A DKIM-Signature header for is present, but it is noteworthy that a DomainKey-Signature header is not present.

The SMTP MAIL-FROM address is:

Facebook Transactional Email SMTP Log: [03A4] 22:50:13 Connected [03A4] 22:50:13 >>> 220 ESMTP IceWarp 9.1.0; Sat, 19 Sep 2009 22:50:13 -0400 [03A4] 22:50:13 <<< EHLO [03A4] 22:50:13 >>> Hello [], pleased to meet you. [03A4] 22:50:13 <<< MAIL FROM:<> [03A4] 22:50:13 >>> 250 2.1.0 <>... Sender ok [03A4] 22:50:13 <<< RCPT TO:<> [03A4] 22:50:13 >>> 250 2.1.5 <>... Recipient ok [03A4] 22:50:13 <<< DATA [03A4] 22:50:13 >>> 354 Enter mail, end with "." on a line by itself [03A4] 22:50:13 *** <> <> 1 2021 00:00:00 OK BLS56313 [03A4] 22:50:13 >>> 250 2.6.0 2021 bytes received in 00:00:00; Message id BLS56313 accepted for delivery

The SPF record for is:

"v=spf1 mx ip4: ip4: -all"

The connecting IP is, which is a part of the "ip4:" directive and therefore this IP is SPF-valid for sending email "FROM"

Noteworthy Points:
  1. It's excellent that Facebook is employing both SPF and DKIM.
  2. The email lacks a DomainKey-Signature header for backwards compatibility for receiving systems that might not be DKIM-compliant yet.
  3. The email is from "Facebook" and not my friend "Mary Parker". This is likely to prevent people from attempting to reply to the email as a way of writing back to "Mary Parker". The only way to reply to the message is to login to Facebook and use their internal messaging system.
  4. Facebook's transactional emails come from the domain rather than the more recognizable This is perhaps to separate email reputation from their actual high-value business domain That way, should their emails be treated as spam by a network, the domain name will be punished, not
  5. The X-Mailer header of the email is:

    X-Mailer: ZuckMail [version 1.00]

    Presumably, ZuckMail is an email system written by, or an homage to, Facebook's founder Mark Zuckerberg.


LinkedIn sends transactional email differently than Facebook. While Facebook "friend request" email comes from "Facebook" and a no-reply email address, LinkedIn's "Join my network" emails usually come "From" the person trying to add you.

The relevant headers from a LinkedIn transactional email are below:

DomainKey-Signature: s=prod;; c=nofws; q=dns; h=Sender:Date:From:To:Message-ID:Subject:MIME-Version: Content-Type:X-LinkedIn-fbl;b=KQVq9LfSNIZ+6tOuz7xUaUW1wx86f62EndMqyY+bbkmI8jHQDNe8HdtW ZfJsxH50d8nvAnQHryCdQKGfBEY0u2t5sXkrRmf7yCAhhg4Q9aqBo20KZ LSUvTK726opFnO0;
From: "Mary Parker" <>
To: Ajay Goel <>

Note that the the From Name is my friend "Mary Parker" and the From Address is Mary's email address, Because no Reply-To header is present, clicking "Reply" on my email client will auto-address the message to the From Address,

From an authentication perspective, it's interesting that the LinkedIn transactional email contains the DomainKey-Signature header, but not the more modern DKIM-Signature header. JangoMail transactional emails contain both the DomainKey-Signature and the DKIM-Signature headers, for the highest level of compatibility with all receiving email systems.

LinkedIn Transactional Email SMTP Log: [057C] 12:16:54 Connected [057C] 12:16:54 >>> 220 ESMTP IceWarp 9.1.0; Thu, 03 Sep 2009 12:16:54 -0400 [057C] 12:16:54 <<< EHLO [057C] 12:16:54 >>> Hello [], pleased to meet you. [057C] 12:16:54 <<< MAIL FROM:<> SIZE=3706 [057C] 12:16:54 >>> 250 2.1.0 <>... Sender ok [057C] 12:16:54 <<< RCPT TO:<> [057C] 12:16:54 >>> 250 2.1.5 <>... Recipient ok [057C] 12:16:54 <<< DATA [057C] 12:16:54 >>> 354 Enter mail, end with "." on a line by itself [057C] 12:16:54 *** <> <> 1 4048 00:00:00 OK KZT46754 [057C] 12:16:54 >>> 250 2.6.0 4048 bytes received in 00:00:00; Message id KZT46754 accepted for delivery

Noteworthy Points:

  1. 1. The SMTP MAIL-FROM address is a string of characters followed by LinkedIn is using a sub-domain of its high-value business domain, JangoMail also offers the option to setup a sub-domain based off your corporate domain name. The string of randomly generated characters is presumably to track any bounce that occurs as a result of this particular transactional email. If the MTA sends a notification back to, the LinkedIn system will be able to immediately tie the identifier present in that email address and use that information to immediately notify Mary Parker that the email to me bounced. JangoMail also handles bounces to transactional emails, but with a unique identifier in the X-VConfig header of the message as opposed to within the MAIL-FROM address itself. Both options are legitimate for tracking bounces.
  2. The SPF record for is:


    The redirect directive then tells us to look up the SPF record for, which is:

    "v=spf1 ip4: ip4: ip4: ip4: ip4: ip4: ip4: ip4: ip4: ip4: mx ~all"

    The sending IP is covered by the "ip4:" designation, therefore this email passes the SPF test.
  3. Emails with subject line "Invitation to connect on LinkedIn" always has the user's information as the From Name / From Address.
  4. Emails with subject line "Join my network on LinkedIn" sometimes have the From Name / From Address of the user, but other times From Name is "Mary Parker (LinkedIn Invitations)" and From Address is

    I have been unable to determine the reason for the ambiguity with the "Join my network on LinkedIn" emails.


The following are the relevant headers from a Friendster "new message" notification:

From: Friendster <>
Subject: New Friendster Message from Vikki - 09/07/09 10:17 PM

Friendster Transactional Email SMTP Log: [03A4] 01:17:58 Connected [03A4] 01:17:58 >>> 220 ESMTP IceWarp 9.1.0; Tue, 08 Sep 2009 01:17:58 -0400 [03A4] 01:17:58 <<< EHLO [03A4] 01:17:58 >>> Hello [], pleased to meet you. [03A4] 01:17:58 <<< MAIL FROM:<> SIZE=9837 [03A4] 01:17:58 >>> 250 2.1.0 <>... Sender ok [03A4] 01:17:58 <<< RCPT TO:<> [03A4] 01:17:58 >>> 250 2.1.5 <>... Recipient ok [03A4] 01:17:58 <<< DATA [03A4] 01:17:58 >>> 354 Enter mail, end with "." on a line by itself [03A4] 01:17:58 *** <> <> 1 10017 00:00:00 OK POZ63258 [03A4] 01:17:58 >>> 250 2.6.0 10017 bytes received in 00:00:00; Message id POZ63258 accepted for delivery

Noteworthy Points:
  1. The complete lack of both DomainKeys and DKIM signatures.
  2. The email is SPF compliant. The SPF record for is "v=spf1 mx ip4: -all" and the sending IP is, which is covered by the "ip4:" directive.
  3. The email is not "from" my friend but instead is from "Friendster". The From Email is also not of my friend, but a Friendster unique email address, in this case The From Address is the same as the SMTP MAIL-FROM address shown in the SMTP transaction. Therefore bounces at the MTA level will be sent to, and the unique number that's a part of that From Address presumably allows the Friendster mail system to know that it was this particular transactional email that bounced.
  4. There is no Reply-To address, so if the user does hit Reply in his email client, the reply will go to the From Address,, and sending to this will presumably cause the email to be lost in the ether.


The following are the relevant headers from a MySpace "new message" notification:

DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=pmta;;h=MIME-Version:From:To:Reply-To:Date:Subject:Content-Type:Content-Transfer-Encoding;;bh=T25HyvwBLohBcz5zhA0xB0tJqdc=;b=SeqKqNrcg4jDIyy0lmlo2BJje2frO0hgd16E9M/Y7U42LNLPh+cLlr7q5muDN7ASuPzwaNIvjj9VKq9VzNSvnxNukRsF2ICj+jT7GFRHdO39feZXnyJgcGbu0eHGLF7v83PL8CApEF80w/f3HuZ8xZgzYQcagUvNeD2jUmTqj/4=
DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=pmta;;b=SlJszI5cM6w78pK5nSJLzVTrrFw5YgU2vX8GraxP8yPjhbb6/hZ+oMjr7HUF21r8wyK774IEA/o/u3Y6z+kcpRHTf7D3TWD94TCZW+mQDGxl3t+FSdqLLt4ISVUvGu+LTAIMfpSOzVKNnz3C/4QHpAg1c2a2jRu1IFmrPbqOaK0=;
From: MySpace <>
Reply-To: MySpace <>
Subject: MaryParker has sent you a new message!

MySpace Transactional Email SMTP Log: [0664] 18:04:01 Connected [0664] 18:04:01 >>> 220 ESMTP IceWarp 9.1.0; Fri, 10 Jul 2009 18:04:01 -0400 [0664] 18:04:01 <<< EHLO [0664] 18:04:01 >>> Hello [], pleased to meet you. [0664] 18:04:01 <<< MAIL FROM:<> BODY=8BITMIME [0664] 18:04:01 >>> 250 2.1.0 <>... Sender ok [0664] 18:04:01 <<< RCPT TO:<> [0664] 18:04:01 >>> 250 2.1.5 <>... Recipient ok [0664] 18:04:02 <<< DATA [0664] 18:04:02 >>> 354 Enter mail, end with "." on a line by itself [0664] 18:04:02 *** <> <> 1 5669 00:00:00 OK RDO05602 [0664] 18:04:02 >>> 250 2.6.0 5669 bytes received in 00:00:00; Message id RDO05602 accepted for delivery

MySpace is the only one of the four social networking sites to use both the DomainKey-Signature and the DKIM-Signature headers, so kudos to MySpace for considering the entire email ecosystem.

Noteworthy Points:

  1. Both DKIM and DomainKeys headers present.
  2. SPF passes. The SPF record for is "v=spf1 ip4: ip4: ip4: ip4: a ~all" and the sending IP is, which is included in the "ip4:" directive.
  3. The email is From "MySpace" rather than "Mary Parker", and the From Address is instead of The From Address clearly implies that you should not reply to it, unlike Friendster's address. Clearly MySpace wants you to log in to the site to reply rather than by email.
  4. The SMTP MAIL FROM is, and does not contain a unique identifier.
  5. The Reply-To header is present, but its value is the same as the From Address. So regardless, if you hit Reply on your email client, the email is going to

If I had to rank the social networking sites in order of best to worse in sending authenticated, compliant, and useful transactional email, this would be the ranking:

1. Facebook (Best)

Positive: Emails are DKIM and SPF compliant. Email notifications of "You have a new message" include the message in the body of the email.
Negative: No DomainKeys signature, and the Reply-To address is one that cannot receive replies.

2. MySpace

Positive: Emails are SPF, DKIM, and DomainKeys compliant - the only social network to use all three.
Negative: Notifications of "You have a new message" force you to login to read your message. The Reply-To address is one that cannot receive replies.

3. LinkedIn

Positive: Emails are SPF and DomainKeys compliant. Sometimes emails are "From" the actual friend rather than LinkedIn. Proper use of the Sender header.
Negative: No DKIM signature, which means LinkedIn is complying with the older DomainKeys standard but not the newer DKIM standard. Notifications of "You have a new message" force you to login to read your message.

4. Friendster (Worst)

Positive: Emails are SPF compliant.
Negative: No DomainKeys signature. No DKIM signature. Notifications of "You have a new message" force you to login to read your message. The Reply-To address is one that cannot receive replies.

JangoMail Best Practice Recommendations:

When using JangoMail to send transactional emails for a social network, you can optimize the deliverability and usability of your emails by following these guidelines:

1. Ensure your emails are SPF compliant. In most cases, your emails will already be SPF compliant. Whether you're using as your From Address or as your From Address, SPF validates the SMTP MAIL-FROM Address, not the Display From Address that the recipient sees. The SMTP MAIL-FROM Address, meaning the From Address that shows in the SMTP logs, will always be, unless one of the following is true:

a. You've setup a custom sub-domain, in which case your sub-domain will be reflected in the SMTP MAIL-FROM.
b. You've explicitly set the SMTP MAIL-FROM by unchecking the "Use JangoMail MAIL-FROM" box on the Send Email page.
c. You've explicitly set the UseSystemMailFrom=False option when calling the SendTransactionalEmail API method.
d. You've unchecked the Use JangoMail MAIL-FROM box under My Options --> SMTP Relay, and you are using the smtp relay to send your emails.

2. Ensure your emails are signed with DKIM and DomainKeys. Once you've setup your account to use DKIM, your emails will automatically include both a DKIM and a DomainKeys signature. Read this guide to learn how to configure DomainKeys/DKIM for your emails.

3. Determine whether the content of a "You have a new message" email should appear in the Body of the email or whether you want to force the recipient to login to read the new message. I personally favor Facebook's method of including the original message in the email notification but forcing the recipient to log in to reply. After all, free social networks need to generate page-views, and they can't do that if they allow back-and-forth messaging functionality all within email.

4. Determine whether the From Address and/or Reply-To Address should be that of your social network's or that of your user's. We've seen that in the big four, LinkedIn is the only site that shows the user's name and email address in the From Line. This allows the recipient to conveniently reply to the sender of the message via email. The disadvantage to the owner of the social network is that the recipient need not visit the web site to reply to the message.

Therefore, If you wish to optimize the user experience, set the user's name and email address in the From line of the email message. If you employ this strategy, consider these points:

a. Your emails will still be SPF compliant so long as the SMTP MAIL-FROM contains a single consistent domain and SPF has been setup properly for that single domain.
b. Return Path, a large email deliverability company, recommends that if you send emails in this manner, be sure to include the "Sender" header as well. In JangoMail, you need only contact Support to have the Sender header turned on for your account.
c. There is a small chance that your emails will not be SenderID compliant, since SenderID may validate the Display From Address in addition to the SMTP MAIL-FROM address. However most SPF records for major domains are just that - SPF records and not SenderID records. In fact, all four major social networking sites use ONLY SPF, and not SenderID, as shown by the v=spf1 designation in all four records.

The best option may be to set the From Address to the social network site's address (, and set a Reply-To Address equal to the user's email address. The advantage of this setup is that you need not worry about any SPF/SenderID issues, and if the recipient hits Reply, the email will be directed to the user, not the social network web site. It is still important to have the Sender header inserted, however.