ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.
function* myGenerator() {
const callback = yield;
let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
console.log("response is:", response);
// examples of other things you can do
yield setTimeout(callback, 1000);
console.log("it delayed for 1000ms");
while (response.statusText === "error") {
[response] = yield* anotherGenerator();
}
}
Для запуска вышеуказанного кода вы делаете это:
const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function
Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.
Обратный вызов ...args
завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :
const [err, data] = yield fs.readFile(filePath, "utf-8", callback);
Вы не можете отправить электронное письмо непосредственно с помощью javascript.
Однако вы можете открыть почтовый клиент пользователя:
window.open('mailto:test@example.com');
Также есть некоторые параметры, заполните тему и тело:
window.open('mailto:test@example.com?subject=subject&body=body');
Еще одно решение - сделать вызов ajax на ваш сервер, чтобы сервер отправил электронное письмо. Будьте осторожны, чтобы никто не мог отправлять какие-либо письма через ваш сервер.
На ваш вопрос нет прямого ответа, поскольку мы не можем отправлять электронную почту только с помощью javascript, но есть способы использовать javascript для отправки писем нам:
1), используя api to и call api через javascript для отправки электронной почты для нас, например https://www.emailjs.com говорит, что вы можете использовать такой код ниже, чтобы вызвать их api после некоторой настройки:
var service_id = 'my_mandrill';
var template_id = 'feedback';
var template_params = {
name: 'John',
reply_email: 'john@doe.com',
message: 'This is awesome!'
};
emailjs.send(service_id,template_id,template_params);
2) создайте код для отправки электронной почты для вас, вы можете использовать любую базовую инфраструктуру, чтобы сделать это за вас.
3) используя что-то вроде:
window.open('mailto:me@http://stackoverflow.com/');
, которое откроет ваше почтовое приложение, это может попасть в заблокированное всплывающее окно вашего браузера.
отправка электронной почты - это задача сервера, поэтому это должно быть сделано на бэкэнд-языках, но мы можем использовать javascript для сбора необходимых данных и отправки их на сервер или api, также мы можем использовать приложение с трем паритетами и открывать их через браузер используя javascript, как указано выше.
Отправьте электронное письмо с помощью JavaScript или jQuery
var ConvertedFileStream;
var g_recipient;
var g_subject;
var g_body;
var g_attachmentname;
function SendMailItem(p_recipient, p_subject, p_body, p_file, p_attachmentname, progressSymbol) {
// Email address of the recipient
g_recipient = p_recipient;
// Subject line of an email
g_subject = p_subject;
// Body description of an email
g_body = p_body;
// attachments of an email
g_attachmentname = p_attachmentname;
SendC360Email(g_recipient, g_subject, g_body, g_attachmentname);
}
function SendC360Email(g_recipient, g_subject, g_body, g_attachmentname) {
var flag = confirm('Would you like continue with email');
if (flag == true) {
try {
//p_file = g_attachmentname;
//var FileExtension = p_file.substring(p_file.lastIndexOf(".") + 1);
// FileExtension = FileExtension.toUpperCase();
//alert(FileExtension);
SendMailHere = true;
//if (FileExtension != "PDF") {
// if (confirm('Convert to PDF?')) {
// SendMailHere = false;
// }
//}
if (SendMailHere) {
var objO = new ActiveXObject('Outlook.Application');
var objNS = objO.GetNameSpace('MAPI');
var mItm = objO.CreateItem(0);
if (g_recipient.length > 0) {
mItm.To = g_recipient;
}
mItm.Subject = g_subject;
// if there is only one attachment
// p_file = g_attachmentname;
// mAts.add(p_file, 1, g_body.length + 1, g_attachmentname);
// If there are multiple attachment files
//Split the files names
var arrFileName = g_attachmentname.split(";");
// alert(g_attachmentname);
//alert(arrFileName.length);
var mAts = mItm.Attachments;
for (var i = 0; i < arrFileName.length; i++)
{
//alert(arrFileName[i]);
p_file = arrFileName[i];
if (p_file.length > 0)
{
//mAts.add(p_file, 1, g_body.length + 1, g_attachmentname);
mAts.add(p_file, i, g_body.length + 1, p_file);
}
}
mItm.Display();
mItm.Body = g_body;
mItm.GetInspector.WindowState = 2;
}
//hideProgressDiv();
} catch (e) {
//debugger;
//hideProgressDiv();
alert('Unable to send email. Please check the following: \n' +
'1. Microsoft Outlook is installed.\n' +
'2. In IE the SharePoint Site is trusted.\n' +
'3. In IE the setting for Initialize and Script ActiveX controls not marked as safe is Enabled in the Trusted zone.');
}
}
}
Кажется, на горизонте появилось новое решение. Он называется EmailJS . Они утверждают, что серверный код не требуется. Вы можете запросить приглашение.
Обновить август 2016: EmailJS, похоже, уже жив. Вы можете бесплатно отправлять до 200 писем в месяц и предлагает подписку на более высокие объемы.
JavaScript не может отправлять электронную почту из веб-браузера. Однако, отступив от решения, которое вы уже пытались реализовать, вы можете сделать то, что соответствует исходному требованию:
отправить сообщение без обновления страницы
blockquote>Вы можете использовать JavaScript для создания значений, которые будут нужны электронной почте, а затем сделать запрос AJAX к серверному ресурсу, который фактически отправит электронное письмо.
Если вы не знакомы с AJAX, быстрый поиск в Google даст вам информацию о том, какие серверные языки / технологии вы используете, так что ваша часть зависит от вас. много информации. Как правило, вы можете быстро запустить его и запустить с помощью функции $ .ajax () jQuery. Вам просто нужно иметь страницу на сервере, которая может быть вызвана в запросе.
Javascript - это клиентская сторона, вы не можете отправлять электронную почту с помощью Javascript. Браузер распознает, может быть, только mailto:
и запускает почтовый клиент по умолчанию.
Другим способом отправки электронной почты из JavaScript является использование directtomx.com следующим образом:
Email = {
Send : function (to,from,subject,body,apikey)
{
if (apikey == undefined)
{
apikey = Email.apikey;
}
var nocache= Math.floor((Math.random() * 1000000) + 1);
var strUrl = "http://directtomx.azurewebsites.net/mx.asmx/Send?";
strUrl += "apikey=" + apikey;
strUrl += "&from=" + from;
strUrl += "&to=" + to;
strUrl += "&subject=" + encodeURIComponent(subject);
strUrl += "&body=" + encodeURIComponent(body);
strUrl += "&cachebuster=" + nocache;
Email.addScript(strUrl);
},
apikey : "",
addScript : function(src){
var s = document.createElement( 'link' );
s.setAttribute( 'rel', 'stylesheet' );
s.setAttribute( 'type', 'text/xml' );
s.setAttribute( 'href', src);
document.body.appendChild( s );
}
};
Затем вызовите его со своей страницы следующим образом:
window.onload = function(){
Email.apikey = "-- Your api key ---";
Email.Send("to@domain.com","from@domain.com","Sent","Worked!");
}
window.open ( 'электронной почты: test@example.com'); как указано выше, ничего не дает скрыть адрес электронной почты test@example.com от сбора спам-ботов. Я постоянно сталкивался с этой проблемой.
var recipient="test";
var at = String.fromCharCode(64);
var dotcom="example.com";
var mail="mailto:";
window.open(mail+recipient+at+dotcom);
В вашей функции sendMail()
добавьте вызов ajax на ваш сервер, где вы можете реализовать это на стороне сервера.
Кажется, что один «ответ» на это заключается в реализации клиента SMPT. См. email.js для библиотеки JavaScript с SMTP-клиентом.
Ниже приведен репозиторий GitHub для SMTP-клиента. Основываясь на README репо, кажется, что в зависимости от клиентского браузера может потребоваться множество прокладок или полиполков, но в целом это, безусловно, представляется выполнимым (если не реально значительно достигнутым), тем не менее, это легко описывается даже разумно, длинный ответ здесь.
Короткий ответ заключается в том, что вы не можете сделать это, используя только JavaScript. Вам понадобится обработчик на стороне сервера для подключения к SMTP-серверу для фактической отправки почты. Есть много простых почтовых скриптов в Интернете, таких как этот для PHP:
Используйте Ajax для отправки запроса на PHP-скрипт, убедитесь, что обязательное поле не пусто или неверно, используя js, также сохраняйте запись отправки почты кем с вашего сервера.
function sendMail() is good for doing that.
Проверьте, не была ли обнаружена ошибка при отправке почты с вашего скрипта и принятия соответствующих мер. Для его устранения, например, если неправильный адрес электронной почты или почта не отправляется из-за проблемы с сервером или она находится в очереди в таком состоянии, немедленно сообщите об этом пользователю и не позволяйте повторной отправке одного и того же адреса электронной почты снова и снова. Получите ответ от вашего скрипта. Используя jQuery GET и POST
$. Get (URL, callback); $ .post (URL, обратный вызов);
blockquote>
Непрямой через ваш сервер - вызов стороннего API - безопасный и рекомендуемый
. После правильной авторизации и авторизации ваш сервер может вызывать сторонний API. Ключи API не отображаются клиенту.
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: '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){
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 );
});
, а затем использовать для вызова API электронной почты $ .ajax на клиенте.
Непосредственно от клиента - вызов API сторонней стороны - не рекомендуется
Отправьте электронное письмо, используя только JavaScript
in short:
1. register for Mandrill to get an API key
2. load jQuery
3. use $.ajax to send an email
Нравится это -
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
Примечание. Имейте в виду, что ваш ключ API виден всем, поэтому любой злоумышленник может использовать ваш ключ для отправки сообщений электронной почты, которые могут съесть вашу квоту.
Вы можете найти, что помещать внутри функции JavaScript в этом сообщении.
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));
}
}
Предоставьте собственный скрипт PHP (или любой другой язык) для отправки электронной почты.
function send() {
setTimeout(function() {
window.open("mailto:" + document.getElementById('email').value + "?subject=" + document.getElementById('subject').value + "&body=" + document.getElementById('message').value);
}, 320);
}
input {
text-align: center;
border-top: none;
border-right: none;
border-left: none;
height: 10vw;
font-size: 2vw;
width: 100vw;
}
textarea {
text-align: center;
border-top: none;
border-right: none;
border-left: none;
border-radius: 5px;
width: 100vw;
height: 50vh;
font-size: 2vw;
}
button {
border: none;
background-color: white;
position: fixed;
right: 5px;
top: 5px;
transition: transform .5s;
}
input:focus {
outline: none;
color: orange;
border-radius: 3px;
}
textarea:focus {
outline: none;
color: orange;
border-radius: 7px;
}
button:focus {
outline: none;
transform: scale(0);
transform: rotate(360deg);
}
<!DOCTYPE html>
<html>
<head>
<title>Send Email</title>
</head>
<body align=center>
<input id="email" type="email" placeholder="yourfreind@something.somthing"></input><br><br>
<input id="subject" placeholder="Subject"></input><br>
<textarea id="message" placeholder="Message"></textarea><br>
<button id="send" onclick="send()"><img src=https://www.dropbox.com/s/chxcszvnrdjh1zm/send.png?dl=1 width=50px height=50px></img></button>
</body>
</html>
Существует комбинированная услуга. Вы можете комбинировать перечисленные выше решения, такие как мандрилл, с сервисом EmailJS, который может сделать систему более безопасной. Тем не менее, они еще не начали службу.
Поскольку все это замечательная информация, есть небольшая api, называемая Mandrill для отправки писем с javascript, и она отлично работает. Вы можете дать ему шанс. Вот несколько учебник для начала.
Я разорву эту новость вам. Вы НЕ МОЖЕТЕ послать электронное письмо с помощью JavaScript как такового.
Исходя из контекста вопроса OP, мой ответ выше не выдерживает больше, как указано в комментариях @KennyEvitt. Похоже, вы можете использовать JavaScript в качестве SMTP-клиента .
Однако я еще не углублялся, чтобы узнать, безопасно ли оно и amp; совместим с кросс-браузером. Поэтому я не могу ни поощрять, ни препятствовать вам использовать его. Используйте на свой страх и риск.
Я бы сделал это с библиотекой SMTPJs . Он предлагает шифрование для ваших учетных данных, таких как имя пользователя, пароль и т. д.
Я не мог найти ответ, который действительно удовлетворял исходный вопрос.
Я собрал простой бесплатный сервис, который позволяет вам сделать стандартный запрос HTTP POST для отправки электронной почты. , Он называется PostMail , и вы можете просто отправить форму, использовать Javascript или jQuery. Когда вы регистрируетесь, он предоставляет вам код, который вы можете скопировать & amp; вставьте на свой сайт. Вот несколько примеров:
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>
Опять же, при полном раскрытии, я создал эту услугу, потому что я не мог найти подходящий ответ.