How to send an email from JavaScript

ID : 10336

viewed : 56

Tags : javascriptemailjavascript

Top 5 Answer for How to send an email from JavaScript

vote vote

94

You can't send an email directly with javascript.

You can, however, open the user's mail client:

window.open('mailto:test@example.com'); 

There are also some parameters to pre-fill the subject and the body:

window.open('mailto:test@example.com?subject=subject&body=body'); 

Another solution would be to do an ajax call to your server, so that the server sends the email. Be careful not to allow anyone to send any email through your server.

vote vote

85

Indirect via Your Server - Calling 3rd Party API - secure and recommended


Your server can call the 3rd Party API after proper authentication and authorization. The API Keys are not exposed to client.

node.js - https://www.npmjs.org/package/node-mandrill

const mandrill = require('node-mandrill')('<your API Key>');   function sendEmail ( _name, _email, _subject, _message) {     mandrill('/messages/send', {         message: {             to: [{email: _email , name: _name}],             from_email: 'noreply@yourdomain.com',             subject: _subject,             text: _message         }     }, function(error, response){         if (error) console.log( error );         else console.log(response);     }); }  // define your own email api which points to your server.  app.post( '/api/sendemail/', function(req, res){                  let _name = req.body.name;     let _email = req.body.email;     let _subject = req.body.subject;     let _messsage = req.body.message;      //implement your spam protection or checks.       sendEmail ( _name, _email, _subject, _message );  }); 

and then use use $.ajax on client to call your email API.


Directly From Client - Calling 3rd Party API - not recomended


Send an email using only JavaScript

in short:

  1. register for Mandrill to get an API key
  2. load jQuery
  3. use $.ajax to send an email

Like this -

function sendMail() {     $.ajax({       type: 'POST',       url: 'https://mandrillapp.com/api/1.0/messages/send.json',       data: {         'key': 'YOUR API KEY HERE',         'message': {           'from_email': 'YOUR@EMAIL.HERE',           'to': [               {                 'email': 'RECIPIENT@EMAIL.HERE',                 'name': 'RECIPIENT NAME (OPTIONAL)',                 'type': 'to'               }             ],           'autotext': 'true',           'subject': 'YOUR SUBJECT HERE!',           'html': 'YOUR EMAIL CONTENT HERE! YOU CAN USE HTML!'         }       }      }).done(function(response) {        console.log(response); // if you're into that sorta thing      }); } 

https://medium.com/design-startups/b53319616782

Note: Keep in mind that your API key is visible to anyone, so any malicious user may use your key to send out emails that can eat up your quota.

vote vote

74

I couldn't find an answer that really satisfied the original question.

  • Mandrill is not desirable due to it's new pricing policy, plus it required a backend service if you wanted to keep your credentials safe.
  • It's often preferable to hide your email so you don't end up on any lists (the mailto solution exposes this issue, and isn't convenient for most users).
  • It's a hassle to set up sendMail or require a backend at all just to send an email.

I put together a simple free service that allows you to make a standard HTTP POST request to send an email. It's called PostMail, and you can simply post a form, use JavaScript or jQuery. When you sign up, it provides you with code that you can copy & paste into your website. Here are some examples:

JavaScript:

<form id="javascript_form">     <input type="text" name="subject" placeholder="Subject" />     <textarea name="text" placeholder="Message"></textarea>     <input type="submit" id="js_send" value="Send" /> </form>  <script>      //update this with your js_form selector     var form_id_js = "javascript_form";      var data_js = {         "access_token": "{your access token}" // sent after you sign up     };      function js_onSuccess() {         // remove this to avoid redirect         window.location = window.location.pathname + "?message=Email+Successfully+Sent%21&isError=0";     }      function js_onError(error) {         // remove this to avoid redirect         window.location = window.location.pathname + "?message=Email+could+not+be+sent.&isError=1";     }      var sendButton = document.getElementById("js_send");      function js_send() {         sendButton.value='Sending…';         sendButton.disabled=true;         var request = new XMLHttpRequest();         request.onreadystatechange = function() {             if (request.readyState == 4 && request.status == 200) {                 js_onSuccess();             } else             if(request.readyState == 4) {                 js_onError(request.response);             }         };          var subject = document.querySelector("#" + form_id_js + " [name='subject']").value;         var message = document.querySelector("#" + form_id_js + " [name='text']").value;         data_js['subject'] = subject;         data_js['text'] = message;         var params = toParams(data_js);          request.open("POST", "https://postmail.invotes.com/send", true);         request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");          request.send(params);          return false;     }      sendButton.onclick = js_send;      function toParams(data_js) {         var form_data = [];         for ( var key in data_js ) {             form_data.push(encodeURIComponent(key) + "=" + encodeURIComponent(data_js[key]));         }          return form_data.join("&");     }      var js_form = document.getElementById(form_id_js);     js_form.addEventListener("submit", function (e) {         e.preventDefault();     }); </script> 

jQuery:

<form id="jquery_form">     <input type="text" name="subject" placeholder="Subject" />     <textarea name="text" placeholder="Message" ></textarea>     <input type="submit" name="send" value="Send" /> </form>  <script>      //update this with your $form selector     var form_id = "jquery_form";      var data = {         "access_token": "{your access token}" // sent after you sign up     };      function onSuccess() {         // remove this to avoid redirect         window.location = window.location.pathname + "?message=Email+Successfully+Sent%21&isError=0";     }      function onError(error) {         // remove this to avoid redirect         window.location = window.location.pathname + "?message=Email+could+not+be+sent.&isError=1";     }      var sendButton = $("#" + form_id + " [name='send']");      function send() {         sendButton.val('Sending…');         sendButton.prop('disabled',true);          var subject = $("#" + form_id + " [name='subject']").val();         var message = $("#" + form_id + " [name='text']").val();         data['subject'] = subject;         data['text'] = message;          $.post('https://postmail.invotes.com/send',             data,             onSuccess         ).fail(onError);          return false;     }      sendButton.on('click', send);      var $form = $("#" + form_id);     $form.submit(function( event ) {         event.preventDefault();     }); </script> 

Again, in full disclosure, I created this service because I could not find a suitable answer.

vote vote

62

I know I am wayyy too late to write an answer for this question but nevertheless I think this will be use for anybody who is thinking of sending emails out via javascript.

The first way I would suggest is using a callback to do this on the server. If you really want it to be handled using javascript folowing is what I recommend.

The easiest way I found was using smtpJs. A free library which can be used to send emails.

1.Include the script like below

<script src="https://smtpjs.com/v3/smtp.js"></script> 

2. You can either send an email like this

Email.send({      Host : "smtp.yourisp.com",      Username : "username",      Password : "password",      To : 'them@website.com',      From : "you@isp.com",      Subject : "This is the subject",      Body : "And this is the body"      }).then(        message => alert(message)      );

Which is not advisable as it will display your password on the client side.Thus you can do the following which encrypt your SMTP credentials, and lock it to a single domain, and pass a secure token instead of the credentials instead.

Email.send({      SecureToken : "C973D7AD-F097-4B95-91F4-40ABC5567812",      To : 'them@website.com',      From : "you@isp.com",      Subject : "This is the subject",      Body : "And this is the body"  }).then(    message => alert(message)  );

Finally if you do not have a SMTP server you use an smtp relay service such as Elastic Email

Also here is the link to the official SmtpJS.com website where you can find all the example you need and the place where you can create your secure token.

I hope someone find this details useful. Happy coding.

vote vote

53

You can find what to put inside the JavaScript function in this post.

function getAjax() {     try {         if (window.XMLHttpRequest) {             return new XMLHttpRequest();         } else if (window.ActiveXObject) {             try {                 return new ActiveXObject('Msxml2.XMLHTTP');             } catch (try_again) {                 return new ActiveXObject('Microsoft.XMLHTTP');             }         }     } catch (fail) {         return null;     } }  function sendMail(to, subject) {      var rq = getAjax();       if (rq) {          // Success; attempt to use an Ajax request to a PHP script to send the e-mail          try {              rq.open('GET', 'sendmail.php?to=' + encodeURIComponent(to) + '&subject=' + encodeURIComponent(subject) + '&d=' + new Date().getTime().toString(), true);               rq.onreadystatechange = function () {                  if (this.readyState === 4) {                      if (this.status >= 400) {                          // The request failed; fall back to e-mail client                          window.open('mailto:' + to + '?subject=' + encodeURIComponent(subject));                      }                  }              };               rq.send(null);          } catch (fail) {              // Failed to open the request; fall back to e-mail client              window.open('mailto:' + to + '?subject=' + encodeURIComponent(subject));          }      } else {          // Failed to create the request; fall back to e-mail client          window.open('mailto:' + to + '?subject=' + encodeURIComponent(subject));      } } 

Provide your own PHP (or whatever language) script to send the e-mail.

Top 3 video Explaining How to send an email from JavaScript

Related QUESTION?