JavaScriptでメールを送信する


107

これは説明が少し混乱するので、ここで我慢してください...

ユーザーが自分のWebサイトを介してテンプレート化された電子メールを送信できるシステムをセットアップしたいのですが、実際にサーバーを使用して送信されるのではありません。アプリケーションは電子メールの本文に事前定義された変数を入力して、ユーザーが自分で入力する手間を省きます。その後、目的に完全に一致しない場合は、必要に応じてメッセージを編集できます。

ユーザーのローカルメールクライアント経由で送信する理由はいくつかあります。そのため、サーバーにメールを送信させることはオプションではなく、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=" + escape("This is my subject")
             + "&body=" + escape(document.getElementById('myText').value)
    ;

    window.location.href = link;
}

驚くべきことに、これはかなりうまくいきます。唯一の問題は、本文が特に長い場合(2000文字を超える場合)、新しい電子メールを開くだけで、情報が含まれていないことです。URLの最大長を超えていることが原因だと思います。


1
これは、javascriptを使用する代わりに、href属性を同じコンテンツに設定するだけの場合に、これをかなり回避する方法です。
Ryan Doherty、

1
電子メールにテキストエリアのコンテンツを含めたい場合は、迂回路ではありません。また、電子メールをスパムハーベスターから隠すための良い方法です。
ゴードンベル

1
@ Gordon-メールハーベスタがインラインJavaScriptを正規表現にしたり、<script src = "">を実行したりしないことを前提としています
alex

6
URLエンコーディングとは異なる任意のルールに従うエスケープを優先するには、encodeURIComponentを使用します。Unicode文字はまだ失敗する可能性が高いですが...とにかく、すべてがとにかく失敗する可能性が非常に高いです。パラメータを持つmailtoリンクは非常に信頼性が低く、実際には使用しないでください。
ボビンス2008年

5
ボビンス:ええ、それはそれを行うための危険な方法だと思いましたが、代わりは何ですか?
nickf 2008年

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、19年

11

JavaScriptは必要ありません。hrefを次のようにコーディングするだけです。

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

実際のコードが動的にアドレスを埋めることを期待していたと思います。
tvanfosson 2008年

@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サーバーのデータを公開します。サーバー側でNodeまたはPHPを使用することをお勧めします。同様に感謝します
jcarlosweb

「ここにSMTPサーバーをセットアップする」ボタンを試しましたか?あなたは答えで共有されたリンクでそれを見つけることができます。
jmojico

2

これがユーザーのクライアントを開いてメールを送信するだけの場合は、そこでメールを作成してもらってください。あなたは彼らが送信しているものを追跡する能力を失いますが、それが重要でない場合は、アドレスと件名を収集し、クライアントをポップアップして、ユーザーに本文を記入させます。


1
アイデアは、私のアプリケーションが彼らのために体を満たすことでした。質問を編集してそれをより明確にします...
nickf '07 / 11/08

1
しかし、メールを送信するためにメールクライアントを開くだけなのに、なぜメールクライアントを作成するのでしょうか。
tvanfosson 2008年

それは電子メールクライアントではなく、電子メールメッセージを事前に入力する私のウェブサイト上の単なるページです。
nickf 2008年

2

非常にアイデアの問題は、ユーザーが電子メールクライアントを持っている必要があることです。これは、多くのユーザーの場合のように、Webメールに依存している場合には当てはまりません。(少なくとも数十年前に問題を調査したとき、このWebメールにリダイレクトするためのターンアラウンドはありませんでした)。

そのため、通常の解決策は、php-mail()を使用してメールを送信することです(サーバー側)。

しかし、今日「メールクライアント」が常に自動的に、場合によってはウェブメールクライアントに設定されている場合は、私は喜んでお知らせします。


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.