자바 스크립트로 이메일 보내기


107

설명하기가 좀 헷갈 리니 참고 해주세요 ...

사용자가 내 웹 사이트를 통해 템플릿 이메일을 보낼 수있는 시스템을 설정하고 싶습니다. 단, 실제로 내 서버를 사용하여 전송되지는 않습니다. 대신 이메일이 준비된 상태로 자체 로컬 메일 클라이언트를 엽니 다. 응용 프로그램은 미리 정의 된 변수로 전자 메일 본문을 작성하여 사용자가 직접 입력해야하는 것을 저장합니다. 그런 다음 목적에 정확히 맞지 않는 경우 원하는대로 메시지를 편집 할 수 있습니다.

사용자의 로컬 메일 클라이언트를 통해 전송하려는 여러 가지 이유가 있으므로 서버가 이메일을 보내도록하는 것은 옵션이 아닙니다. 100 % 클라이언트 측이어야합니다.

이미 대부분 작동하는 솔루션이 실행 중이며 이에 대한 자세한 내용을 답변으로 게시 할 것입니다. 더 좋은 방법이 있는지 궁금합니다.


답변:


137

지금 내가하는 방식은 기본적으로 다음과 같습니다.

HTML :

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

자바 스크립트 :

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 속성을 동일한 콘텐츠로 설정할 수있을 때이 작업을 수행하는 꽤 우회적 인 방법입니다.
Ryan Doherty

1
이메일에 텍스트 영역의 내용을 포함하려면 원형 교차로가 아닙니다. 또한 스팸 수확기에서 이메일을 숨기는 좋은 방법입니다.
Gordon Bell

1
@ Gordon- 이메일 수확기가 인라인 자바 스크립트를 정규식으로 처리하지 않거나 <script src = "">를 따르지 않는다고 가정합니다
alex

6
URL 인코딩과 다른 임의의 규칙을 따르는 이스케이프하려면 우선 encodeURIComponent를 사용하십시오. 유니 코드 문자는 여전히 실패 할 가능성이 있지만 ... 어쨌든 모든 것이 실패 할 가능성이 높습니다. 매개 변수가있는 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('...').


OP에서 언급했듯이 여전히 URL 크기 제한이 적용됩니다.
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;
}

onDomReady에 jQuery

$('.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 서버의 데이터를 노출, 그것은 동등하게, 노드 또는 PHP와 서버 측에서 감사를 수행하는 것이 좋습니다
jcarlosweb

"여기에 SMTP 서버 설정"버튼을 사용해 보셨습니까? 답변에 공유 된 링크에서 찾을 수 있습니다.
jmojico

2

이것이 단지 사용자의 클라이언트를 열어 이메일을 보낼 것이라면, 거기에서도 작성하도록 두지 마십시오. 당신은 그들이 보내는 것을 추적하는 능력을 잃게되지만 그것이 중요하지 않다면 주소와 제목을 수집하고 사용자가 본문을 채울 수 있도록 클라이언트를 팝업합니다.


1
내 응용 프로그램이 그들을 위해 몸을 채우는 아이디어였습니다. 더 명확하게 질문을 수정하겠습니다 ...
nickf

1
하지만 이메일 클라이언트를 열어서 메일을 보낼 때 왜 이메일 클라이언트를 작성합니까?
tvanfosson

이메일 클라이언트가 아니라 이메일 메시지를 미리 채우는 내 웹 사이트의 페이지 일뿐입니다.
nickf

2

바로 그 아이디어의 문제는 사용자가 이메일 클라이언트를 가져야한다는 것입니다. 웹 메일에 의존하는 경우는 그렇지 않습니다. 이는 많은 사용자에게 해당됩니다. (적어도 12 년 전에이 문제를 조사했을 때이 웹 메일로 리디렉션 할 수있는 처리 방법이 없었습니다).

그래서 일반적인 해결책은 이메일을 보내기 위해 php mail ()에 의존하는 것입니다 (서버 측).

하지만 요즘 "이메일 클라이언트"가 항상 자동으로, 잠재적으로 웹 메일 클라이언트로 설정되어 있다면 기뻐할 것입니다.


> "하지만 요즘"이메일 클라이언트 "가 항상 자동으로, 잠재적으로 웹 메일 클라이언트로 설정되어 있다면 기뻐할 것입니다." ... 최신 브라우저에서 지원됩니다. 예 : support.google.com/a/users/answer/9308783?hl=ko
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가 아닌 GET입니까? 메시지가 충분히 크면 어느 시점에서 잘립니다.
Alexey Shevelyov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.