mailto: URLs in JavaScript
Posted on Tue 15 September 2015 in Code
Though not as popular as back in the days, mailto:
URLs are sometimes still the best way
— and most certainly the easiest — to enable users to send emails from a web application. Typically, they are used
in plain regular links that are created with the <a>
tag:
<a href="mailto:john.doe@example.com">Send email</a>
Depending on the operating system and browser settings, clicking on such a link could invoke a different mail client.
In the past, this could cause much confusion if the user has never used its local email application (e.g. Outlook),
but nowadays browsers are increasingly doing the right thing and presenting a choice of possible options.
This includes the various web applications from popular email providers. User can thus choose — say — Gmail, and have
all subsequent mailto:
links take them to a Compose Mail view there.
Given those developments, it’s possible that soon those URLs won’t be as quaint as they used to be ;)
In any case, I think it’s worthwhile to have a few mailto:
tricks up our sleeve for when they turn out to be
an appropriate solution for the task at hand.
Triggering them in JavaScript
In the example above, I’ve used a mailto:
URL directly in some HTML markup. For the most part, however, those URLs
behave like any other and support a lot of the same functionality that http://
URLs do:
function sendEmail(address) {
window.location.href = 'mailto:' + address;
}
Predictably, calling this sendEmail
function is equivalent to clicking on a mailto:
link. This additional level
of indirection, however, may be enough to fool some web crawlers that look for email addresses to spam. Its effectiveness
depends largely on how radically we’re going to obfuscate the address
argument in the actual invocation.
More importantly, though, a function like that can be part of some more complicated logic. The only limitation is
the same one that restricts where and when it’s possible to window.open
another browser window. Namely, it has to be
called in a direct response to a UI action triggered by the user (a button click would be a good example).
Customization
In their simplest form, mailto:
URLs aren’t terribly interesting, since their only parameter is the address of a sole recipient. Fortunately, this isn’t where their capabilities end: it’s possible to customize other email fields as well,
such as the subject or even body1.
Somewhat surprisingly, all this can be done in a manner that’s more typical for http://
URL: with query string
parameters. Right after the recipient’s address, we can drop a question mark and add some ampersand-separated
key-value pairs:
<a href="mailto:john.doe@example.com?subject=Hi&body=Hello%20John!">
Say hello to John!
</a>
A more programmatic approach is of course also possible. One thing we need to remember, though, is the proper escaping
of input values in order to make them safe to put inside an URL2.
The encodeURIComponent
function can be used for this purpose:
function getMailtoUrl(to, subject, body) {
var args = [];
if (typeof subject !== 'undefined') {
args.push('subject=' + encodeURIComponent(subject));
}
if (typeof body !== 'undefined') {
args.push('body=' + encodeURIComponent(body))
}
var url = 'mailto:' + encodeURIComponent(to);
if (args.length > 0) {
url += '?' + args.join('&');
}
return url;
}
In theory, almost any of the numerous email headers can be specified
this way. However, support may vary across browsers, especially since some of the headers
(like the Bcc:
one) are subject to certain security
or privacy considerations. Personally, I wouldn’t recommend relying on anything besides
subject=
and body=
, with a possible addition of cc=
for
the Cc:
header .