Vuejs2でメールを送信する方法を教えてください。入力データを取得してjsonに変換しましたが、メールボックスに送信できません。
私はPHPMailerの側面を探していますが、PHPとVueは混在させないでください。
フォームのコンテンツを送信するにはどうすればよいですか?
テンプレート:
<div class="JC-contact__form">
<b-form @submit="onSubmit" v-if="show">
<b-form-group class="JC-contact__form--lastName">
<b-form-input type="text" v-model="form.lastName"> </b-form-input>
</b-form-group>
<b-form-group class="JC-contact__form--firstName">
<b-form-input type="text" v-model="form.firstName"> </b-form-input>
</b-form-group>
<b-form-group>
<b-form-input type="text" v-model="form.topic"> </b-form-input>
</b-form-group>
<b-form-group>
<b-form-input type="email" v-model="form.email"></b-form-input>
</b-form-group>
<b-form-textarea v-model="form.text"></b-form-textarea>
<b-button type="submit">Envoyer</b-button>
</b-form>
</div>
スクリプト:
export default {
name: 'Contact',
data () {
return {
form: {
lastName: '',
firstName: '',
topic: '',
email: '',
text: ''
},
file: null,
show: true
}
},
methods: {
onSubmit (evt) {
evt.preventDefault();
alert(JSON.stringify(this.form));
},
onReset (evt) {
evt.preventDefault();
/* Reset our form values */
this.form.lastName = '';
this.form.firstName = '';
this.form.topic = '';
this.form.email = '';
this.form.text = '';
/* Trick to reset/clear native browser form validation state */
this.show = false;
this.$nextTick(() => {
this.show = true
});
}
}
}
Vueから直接メールを送信することはできません。メールプロトコルを処理するために何らかのサーバーが必要なためです。これはブラウザから直接行うことはできません。PHPに慣れていないので、それでは役に立ちません。ノードでは、Amazon Simple Email Server(またはGmailアカウントを使用できます)のような電子メールを処理するには、nodemailerパッケージといくつかのsmtpサーバーが必要です。また、axiosを使用して投稿リクエストを送信することもできますSendGridやMandrillなどのサービスに送信されます。リクエストはメールに変換され、リクエストの本文で指定されたアドレスに送信されます。
詳細はこちら:
これは私がやった方法です:
PHP mail()
関数は正常に動作します。ここでは空想はありません。
mail.php
-これは、サーバー上のアクセス可能な場所に配置する必要があります。
<?php
$name = "Undefined name";
if(isset($_POST['name'])){
$name = $_POST['name'];
}
$message = "<p>Hi!</p>";
$message .= "<p>Wazaaaaa $name</p>";
$to_email = '[email protected]';
$subject = 'Mail subject';
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=UTF-8';
$headers[] = 'From: Biloo <[email protected]>';
mail($to_email, $subject, $message, implode("\r\n", $headers));
?>
ヘッダーの値は信頼できる必要があります(未確認のユーザーが送信した値はありません)。
次に、VueJSは適切なデータをメーリングスクリプトに送信します。
components/Mail.vue
<template>
<div>
<transition name="fade" mode="out-in">
<div v-if="sent">
<p>Thanks</p>
</div>
</transition>
</div>
<div v-if="!sent" class="formGroup">
<b-form @submit="onSubmit">
<b-form-input
id="input-name"
v-model="form.name"
type="text"
required
placeholder="Name"
/>
<b-button type="submit">
Contact
</b-button>
</b-form>
</div>
</div>
</template>
<script>
const querystring = require("querystring");
export default {
data() {
return {
sent: false,
form: {
name: ""
}
};
},
methods: {
onSubmit(e) {
e.preventDefault();
this.$axios
.post(
"https://theServer.com/mail.php",
querystring.stringify(this.form)
)
.then(res => {
this.sent = true;
});
}
}
};
</script>
ここで、Axiosのデフォルトの動作はJSONオブジェクトをポストすることに注意することが重要です。ただし、これを行うと、PHPは空の$_POST
値を受け取ります。そのため、データは投稿する前にquerystring
dependencyを使用してフォーマットする必要があります。
クエリ文字列はnpmでインストールできます:
npm i querystring
<template>
<div class="request-a-callback-form">
<transition name="fade" mode="out-in">
<div v-if="sent">
<p>Thanks for contacting us, we will get back to you shortly...</p>
</div>
</transition>
<form v-on:submit="sendForm">
<input type="text" v-model="ContactForm.name" placeholder="Your Name">
<input type="text" v-model="ContactForm.email" placeholder="Email Address">
<input type="text" v-model="ContactForm.phone" placeholder="Phone Number">
<input type="text" v-model="ContactForm.subject" placeholder="Subject">
<textarea v-model="ContactForm.message" rows="8" cols="80" class="form-control">
</textarea>
<br>
<button data-text="submit" type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
sent: false,
ContactForm: {
name : '',
email: '',
phone: '',
subject: '',
message: ''
}
}
},
methods: {
sendForm(e) {
e.preventDefault()
console.log(this.ContactForm)
this.$axios.post('api/mailserver.php',
querystring.stringify(this.ContactForm)).then(res => {
this.sent = true
})
}
}
}
</script>
Your php Server
<?php
// Allow from any Origin
if(isset($_SERVER["HTTP_Origin"]))
{
// You can decide if the Origin in $_SERVER['HTTP_Origin'] is something you want to
allow, or as we do here, just allow all
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_Origin']}");
}
else
{
//No HTTP_Origin set, so we allow any. You can disallow if needed here
header("Access-Control-Allow-Origin: *");
}
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600"); // cache for 10 minutes
if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT");
//Make
sure you remove those you do not want to support
if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
header("Access-Control-Allow-Headers:
{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
//Just exit with 200 OK with the above headers for OPTIONS method
exit(0);
}
//From here, handle the request as it is ok
if(!empty($_POST['name'])){
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$subject = $_POST['subject'];
$message = $_POST['message'];
}
$message = "$message";
$to_email = '<email to be sent to>';
$subject = "$subject";
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=UTF-8';
$headers[] = "From: <$email>";
mail($to_email, $subject, $message, implode("\r\n", $headers));
?>