Javascript ile e-posta gönderme


107

Bunu açıklamak biraz kafa karıştırıcı, bu yüzden benimle burada kalın ...

Bir kullanıcının web sitem aracılığıyla şablonlu e-postalar gönderebileceği bir sistem kurmak istiyorum, ancak bunun aslında sunucum kullanılarak gönderilmemesi dışında - bunun yerine, gitmeye hazır bir e-posta ile kendi yerel posta istemcisini açar. Uygulama, e-postanın gövdesini önceden tanımlanmış değişkenlerle doldurarak kullanıcının kendi yazması gerekliliğini ortadan kaldırır. Daha sonra, amaçlarına tam olarak uymaması durumunda mesajı istedikleri gibi düzenleyebilirler.

Kullanıcının yerel posta istemcisi aracılığıyla gitmesini istememin birkaç nedeni var, bu nedenle sunucunun e-postayı göndermesini sağlamak bir seçenek değil:% 100 istemci tarafı olmalı.

Halihazırda çalışan çoğunlukla çalışan bir çözümüm var ve bunun ayrıntılarını bir cevap olarak göndereceğim, daha iyi bir yol olup olmadığını merak ediyorum.


Yanıtlar:


137

Bunu şu an yapma şeklim temelde şöyle:

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

Bu şaşırtıcı bir şekilde oldukça iyi çalışıyor. Tek sorun, eğer gövde özellikle uzunsa (2000 karakterden fazla bir yerde), o zaman yeni bir e-posta açar, ancak içinde bilgi yoktur. URL'nin maksimum uzunluğunun aşılmasıyla ilgili olacağından şüpheleniyorum.


1
Bu, javascript kullanmak yerine aynı içeriğe href özniteliğini ayarlayabildiğiniz zaman, bunu yapmanın oldukça dolambaçlı bir yoludur.
Ryan Doherty

1
Metin alanının içeriğini e-postaya dahil etmek istiyorsanız döner kavşak değil. Ayrıca e-postanızı spam toplayıcılardan gizlemek için iyi bir yöntem.
Gordon Bell

1
@ Gordon - bu, e-posta toplayıcının javascript'i satır içi olarak yeniden yazmadığı veya <script src = ""> izlemediği varsayılır
alex

6
URL kodlamasından farklı keyfi kuralları izleyen çıkış yapmak için tercihen encodeURIComponent kullanın. Unicode karakterlerinin hala başarısız olma olasılığı yüksek olsa da ... ancak her şey yine de büyük olasılıkla başarısız olacaktır. Parametreli mailto bağlantıları son derece güvenilmezdir ve gerçekten kullanılmamalıdır.
bobince

5
bobince: evet bunu yapmanın tehlikeli bir yolu olduğunu düşündüm, ama alternatifi nedir?
nickf

17

Bunu jQuery ve tıklamak için bir "öğe" kullanarak yapmanın yolu:

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

Ardından, içeriğinizi ya giriş alanlarından besleyerek (yani kullanarak $('#input1').val()ya da sunucu tarafı komut dosyası ile $.get('...').


Bu, OP'nin bahsettiği gibi hala URL boyutu sınırlamalarına tabidir.
Suncat2000

10

Herhangi bir javascript'e ihtiyacınız yok, sadece href'inizin şu şekilde kodlanmasına ihtiyacınız var:

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

Sanırım gerçek kodun adreslere dinamik olarak girmesini bekliyordum.
tvanfosson

@tvanfosson Çapa öğesi tıklandığında sayfada e-posta adresleri biliniyorsa, bağlantıya bir kimlik vermeyi hrefve adresler seçildiğinde değerini ayarlamayı deneyebilirsiniz . Tıklama gerçekleştiğinde e-posta adreslerini almak için bir gönderi gerekiyorsa, bu muhtemelen işe yaramayacaktır.
Micteu

5

Metin kutusunda canlı bir doğrulama olmasına ve 2000'in üzerine çıktıktan sonra (veya maksimum eşik ne olursa olsun) sonra 'Bu e-posta tarayıcıda tamamlanamayacak kadar uzun, lütfen <span class="launchEmailClientLink">launch what you have in your email client</span>' ifadesini görüntüleyin.

Sahip olacağım

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

ve bunu onDomReady cihazınıza jQuery yapın

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

5

Bu ücretsiz hizmeti kullanabilirsiniz: https://www.smtpjs.com

  1. Komut dosyasını ekleyin:

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

  1. Şunları kullanarak bir e-posta gönderin:
Email.send(
  "from@you.com",
  "to@them.com",
  "This is a subject",
  "this is the body",
  "smtp.yourisp.com",
  "username",
  "password"
);

2
Bununla, SMTP sunucunuzun verilerini açığa
çıkarırsınız

"Burada bir SMTP sunucusu kur" düğmesini denediniz mi? Cevapta paylaşılan bağlantıda bulabilirsiniz.
jmojico

2

Bu sadece kullanıcının istemcisini e-postayı göndermeye açacaksa, neden orada da oluşturmalarına izin vermiyorsunuz? Ne gönderdiklerini izleme yeteneğini kaybedersiniz, ancak bu önemli değilse, o zaman adresleri ve konuyu toplayın ve kullanıcının gövdeyi doldurmasına izin vermek için istemciyi açın.


1
fikir, başvurumun onlar için gövdeyi doldurmasıydı. Bunu daha net hale getirmek için soruyu düzenleyeceğim ...
nickf

1
Ama postayı göndermek için sadece birini açarken neden bir e-posta istemcisi yazasınız?
tvanfosson

Bu bir e-posta istemcisi değil, web sitemde bir e-posta mesajını önceden dolduran bir sayfadır.
nickf

2

Fikirle ilgili sorun, kullanıcının bir e-posta istemcisine sahip olması gerektiğidir; bu, birçok kullanıcı için geçerli olan web postalarına güveniyorsa durum böyle değildir. (en azından, sorunu bir düzine yıl önce araştırdığımda bu web postasına yönlendirmek için geri dönüş yoktu).

Bu nedenle normal çözüm, e-posta göndermek için (sunucu tarafı, o zaman) php mail () 'e güvenmektir.

Ancak günümüzde "e-posta istemcisi" her zaman otomatik olarak, potansiyel olarak bir web posta istemcisine ayarlanmışsa, bilmekten mutluluk duyarım.


1
> "Ama bugünlerde" e-posta istemcisi "her zaman, otomatik olarak, potansiyel olarak bir web posta istemcisine ayarlanmışsa, bilmekten mutluluk duyarım." ... Bu, modern tarayıcılar tarafından desteklenir, örneğin: support.google.com/a/users/answer/9308783?hl=en
nickf

1

Mandrillapp.com'a istek gönderin :

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();

Neden POST değil de GET? mesaj yeterince büyükse, bir noktada kesilir.
Alexey Shevelyov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.