Invio di e-mail con Javascript


107

Questo è un po 'complicato da spiegare, quindi abbi pazienza qui ...

Voglio configurare un sistema in cui un utente possa inviare e-mail basate su modelli tramite il mio sito Web, tranne per il fatto che non viene effettivamente inviato utilizzando il mio server, ma apre semplicemente il proprio client di posta locale con un'e-mail pronta per l'uso. L'applicazione riempirà il corpo dell'email con variabili predefinite, per evitare che l'utente debba digitarla da sé. Possono quindi modificare il messaggio come desiderato, se non è esattamente adatto ai loro scopi.

Ci sono una serie di ragioni per cui voglio che vada tramite il client di posta locale dell'utente, quindi fare in modo che il server invii l'email non è un'opzione: deve essere al 100% lato client.

Ho già una soluzione per lo più funzionante e pubblicherò i dettagli come risposta, mi chiedo se esiste un modo migliore?


Risposte:


137

Il modo in cui lo sto facendo ora è fondamentalmente così:

L'HTML:

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

Il 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;
}

Questo, sorprendentemente, funziona piuttosto bene. L'unico problema è che se il corpo è particolarmente lungo (da qualche parte oltre 2000 caratteri), si apre solo una nuova e-mail ma non contiene informazioni. Sospetto che ciò abbia a che fare con il superamento della lunghezza massima dell'URL.


1
Questo è un modo piuttosto indiretto per farlo quando puoi semplicemente impostare l'attributo href sullo stesso contenuto invece di usare javascript.
Ryan Doherty,

1
Non rotonda se vuoi includere il contenuto della textarea nell'email. Anche un buon metodo per nascondere la tua posta elettronica ai raccoglitori di spam.
Gordon Bell

1
@ Gordon, si presume che l'email harvester non esegua il javascript in linea o segua <script src = "">
alex

6
Utilizza preferibilmente encodeURIComponent per eseguire l'escape che segue regole arbitrarie diverse dalla codifica URL. Sebbene i caratteri Unicode abbiano ancora probabilità di fallire ... ma è molto probabile che l'intera cosa fallisca comunque. I collegamenti mailto con parametri sono super inaffidabili e non dovrebbero essere usati.
bobince

5
bobince: sì, ho pensato che fosse un modo losco per farlo, ma qual è l'alternativa?
nickf

17

Ecco come farlo usando jQuery e un "elemento" su cui fare clic:

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

Quindi, puoi ottenere i tuoi contenuti alimentandoli dai campi di input (ad esempio utilizzando $('#input1').val()o da uno script lato server con $.get('...'). Divertiti


Questo è ancora soggetto a limitazioni delle dimensioni dell'URL, proprio come ha menzionato l'OP.
Suncat2000

10

Non hai bisogno di javascript, hai solo bisogno che il tuo href sia codificato in questo modo:

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

Immagino che mi aspettassi che il codice reale inserisse gli indirizzi in modo dinamico.
tvanfosson

@tvanfosson Se gli indirizzi email sono noti nella pagina nel momento in cui si fa clic sull'elemento di ancoraggio, si potrebbe provare a dare all'ancora un ID e ad impostarne il hrefvalore quando vengono scelti gli indirizzi. Se è necessario un post per ottenere gli indirizzi e-mail nel momento in cui si verifica il clic, probabilmente non funzionerebbe.
Micteu

5

Che ne dici di avere una convalida in tempo reale nella casella di testo e una volta che supera 2000 (o qualunque sia la soglia massima), visualizza "Questa email è troppo lunga per essere completata nel browser, per favore <span class="launchEmailClientLink">launch what you have in your email client</span>"

A cui avrei dovuto

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

e jQuery nel tuo onDomReady

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

5

Puoi utilizzare questo servizio gratuito: https://www.smtpjs.com

  1. Includi lo script:

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

  1. Invia un'e-mail utilizzando:
Email.send(
  "from@you.com",
  "to@them.com",
  "This is a subject",
  "this is the body",
  "smtp.yourisp.com",
  "username",
  "password"
);

2
Con questo esponi i dati del tuo server SMTP, è meglio farlo sul lato server con Node o PHP, grazie ugualmente
jcarlosweb

Hai provato il pulsante "Imposta qui un server SMTP"? Puoi trovarlo nel link condiviso nella risposta.
jmojico

2

Se questo aprirà solo il client dell'utente per inviare l'e-mail, perché non lasciare che lo componga anche lì. Perdi la capacità di tenere traccia di ciò che stanno inviando, ma se non è importante, raccogli gli indirizzi e l'oggetto e fai apparire il client per consentire all'utente di riempire il corpo.


1
l'idea era che la mia domanda riempisse il corpo per loro.
Modificherò

1
Ma perché scrivere un client di posta elettronica quando ne apri uno per inviare la posta?
tvanfosson

non è un client di posta elettronica, è solo una pagina del mio sito Web che precompila un messaggio di posta elettronica.
nickf

2

Il problema con l'idea stessa è che l'utente deve avere un client di posta elettronica, il che non è il caso se si affida alle webmail, come nel caso di molti utenti. (almeno non ci sono stati cambiamenti per reindirizzare a questa webmail quando ho indagato sul problema una dozzina di anni fa).

Ecco perché la soluzione normale è affidarsi a php mail () per l'invio di email (lato server, quindi).

Ma se al giorno d'oggi il "client di posta elettronica" è sempre impostato, automaticamente, potenzialmente su un client di webmail, sarò felice di saperlo.


> "Ma se al giorno d'oggi il" client di posta elettronica "è sempre impostato, automaticamente, potenzialmente su un client di webmail, sarò felice di saperlo." ... Questo è supportato dai browser moderni, ad esempio: support.google.com/a/users/answer/9308783?hl=it
nickf

1

Invia richiesta a 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]=mail@7995.by&message[to][0][email]=zdanevich.vitaly@yaa.ru&message[subject]=Заявка%20с%207995.by&message[html]=xxxxxx&key=oxddROOvCpKCp6InvVDqiGw', true);
xhttp.send();

Perché GET e non POST? se il messaggio è abbastanza grande, a un certo punto verrà troncato.
Alexey Shevelyov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.