Gửi email bằng Javascript


107

Điều này hơi khó hiểu để giải thích, vì vậy hãy chịu đựng với tôi ở đây ...

Tôi muốn thiết lập một hệ thống nơi người dùng có thể gửi email mẫu qua trang web của tôi, ngoại trừ nó không thực sự được gửi bằng máy chủ của tôi - thay vào đó nó chỉ mở ra ứng dụng thư cục bộ của riêng họ với một email đã sẵn sàng. Ứng dụng sẽ điền vào nội dung của email với các biến được xác định trước, để tiết kiệm việc người dùng phải tự nhập nó. Sau đó, họ có thể chỉnh sửa tin nhắn như mong muốn, nếu nó không hoàn toàn phù hợp với mục đích của họ.

Có một số lý do tôi muốn nó đi qua ứng dụng thư cục bộ của người dùng, vì vậy việc yêu cầu máy chủ gửi email không phải là một lựa chọn: nó phải là 100% phía máy khách.

Tôi đã có một giải pháp gần như hiệu quả đang chạy và tôi sẽ đăng chi tiết về điều đó như một câu trả lời, tôi đang tự hỏi liệu có cách nào tốt hơn không?


Câu trả lời:


137

Cách tôi đang làm về cơ bản là như sau:

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

Điều này, đáng ngạc nhiên, hoạt động khá tốt. Vấn đề duy nhất là nếu phần nội dung đặc biệt dài (khoảng hơn 2000 ký tự), thì nó chỉ mở ra một email mới nhưng không có thông tin trong đó. Tôi nghi ngờ rằng điều đó xảy ra với độ dài tối đa của URL bị vượt quá.


1
Đây là một cách làm khá vòng vo khi bạn chỉ có thể đặt thuộc tính href cho cùng một nội dung thay vì sử dụng javascript.
Ryan Doherty

1
Không vòng vo nếu bạn muốn đưa nội dung của vùng văn bản vào email. Cũng là một phương pháp tốt để ẩn email của bạn khỏi những kẻ thu thập thư rác.
Gordon Bell,

1
@ Gordon- điều đó được giả định là trình thu thập email không regex javascript nội tuyến hoặc làm theo <script src = "">
alex

6
Sử dụng encodeURIComponent theo sở thích để thoát tuân theo các quy tắc tùy ý khác với mã hóa URL. Mặc dù các ký tự Unicode vẫn có khả năng bị lỗi ... nhưng dù sao thì toàn bộ điều rất có thể sẽ bị lỗi. các liên kết mailto với các tham số là siêu không đáng tin cậy và không thực sự nên được sử dụng.
bobince

5
bobince: vâng, tôi nghĩ rằng đó là một cách làm khó, nhưng đâu là cách thay thế?
nickf

17

Đây là cách thực hiện bằng cách sử dụng jQuery và một "phần tử" để nhấp vào:

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

Sau đó, bạn có thể lấy nội dung của mình bằng cách cấp nó từ các trường đầu vào (tức là bằng cách sử dụng $('#input1').val()hoặc bằng tập lệnh phía máy chủ với $.get('...'). Chúc vui vẻ


Điều này vẫn còn bị giới hạn về kích thước URL, như OP đã đề cập.
Suncat2000

10

Bạn không cần bất kỳ javascript nào, bạn chỉ cần href được mã hóa như sau:

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

Tôi đoán rằng tôi đã mong đợi rằng mã thực được điền động vào các địa chỉ.
tvanfosson

@tvanfosson Nếu các địa chỉ email được biết đến trên trang vào thời điểm phần tử neo được nhấp vào, bạn có thể thử cấp cho anchor một ID và đặt hrefgiá trị của nó khi các địa chỉ được chọn. Nếu cần một bài đăng để lấy địa chỉ email tại thời điểm nhấp chuột xảy ra, điều này có thể sẽ không hoạt động.
Micteu

5

Còn việc xác thực trực tiếp trên hộp văn bản thì sao, và khi nó vượt quá 2000 (hoặc bất kể ngưỡng tối đa là bao nhiêu) thì hiển thị 'Email này quá dài để hoàn thành trong trình duyệt, vui lòng <span class="launchEmailClientLink">launch what you have in your email client</span>'

Mà tôi muốn có

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

và jQuery này vào onDomReady của bạn

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

5

Bạn có thể sử dụng dịch vụ miễn phí này: https://www.smtpjs.com

  1. Bao gồm tập lệnh:

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

  1. Gửi email bằng:
Email.send(
  "from@you.com",
  "to@them.com",
  "This is a subject",
  "this is the body",
  "smtp.yourisp.com",
  "username",
  "password"
);

2
Với điều này bạn tiếp xúc với các dữ liệu của máy chủ SMTP của bạn, Cách tốt nhất để làm điều đó ở phía máy chủ với Node hoặc PHP, nhờ không kém
jcarlosweb

Bạn đã thử nút "Thiết lập máy chủ SMTP tại đây" chưa? Bạn có thể tìm thấy nó trong liên kết được chia sẻ trong câu trả lời.
jmojico

2

Nếu điều này chỉ để mở ứng dụng khách của người dùng để gửi email, tại sao không để họ soạn email ở đó. Bạn mất khả năng theo dõi những gì họ đang gửi, nhưng nếu điều đó không quan trọng, thì bạn chỉ cần thu thập địa chỉ và chủ đề và bật lên máy khách để người dùng điền vào nội dung.


1
ý tưởng là ứng dụng của tôi lấp đầy phần nội dung cho chúng. Tôi sẽ chỉnh sửa câu hỏi để làm cho điều đó rõ ràng hơn ...
nickf

1
Nhưng tại sao phải viết một ứng dụng email khi bạn chỉ định mở một ứng dụng để gửi thư?
tvanfosson

nó không phải là một ứng dụng email, nó chỉ là một trang trên trang web của tôi có chứa một email.
nickf

2

Vấn đề với ý tưởng chính là người dùng phải có một ứng dụng email khách, điều này không xảy ra nếu anh ta dựa vào webmail, đó là trường hợp của nhiều người dùng. (ít nhất là không có lượt chuyển hướng nào đến webmail này khi tôi điều tra vấn đề cách đây hàng chục năm).

Đó là lý do tại sao giải pháp thông thường là dựa vào php mail () để gửi email (sau đó là phía máy chủ).

Nhưng nếu ngày nay "ứng dụng email khách" luôn được đặt, tự động, có khả năng là ứng dụng khách webmail, tôi rất vui được biết.


> "Nhưng nếu ngày nay" ứng dụng email khách "luôn được đặt, tự động, có khả năng là ứng dụng khách webmail, tôi rất vui được biết." ... Điều này được hỗ trợ bởi các trình duyệt hiện đại, ví dụ: support.google.com/a/users/answer/9308783?hl=vi
nickf

1

Gửi yêu cầu đến 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();

Tại sao NHẬN mà không ĐĂNG? nếu tin nhắn đủ lớn, nó sẽ bị cắt bớt vào một lúc nào đó.
Alexey Shevelyov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.