117 votes

Envoi d'e-mails avec Javascript

C'est un peu confus à expliquer, alors soyez indulgent avec moi...

Je veux mettre en place un système permettant à un utilisateur d'envoyer des courriels modèles par l'intermédiaire de mon site Web, sauf qu'ils ne sont pas réellement envoyés par mon serveur - ils ouvrent simplement leur propre client de messagerie local avec un courriel prêt à être envoyé. L'application remplit le corps de l'e-mail avec des variables prédéfinies, pour éviter à l'utilisateur de devoir les taper lui-même. Il peut ensuite modifier le message à sa guise, s'il ne correspond pas exactement à ses besoins.

Pour un certain nombre de raisons, je souhaite que l'envoi se fasse par le biais du client de messagerie local de l'utilisateur. Il n'est donc pas possible de faire en sorte que le serveur envoie le courrier électronique : l'envoi doit se faire à 100 % côté client.

J'ai déjà une solution qui fonctionne pour l'essentiel et j'en publierai les détails dans ma réponse. Je me demande s'il existe une meilleure solution ?

1 votes

151voto

nickf Points 185423

La façon dont je le fais maintenant est essentiellement la suivante :

Le HTML :

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

Le Javascript :

function sendMail() {
    var link = "mailto:me@example.com"
             + "?cc=myCCaddress@example.com"
             + "&subject=" + encodeURIComponent("This is my subject")
             + "&body=" + encodeURIComponent(document.getElementById('myText').value)
    ;

    window.location.href = link;
}

Cela, étonnamment, fonctionne plutôt bien. Le seul problème est que si le corps du message est particulièrement long (plus de 2000 caractères), un nouvel e-mail s'ouvre, mais il ne contient aucune information. Je pense que c'est dû au fait que la longueur maximale de l'URL est dépassée.

1 votes

Il s'agit d'un moyen assez détourné de le faire, alors que vous pouvez simplement définir l'attribut href sur le même contenu au lieu d'utiliser le javascript.

1 votes

Pas détourné si vous voulez inclure le contenu de la zone de texte dans l'e-mail. C'est aussi une bonne méthode pour cacher votre courriel aux moissonneurs de spam.

1 votes

@Gordon- cela suppose que le collecteur d'emails ne regexe pas le javascript en ligne ou ne suit pas <script src="">.

20voto

Reignier Julien Points 81

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 de champs de saisie (c'est-à-dire en utilisant la fonction $('#input1').val() ou par un script côté serveur avec $.get('...') . Amusez-vous bien

1 votes

Cela reste soumis aux limitations de taille des URL, comme l'a mentionné le PO.

0 votes

Je veux juste savoir que, ça prend du temps quand on appuie sur le bouton d'envoi ?

15voto

Ryan Doherty Points 16448

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

<a href="mailto:me@me.com">email me here!</a>

1 votes

Je suppose que je m'attendais à ce que le code réel remplisse les adresses de façon dynamique.

0 votes

@tvanfosson Si les adresses électroniques sont connues sur la page au moment où l'on clique sur l'élément d'ancrage, vous pourriez essayer de donner un ID à l'ancre et de définir son href lorsque les adresses sont choisies. Si un message est nécessaire pour obtenir les adresses électroniques au moment où le clic se produit, cela ne fonctionnera probablement pas.

0 votes

Sur Mac : target="_blank" est également nécessaire

5voto

alex Points 186293

Que diriez-vous d'avoir une validation en direct de la zone de texte, et une fois qu'elle dépasse 2000 (ou le seuil maximum), d'afficher "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> '

A quoi j'aurais répondu

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

et jQuery ce dans votre onDomReady

$('.launchEmailClientLink').bind('click',sendMail);

3voto

tvanfosson Points 268301

Si cela ne sert qu'à ouvrir le client de l'utilisateur pour envoyer l'e-mail, pourquoi ne pas les laisser le composer là aussi. Vous perdez la possibilité de suivre ce qu'ils envoient, mais si ce n'est pas important, il suffit de recueillir les adresses et l'objet et d'ouvrir le client pour laisser l'utilisateur remplir le corps du message.

2 votes

L'idée était que mon application remplisse le corps pour eux. Je vais modifier la question pour que ce soit plus clair...

2 votes

Mais pourquoi écrire un client de messagerie si vous vous contentez d'en ouvrir un pour envoyer le courrier ?

1 votes

Ce n'est pas un client de messagerie, c'est juste une page de mon site web qui pré-remplit un message électronique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X