Envoi d'e-mails avec Javascript

107

C'est un peu déroutant à expliquer, alors supportez-moi ici ...

Je veux mettre en place un système dans lequel un utilisateur peut envoyer des e-mails basés sur des modèles via mon site Web, sauf qu'ils ne sont pas réellement envoyés à l'aide de mon serveur - il ouvre simplement leur propre client de messagerie local avec un e-mail prêt à l'emploi. L'application remplirait le corps de l'e-mail avec des variables prédéfinies, pour éviter que l'utilisateur n'ait à le taper lui-même. Ils peuvent ensuite modifier le message comme ils le souhaitent, s'il ne correspond pas exactement à leurs objectifs.

Il y a un certain nombre de raisons pour lesquelles je veux qu'il passe par le client de messagerie local de l'utilisateur, donc faire envoyer l'e-mail par le serveur n'est pas une option: il doit être à 100% côté client.

J'ai déjà une solution principalement fonctionnelle en cours d'exécution, et je publierai les détails à ce sujet comme réponse, je me demande s'il existe un meilleur moyen?

nickf
la source

Réponses:

137

La façon dont je le fais maintenant est essentiellement comme ceci:

Le HTML:

<textarea id="myText">
    Lorem ipsum...
</textarea>
<button onclick="sendMail(); return false">Send</button>

Le Javascript:

function sendMail() {
    var link = "mailto:[email protected]"
             + "[email protected]"
             + "&subject=" + encodeURIComponent("This is my subject")
             + "&body=" + encodeURIComponent(document.getElementById('myText').value)
    ;
    
    window.location.href = link;
}

Ceci, étonnamment, fonctionne plutôt bien. Le seul problème est que si le corps est particulièrement long (quelque part plus de 2000 caractères), il ouvre simplement un nouvel e-mail mais il ne contient aucune information. Je soupçonne que cela serait lié au dépassement de la longueur maximale de l'URL.

nickf
la source
1
C'est une façon assez détournée de faire cela lorsque vous pouvez simplement définir l'attribut href sur le même contenu au lieu d'utiliser javascript.
Ryan Doherty
1
Pas de rond-point si vous souhaitez inclure le contenu de la zone de texte dans l'e-mail. Aussi une bonne méthode pour cacher votre email aux collecteurs de spam.
Gordon Bell
1
@ Gordon- qui est supposé que le récupérateur d'e-mails ne regex pas le javascript en ligne ou ne suit <script src = "">
alex
6
Utilisez de préférence encodeURIComponent pour échapper, qui suit des règles arbitraires différentes de l'encodage d'URL. Bien que les caractères Unicode soient toujours susceptibles d'échouer ... mais le tout est très susceptible d'échouer de toute façon. Les liens mailto avec des paramètres ne sont pas fiables et ne devraient pas vraiment être utilisés.
bobince
5
bobince: oui, j'ai pensé que c'était une façon douteuse de le faire, mais quelle est l'alternative?
nickf
17

Voici comment procéder en utilisant jQuery et un "élément" sur lequel cliquer:

$('#element').click(function(){
    $(location).attr('href', 'mailto:?subject='
                             + encodeURIComponent("This is my subject")
                             + "&body=" 
                             + encodeURIComponent("This is my body")
    );
});

Ensuite, vous pouvez obtenir votre contenu soit en l'alimentant à partir des champs d'entrée (c'est-à-dire en utilisant $('#input1').val()ou par un script côté serveur avec $.get('...').

Reignier Julien
la source
Ceci est toujours soumis à des limitations de taille d'URL, tout comme l'OP l'a mentionné.
Suncat2000
10

Vous n'avez besoin d'aucun javascript, vous avez juste besoin que votre href soit codé comme ceci:

<a href="mailto:[email protected]">email me here!</a>
Ryan Doherty
la source
Je suppose que je m'attendais à ce que le vrai code remplisse les adresses de manière dynamique.
tvanfosson
@tvanfosson Si les adresses e-mail sont connues sur la page au moment où l'élément d'ancrage est cliqué, vous pouvez essayer de donner à l'ancre un identifiant et de définir sa hrefvaleur lorsque les adresses sont choisies. Si un message est nécessaire pour obtenir les adresses e-mail au moment où le clic se produit, cela ne fonctionnera probablement pas.
Micteu
5

Qu'en est-il d'avoir une validation en direct sur la zone de texte, et une fois qu'elle dépasse 2000 (ou quel que soit le seuil maximal), affichez `` Cet e-mail est trop long pour être complété dans le navigateur, s'il vous plaît <span class="launchEmailClientLink">launch what you have in your email client</span>''

Auquel j'aurais

.launchEmailClientLink {
cursor: pointer;
color: #00F;
}

et jQuery ceci dans votre onDomReady

$('.launchEmailClientLink').bind('click',sendMail);
Alex
la source
5

Vous pouvez utiliser ce service gratuit: https://www.smtpjs.com

  1. Incluez le script:

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

  1. Envoyez un e-mail en utilisant:
Email.send(
  "[email protected]",
  "[email protected]",
  "This is a subject",
  "this is the body",
  "smtp.yourisp.com",
  "username",
  "password"
);
jmojico
la source
2
Avec cela, vous exposez les données de votre serveur SMTP, il est préférable de le faire côté serveur avec Node ou PHP, merci également
jcarlosweb
Avez-vous essayé le bouton "Configurer un serveur SMTP ici"? Vous pouvez le trouver dans le lien partagé dans la réponse.
jmojico
2

Si cela va simplement ouvrir le client de l'utilisateur pour envoyer l'e-mail, pourquoi ne pas le laisser le composer là aussi. Vous perdez la possibilité de suivre ce qu'ils envoient, mais si ce n'est pas important, collectez simplement les adresses et le sujet et affichez le client pour permettre à l'utilisateur de remplir le corps.

Tvanfosson
la source
1
l'idée était que mon application remplisse le corps pour eux. Je vais éditer la question pour rendre cela plus clair ...
nickf
1
Mais pourquoi écrire un client de messagerie alors que vous allez simplement en ouvrir un pour envoyer le courrier?
tvanfosson
ce n'est pas un client de messagerie, c'est juste une page de mon site Web qui préremplit un message électronique.
nickf
2

Le problème avec l'idée même est que l'utilisateur doit avoir un client de messagerie, ce qui n'est pas le cas s'il se fie aux webmails, ce qui est le cas de nombreux utilisateurs. (au moins, il n'y a pas eu de changement pour rediriger vers ce webmail lorsque j'ai enquêté sur le problème il y a une douzaine d'années).

C'est pourquoi la solution normale est de s'appuyer sur php mail () pour l'envoi d'e-mails (côté serveur, donc).

Mais si de nos jours "client de messagerie" est toujours défini, automatiquement, potentiellement sur un client de messagerie Web, je serai heureux de le savoir.

Fabrice NEYRET
la source
1
> "Mais si de nos jours" client de messagerie "est toujours paramétré, automatiquement, potentiellement sur un client de messagerie Web, je serai heureux de le savoir." ... Ceci est pris en charge par les navigateurs modernes, par exemple: support.google.com/a/users/answer/9308783?hl=en
nickf
1

Envoyez la demande à mandrillapp.com :

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
        console.log(xhttp.responseText);
    }
}
xhttp.open('GET', 'https://mandrillapp.com/api/1.0/messages/send.json?message[from_email][email protected]&message[to][0][email][email protected]&message[subject]=Заявка%20с%207995.by&message[html]=xxxxxx&key=oxddROOvCpKCp6InvVDqiGw', true);
xhttp.send();
Vitaly Zdanevich
la source
Pourquoi GET et non POST? si le message est assez gros, il sera tronqué à un moment donné.
Alexey Shevelyov