การส่งอีเมลด้วย 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;
}

สิ่งนี้น่าแปลกใจที่ทำงานได้ค่อนข้างดี ปัญหาเดียวก็คือถ้าเนื้อหายาวเป็นพิเศษ (มีมากกว่า 2,000 ตัวอักษร) มันก็เพิ่งเปิดอีเมลใหม่ แต่ไม่มีข้อมูลในนั้น ฉันสงสัยว่าจะเกี่ยวข้องกับความยาวสูงสุดของ URL ที่เกิน


1
นี่เป็นวิธีที่ค่อนข้างอ้อมเมื่อคุณสามารถตั้งค่าแอตทริบิวต์ href เป็นเนื้อหาเดียวกันแทนที่จะใช้ javascript
Ryan Doherty

1
ไม่อ้อมค้อมหากคุณต้องการรวมเนื้อหาของพื้นที่ข้อความในอีเมล นอกจากนี้ยังเป็นวิธีที่ดีในการซ่อนอีเมลของคุณจากผู้รวบรวมสแปม
Gordon Bell

1
@ Gordon- สมมติว่าโปรแกรมเก็บเกี่ยวอีเมลไม่ regex inline javascript หรือทำตาม <script src = "">
alex

6
ใช้ encodeURIComponent ในการตั้งค่าเพื่อหลีกเลี่ยงซึ่งเป็นไปตามกฎที่กำหนดเองซึ่งแตกต่างจากการเข้ารหัส URL แม้ว่าอักขระ Unicode จะยังคงล้มเหลว ... แต่แล้วสิ่งทั้งหมดก็มีแนวโน้มที่จะล้มเหลวอยู่ดี ลิงก์ mailto ที่มีพารามิเตอร์นั้นไม่น่าเชื่อถืออย่างยิ่งและไม่ควรใช้จริงๆ
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 เช่นเดียวกับที่ OP ได้กล่าวไว้
Suncat2000

10

คุณไม่จำเป็นต้องใช้จาวาสคริปต์ใด ๆ คุณเพียงแค่ต้องใช้ href ของคุณเพื่อเข้ารหัสแบบนี้:

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

ฉันเดาว่าฉันคาดหวังว่ารหัสจริงจะเติมที่อยู่แบบไดนามิก
tvanfosson

@tvanfosson หากทราบที่อยู่อีเมลบนหน้าในเวลาที่มีการคลิกองค์ประกอบจุดยึดคุณสามารถลองระบุ ID และตั้งhrefค่าเมื่อมีการเลือกที่อยู่ หากจำเป็นต้องโพสต์เพื่อรับที่อยู่อีเมลในขณะที่เกิดการคลิกสิ่งนี้อาจไม่ได้ผล
Micteu

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 () ในการส่งอีเมล (จากนั้นฝั่งเซิร์ฟเวอร์)

แต่ถ้าในปัจจุบันมีการตั้งค่า "ไคลเอนต์อีเมล" โดยอัตโนมัติและอาจเป็นไคลเอนต์เว็บเมลเราก็ยินดีที่จะทราบ


1
> "แต่ถ้าปัจจุบัน" ไคลเอนต์อีเมล "ได้รับการตั้งค่าโดยอัตโนมัติและเป็นไปได้ที่จะเป็นไคลเอนต์เว็บเมลเรายินดีที่จะทราบ" ... ซึ่งได้รับการสนับสนุนโดยเบราว์เซอร์สมัยใหม่เช่นsupport.google.com/a/users/answer/9308783?hl=th
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();

ทำไมต้องรับและไม่โพสต์ หากข้อความมีขนาดใหญ่พอข้อความจะถูกตัดทอนในบางจุด
Alexey Shevelyov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.