表单填写完成后发送邮件通知

还是帝国CMS

我发现帝国CMS本身的留言功能根本不够用,字段太少了,而且不能自定义,所以不再使用帝国默认的留言系统,自己用PHP写了一个小程序。

我用的是phpMailer

并不是最新的版本,只要能用就行了呗,管它新不新版呢。
这样简单的功能我感觉以后会有很多,所以就弄一个通用的接口吧,话不多说,直接上接口的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
date_default_timezone_set('Etc/UTC');
require_once 'PHPMailerAutoload.php';
header('Content-Type: text/json; charset=utf-8');
// 收件人Email,可以只有一个,也可以是一个数组
$to = $_POST['to'];
// 收件人昵称,可以只有一个,也可以是一个数组,数量要和收件人Email保持一致
$to_name = $_POST['to_name'];
// 邮件标题
$subject = $_POST['subject'];
// 邮件内容
$body = $_POST['body'];


$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = "smtp.example.com";
// 不使用SSL连接,所以端口就用25就够了
$mail->Port = 25;
$mail->SMTPAuth = true;
$mail->CharSet = "utf-8";
$mail->Username = "[email protected]";
$mail->Password = "password";
$mail->setFrom('[email protected]', '发件人显示名称');
if(is_string($to)){
$mail->addAddress($to, $to_name);
}else if(is_array($to)){
for($i = 0; $i < count($to); $i++){
$mail->addAddress($to[$i], $to_name[$i]);
}
}else{
$mail->addAddress('[email protected]', '如果收件人Email为空,可以设置一个默认的收件人');
}
$mail->Subject = $subject;
$mail->msgHTML($body."<br /><br /><br />本邮件为系统自动发送,请勿直接回复。");
// 如果收件客户端不支持HTML, 就会显示下面的内容
$mail->AltBody = "为了查看该邮件,请切换到支持 HTML 的邮件客户端";
if (!$mail->send()) {
echo '{"errorCode": 101, "errorMsg": '.$mail->ErrorInfo.'}';
} else {
echo '{"errorCode": 0, "errorMsg": "Message Sent!"}';
}
?>

这样就只需要POST过来4个参数就可以了。

使用这个端口的时候,可以这样操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
date_default_timezone_set('Etc/UTC');
header('Content-Type: text/json; charset=utf-8');
$to = array('[email protected]', '[email protected]');
$to_name = array('收件人1', '收件人2');
$subject = $_POST['title'];
$body = $_POST['body'];

$post_data = array(
'to' => $to,
'to_name' => $to_name,
'subject' => $subject,
'body' => $body
);
$url = 'API地址';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>

前端需要使用ajax提交数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var sendMail = function (data) {
var index;
$.ajax({
url: '/hanlder/handlemail.php',
type: 'POST',
data: data,
beforeSend: function () {
index = layer.msg('您的信息正在提交,请稍等……', { time: 60 * 1000 });
},
success: function (result) {
layer.close(index);
if (result.errorCode == 0) {
layer.alert('提交成功,我们会及时与您取得联系,请耐心等待。', { icon: 6, title: '提示' }, function () { window.location = '/'; });

} else {
layer.alert('系统出错,可以直接联系我们!', { icon: 2, title: '错误' });
}
}
});
}

前端使用了layui,可以很方便的显示提示信息。
需要传递过来的参数就只有邮件的标题和邮件的正文就可以了(正文支持html标记)。

当然前端提交内容的时候,可能有一些危险的html代码,这就需要先过滤一下了。

这样接口就可以通用了,不同的页面,只需要修改前端和后端接收邮件的人就可以。

嗯,phpMailer还是挺方便的。