web-dev-qa-db-fra.com

Comment envoyer des e-mails avec JavaScript sans ouvrir le client de messagerie?

J'écris une page HTML avec un bouton d'enregistrement qui devrait simplement envoyer un e-mail en silence sans ouvrir le client de messagerie local. Voici mon HTML:

<form method="post" action="">
    <input type="text" id="email_address" name="name" placeholder="Enter your email address..." required>
    <button onclick="sendMail(); return false">Send Email</button>
</form>

... et voici mon code JavaScript:

<script type="text/javascript">
  function sendMail() {
    var link = 'mailto:[email protected]?subject=Message from '
             +document.getElementById('email_address').value
             +'&body='+document.getElementById('email_address').value;
    window.location.href = link;
}
</script>

Le code ci-dessus fonctionne ... mais il ouvre le client de messagerie local. Si je supprime l'instruction return dans l'attribut onclick comme ceci:

<form method="post" action="">
    <input type="text" id="email_address" name="name" placeholder="Enter your email address..." required>
    <button onclick="sendMail()">Send Email</button>
</form>

... alors l'e-mail n'est pas envoyé du tout. Suis-je en train de manquer quelque chose?

Toute aide serait vraiment appréciée :-)

18
j3d

Vous avez besoin d'un support côté serveur pour y parvenir. Fondamentalement, votre formulaire doit être publié (AJAX est très bien aussi) sur le serveur et ce serveur doit se connecter via SMTP à un fournisseur de messagerie et envoyer cet e-mail.

Même s'il était possible d'envoyer des e-mails directement en utilisant JavaScript (c'est-à-dire depuis l'ordinateur des utilisateurs), l'utilisateur devrait toujours se connecter à un serveur SMTP (comme gmail.com), fournir des informations d'identification SMTP, etc. Ceci est normalement géré sur côté serveur (dans votre application), qui connaît ces informations d'identification.

13
Tomasz Nurkiewicz

Vous ne pouvez pas obliger le navigateur de l'utilisateur à envoyer des e-mails en silence. Ce serait un horrible problème de sécurité car n'importe quel site Web pourrait utiliser son système comme relais de spam et/ou récolter son adresse e-mail.

Vous devez faire une requête HTTP à un processus côté serveur (écrit dans la langue de votre choix) qui envoie le courrier depuis votre serveur.

14
Quentin

Directement à partir du client


Envoyer un e-mail en utilisant uniquement JavaScript

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

Comme ça -

function sendMail() {
    $.ajax({
      type: 'POST',
      url: 'https://mandrillapp.com/api/1.0/messages/send.json',
      data: {
        'key': 'YOUR API KEY HERE',
        'message': {
          'from_email': '[email protected]',
          'to': [
              {
                'email': '[email protected]',
                '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

Remarque: Gardez à l'esprit que votre clé API est visible par n'importe qui, donc tout utilisateur malveillant peut utiliser votre clé pour envoyer des e-mails qui peuvent consommer votre quota.


Indirect via votre serveur - sécurisé


Pour surmonter la vulnérabilité ci-dessus, vous pouvez modifier votre propre serveur pour envoyer l'e-mail après l'authentification basée sur la session.

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

var mandrill = require('node-mandrill')('<your API Key>'); 

function sendEmail ( _name, _email, _subject, _message) {
    mandrill('/messages/send', {
        message: {
            to: [{email: _email , name: _name}],
            from_email: '[email protected]',
            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){

    var _name = req.body.name;
    var _email = req.body.email;
    var _subject = req.body.subject;
    var _messsage = req.body.message;

    //implement your spam protection or checks. 

    sendEmail ( _name, _email, _subject, _message );

});

puis utilisez $ .ajax sur le client pour appeler votre API de messagerie.

7
rahulroy9202

Vous ne pouvez pas le faire uniquement avec le script côté client ... vous pouvez effectuer un appel AJAX à un code côté serveur qui enverra un e-mail ...

4
Ads

Je pense que vous pouvez utiliser smtpjs.com

2
Louis

Il doit y avoir un type de framework backend pour envoyer l'e-mail. Cela peut être fait via PHP/ASP.NET ou avec le client de messagerie local. Si vous voulez que l'utilisateur ne voie rien, la meilleure façon est de puiser dans ceux-ci par un appel AJAX vers un fichier send_email séparé.

1
PlantTheIdea

Vous devez le faire directement sur un serveur. Mais une meilleure façon est d'utiliser PHP. J'ai entendu dire que PHP a un code spécial qui peut envoyer des e-mails directement sans ouvrir le client de messagerie.

0
Tiago Salzmann