Надсилання електронних листів за допомогою Javascript


107

Це трохи заплутано для пояснення, тож потерпіть зі мною тут ...

Я хочу створити систему, де користувач може надсилати шаблонні електронні листи через мій веб-сайт, за винятком того, що він фактично не надсилається за допомогою мого сервера - він натомість просто відкриває власний локальний поштовий клієнт з електронною поштою, готовою до роботи. Додаток заповнює тіло електронної пошти заздалегідь визначеними змінними, щоб врятувати користувачеві необхідність вводити його самостійно. Потім вони можуть редагувати повідомлення за бажанням, якщо воно не відповідає їх цілям.

З кількох причин я хочу, щоб він перейшов через локальний поштовий клієнт користувача, тому отримання сервера для надсилання електронної пошти не є варіантом: він повинен бути на 100% стороні клієнта.

У мене вже працює в основному працююче рішення, і деталі цього повідомлення я опублікую як відповідь, мені цікаво, чи є кращий спосіб?


Відповіді:


137

Те, що я роблю зараз, це в основному так:

HTML:

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

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

Це, на диво, працює досить добре. Єдина проблема полягає в тому, що якщо тіло особливо довге (десь понад 2000 символів), воно просто відкриває нове повідомлення електронної пошти, але інформації в ньому немає. Я підозрюю, що це стосується перевищення максимальної довжини URL-адреси.


1
Це досить обхідний спосіб зробити це, коли ви можете просто встановити атрибут href на той самий вміст, а не використовувати JavaScript.
Райан Дохерті

1
Не обхідне, якщо ви хочете включити вміст текстової області в електронний лист. Також хороший спосіб приховати свою електронну пошту від спам-комбайнів.
Гордон Белл

1
@ Gordon - припускається, що комбайн електронної пошти не переробляє вбудований javascript і не слідує за <script src = "">
alex

6
Надайте перевагу encodeURIComponent, щоб уникнути, який дотримується довільних правил, відмінних від кодування URL. Хоча символи Unicode все ще можуть вийти з ладу ... але тоді вся справа, швидше за все, вийде з ладу. посилання поштового зв’язку з параметрами є надто ненадійними і не повинні їх реально використовувати.
bobince

5
bobince: так, я подумав, що це хитрий спосіб зробити це, але яка альтернатива?
nickf

17

Ось як це зробити за допомогою jQuery та "елемента" для натискання на:

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

Потім, ви можете отримати вміст або шляхом подачі його з поля введення (тобто. З використанням $('#input1').val()або на стороні сервера скрипт з $.get('...'). Удачі


Це все ще обмежується обмеженням розміру URL-адреси, як згадувала ОП.
Suncat2000

10

Вам не потрібен Javascript, вам просто потрібен ваш href, щоб бути закодованим так:

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

Напевно, я очікував, що справжній код буде заповнюватися адресами динамічно.
tvanfosson

@tvanfosson Якщо адреси електронної пошти відомі на сторінці під час натискання елемента прив’язки, ви можете спробувати надати якоря ідентифікатор і встановити його hrefзначення, коли вибираються адреси. Якщо публікація потрібна для отримання електронних адрес під час натискання, це, ймовірно, не буде працювати.
Міктей

5

А як щодо того, щоб у вашому текстовому вікні була перевірка живої перевірки, і як тільки вона перевищить 2000 (або будь-який максимальний поріг), тоді відобразиться "Цей електронний лист занадто довгий, щоб заповнити його в браузері, будь ласка <span class="launchEmailClientLink">launch what you have in your email client</span>"

До якого я мав би

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

і jQuery це у ваш onDomReady

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

5

Ви можете скористатися цим безкоштовним сервісом: https://www.smtpjs.com

  1. Включіть сценарій:

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

  1. Надіслати електронний лист за допомогою:
Email.send(
  "from@you.com",
  "to@them.com",
  "This is a subject",
  "this is the body",
  "smtp.yourisp.com",
  "username",
  "password"
);

2
Завдяки цьому ви відкриваєте дані свого SMTP-сервера. Найкраще це робити на стороні сервера за допомогою Node або PHP, однаково дякую
jcarlosweb

Ви спробували кнопку "Налаштувати SMTP-сервер тут"? Ви можете знайти його за посиланням, яке поділилося у відповіді.
jmojico

2

Якщо це просто відкриє клієнтові користувача для надсилання електронного листа, чому б не дозволити їм також його скласти. Ви втрачаєте можливість відстежувати, що вони надсилають, але якщо це не важливо, то просто збирайте адреси та тему та спливає клієнт, щоб користувач міг заповнити тіло.


1
ідея полягала в тому, що моя заява наповнює організм для них. Я відредагую питання, щоб зробити це зрозумілішим ...
nickf

1
Але навіщо писати клієнта електронної пошти, коли ви просто збираєтесь відкрити його, щоб надіслати пошту?
tvanfosson

це не клієнт електронної пошти, це лише сторінка на моєму веб-сайті, яка попередньо заповнює повідомлення електронної пошти.
nickf

2

Проблема самої ідеї полягає в тому, що користувач повинен мати клієнт електронної пошти, а це не так, якщо він покладається на веб-пошти, що стосується багатьох користувачів. (принаймні, не було повороту для переадресації на цю веб-пошту, коли я досліджував цю проблему десяток років тому).

Ось чому нормальним рішенням є посилання на php mail () для надсилання електронних листів (тоді на стороні сервера).

Але якщо в наш час "електронний клієнт" завжди встановлюється автоматично, потенційно, клієнтом веб-пошти, я буду радий знати.


> "Але якщо в наш час" електронний клієнт "завжди встановлюється автоматично, потенційно, клієнтом веб-пошти, я буду радий знати." ... Це підтримується сучасними браузерами, наприклад: support.google.com/a/users/answer/9308783?hl=uk
nickf

1

Надішліть запит на 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();

Чому ПОЛУЧИТИ, а не POST? якщо повідомлення досить велике, воно буде врізане в якийсь момент.
Олексій Шевельов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.