网站邮件通知功能:发送到指定邮箱实现留言提醒

2020/05/1208:30:58 1 1,191

对于建站的“网管”,网站管理员的我们,有这样一些使用“邮件通知”的场景。

网站注册验证的邮件提醒;
网站登录密码找回的邮件发送;
网站的表单提交后的邮件提醒;
......

因为之前在织梦系统中的自定义表单功能很方便实现用户“表单提交”,网站管理员在织梦后台查看用户提交数据。可是有时候总是晚点才看到网站表单留言。加上这次在使用zblog建站中,需要实现表单提交后有邮件通知的功能,zblog没有表单功能,相比实现邮件提醒功能要比织梦麻烦,每个人实现方法不一样,我采用自己创建留言表数据库,并将用户提交的表单数据发送到网站管理员的指定邮箱。

一、网站“邮件提醒”两大步骤,可以实现功能。

1、准备:发件、收件邮箱,PHPMailer代码库。

2、编写代码,开始发邮件测试。

原理:用PHPMailer发送邮件(在PHP程序中发送邮件的方式有许多,在本文选择PHPMailer的方式)

二、步骤开始

1、准备PHPMailer类库

PHPMailer下载地址:https://github.com/PHPMailer/PHPMailer/(调试代码有许多错误,修改后的代码,本人整理好的文件包下载地址)

提示:要对应下载版本,避免错误。

目前官方库文件包:

链接:https://pan.baidu.com/s/1FFf-jP-pW3uxCryHZWMWLw
提取码:af8r

本人本次使用的文件包:

织梦系统

链接:https://pan.baidu.com/s/1sLbQmjxcTb77uI4j-BMHpQ
提取码:pgzu

zblog系统

链接:https://pan.baidu.com/s/1pORXVgwyl2jkdRMCn99Bgg
提取码:f05v

2、准备发送邮件的邮箱

在发送邮件功能中,现在常见的是谷歌邮箱、163邮箱、QQ邮箱。本文以QQ邮箱为例

必须开通了邮箱的IMAP/SMTP服务,才能用于发送邮件。

登录QQ邮箱,分别进入“设置”,“账户”。

来到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务:

网站邮件通知功能:发送到指定邮箱实现留言提醒

会提示你邮件系统升级需要发送短信,发送后会弹出授权码。

成功开启IMAP/SMTP服务,在第三方客户端登录时,授权码就是密码

记得点击“保存更改”按钮。

3、准备一个接受邮件的邮箱,用于发送邮件测试。

4、将PHPMailer库文件放入网站目录中。

这里我分别就织梦系统和zblog博客系统进行代码改造说明。

首先可以看看官方的代码

一个简单的例子

<?php
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Load Composer's autoloader
require 'vendor/autoload.php';

// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
    $mail->isSMTP();                                            // Send using SMTP
    $mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
    $mail->Username   = 'user@example.com';                     // SMTP username
    $mail->Password   = 'secret';                               // SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
    $mail->Port       = 587;                                    // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above

    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    // Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

另一个学习例子,将封装成一个php的函数,在需要发送邮件的地方直接调用。

/**
 * 发送邮件
 * @param $msg string 发送的内容
 * @author d
 */
function emailTo($msg){
    //引入PHPMailer的核心文件
    Vendor('PHPMailer.src.PHPMailer');
    Vendor('PHPMailer.src.SMTP');
 
    //实例化PHPMailer核心类
    $mail = new PHPMailer();
    //是否启用smtp的debug进行调试 默认关闭debug调试模式
    //$mail->SMTPDebug = 1;
    //使用smtp鉴权方式发送邮件
    $mail->isSMTP();
    //smtp需要鉴权 这个必须是true
    $mail->SMTPAuth = true;
    //链接qq域名邮箱的服务器地址,qq的是smtp.qq.com;阿里云的是smtp.aliyun.com
    $mail->Host = 'smtp.example1.com;smtp.example2.com;';
    //设置使用ssl加密方式登录鉴权
    $mail->SMTPSecure = 'ssl';#阿里的'tls'
    //设置ssl连接smtp服务器的远程服务器端口号
    $mail->Port = 465;#阿里的587
    //设置发送的邮件的编码
    $mail->CharSet = 'UTF-8';#这个必须设置,好像默认的是iso-8859-1,不设置的话中文会乱码
    //设置发件人昵称 显示在收件人邮件的发件人邮箱地址前的发件人姓名
    $mail->FromName = '哈哈';
    //smtp登录的账号 QQ邮箱即可
    $mail->Username = '发送邮件的邮箱';
    //smtp登录的密码 使用生成的授权码
    $mail->Password = 'xgebhzosormtbfba';#此授权码已失效
    //设置发件人邮箱地址 同登录账号
    $mail->From = '发送邮件的邮箱';
    //邮件正文是否为html编码
    $mail->isHTML(true);
    //设置收件人邮箱地址
    $mail->addAddress('接收邮件的邮箱,如果会变,则需要在参数中传入');
    //添加多个收件人 则多次调用方法即可
    //$mail->addAddress('其他接收邮件的邮箱');
    //添加该邮件的主题
    $mail->Subject = '邮件的主题';
    //添加邮件正文
    $mail->Body = $msg;
    //为该邮件添加附件
    //$mail->addAttachment('./example.pdf');
    //发送邮件 返回状态
    return $mail->send();
}

三、织梦表单邮件提醒

3.1、织梦后台填写信息

在织梦后台的“系统”“系统设置”“核心设置”

网站发信EMAIL:QQ邮箱

接下来继续填写

网站邮件通知功能:发送到指定邮箱实现留言提醒

3.2、代码改造

3.2.1、添加PHPMailer的库文件到/plus目录下面:

网站邮件通知功能:发送到指定邮箱实现留言提醒

3.2.2、在织梦的自定义表单文件diy.php(路径:/plus/diy.php)中的代码$id = $dsql->GetLastID();上面添加如下代码:

//邮件发送
$fieldlist = $diy->getFieldList();
$addvalue_ary1 = explode(',', $addvalue);
$addvalue_ary = array_filter($addvalue_ary1);
$i = 1;
foreach($fieldlist as $field=>$fielddata)
{
    $emailbody .= $fielddata[0].':'.$addvalue_ary[$i].'<br/>';   
    $i ++;
}
global $cfg_smtp_server, $cfg_adminemail, $cfg_smtp_port, $cfg_smtp_usermail, $cfg_smtp_password, $cfg_webname, $cfg_basehost, $cfg_smtp_user;

require_once("class.phpmailer.php");
require_once("class.smtp.php");
//实例化PHPMailer
$mail = new PHPMailer();

$mail->SMTPDebug = 0;

$mail->isSMTP();

$mail->SMTPAuth=true;

$mail->Host = "ssl://smtp.qq.com";

$mail->SMTPSecure = 'ssl';

$mail->Port = 465;

//发件人的主机域,自定义的内容
$mail->Hostname = "XX网络";

$mail->CharSet = 'UTF-8';

//发件人姓名
$mail->FromName =网站管理员;

//smtp登录的账号qq号
$mail->Username = qq号;
//密码就是授权码
$mail->Password = 授权码;

//发件人邮箱
$mail->From = "qq邮箱";

$mail->isHTML(true);

//收件人邮箱地址,第一参数邮箱地址 第二昵称;可多次调用就是多个收件人的邮箱
$mail->addAddress("XX@qq.com","XX公司");

//邮件主题
$mail->Subject = "网站留言提醒";
//表单内容
$mail->Body = $emailbody;

if(!$mail->send())
{
    echo "Fail to send. <p>";
    echo "Cause of the error: " . $mail->ErrorInfo;
    exit;
}
//邮件结束

在网页提交表单,实现织梦发送邮件功能。

四、zblog程序邮件提醒

4.1、创建mysql数据表

代码如下,仅仅是示例代码,具体根据自己网站业务。

--
-- 表的结构 `zbp_mesage`
--

CREATE TABLE `zbp_mesage` (
  `key` int(11) NOT NULL,
  `mes_name` char(30) DEFAULT NULL,
  `mes_phone` char(11) NOT NULL,
  `mes_mesage` varchar(400) DEFAULT NULL,
  `mes_time` char(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- 转存表中的数据 `zbp_mesage`
--

INSERT INTO `zbp_mesage` (`key`, `mes_name`, `mes_phone`, `mes_mesage`, `mes_time`) VALUES
(1, 'nicheng', '13030305050', '这是留言内容', '2020-5-11 12:40:35'),
(2, NULL, '15263635252', NULL, '2020-5-11 12:7:42'),
(3, '小智', '13063635252', '留言内容2', '2020-5-11 13:44:42');

4.2、HTML页面的表单提交代码

<form action="./insert.php" method="post" enctype="multipart/form-data" onsubmit="return checkPhone()">
    <input type="text" placeholder="联系电话" name="mes_phone" id="mes_phone">
	<textarea type="text" placeholder="留言内容" name="mes_mesage" id="mes_mesage"></textarea> 

    <input name="mytime" value="" type="hidden"  id="mytime"  />
    <script type="text/javascript">
    window.onload = function(){
    var nowDate = new Date();
    var str = nowDate.getFullYear()+"-"+(nowDate.getMonth() + 1)+"-"+nowDate.getDate()+" "+nowDate.getHours()+":"+nowDate.getMinutes()+":"+nowDate.getSeconds();
    document.getElementById("mytime").value=str;
    }
    </script>
    <input type="submit" id="isubmit" name="submit" value="点击通话" class="formSub">
</form>

4.3、存储到数据库的PHP处理文件

前台表单提交后的PHP处理页面,实现接受表单数据并发送邮件。

<?php
// allen 20.05.10
// url taizidian.cn

header('Content-Type: application/json');
header("Content-Type: text/html;charset=utf-8");
// error_reporting(0);

require './phpmailer/PHPMailerAutoload.php';

$name = $_POST['mes_name']; 
$phone = $_POST['mes_phone']; 
$mesage = $_POST['mes_mesage']; 
$mes_time = $_POST['mytime'];

$con = mysqli_connect('IP','用户名','密码','数据库');
if (!$con)
{
die('Could not connect: ' . mysqli_error($con));
}
mysqli_select_db($con,"数据库");
mysqli_set_charset($con, "utf8");

// 插入数据

$sql="INSERT INTO `zbp_mesage` (`key`,`mes_name`,`mes_phone`,`mes_mesage`,`mes_time`) VALUES (NULL,'$name','$phone','$mesage','$mes_time')";

$res = mysqli_query($con,$sql);

if($res){
// echo "<br/>插入成功";
} else {
// echo "<br/>插入失败";
}
mysqli_close($con);

// 邮件发送
$mail = new PHPMailer();
$mail->SMTPDebug = 0;
$mail->isSMTP();  // 使用SMTP服务
$mail->CharSet = "utf8";
$mail->Host = "ssl://smtp.qq.com";   // 发送方的SMTP服务器地址
$mail->SMTPAuth = true;  // 是否使用身份验证
$mail->Username = "用户名";  // 发送方邮箱用户名
$mail->Password = "xxx";  // 发送方的邮箱授权码
$mail->SMTPSecure = "ssl";  // 使用ssl协议方式
$mail->Port = 465;  // 163邮箱的ssl协议方式端口号是465/994
 
$mail->setFrom("xxxx@qq.com","管理员");  // 设置发件人信息
$mail->addAddress("xx@qq.com","");  // 设置收件人信息,可设置多个,复制粘贴此行修改邮箱地址即可
// $mail->addReplyTo("xx@qq.com","Reply");   // 设置回复人信息,指的是收件人收到邮件后,如果要回复,回复邮件将发送到的邮箱地址
//$mail->addCC("xx9@qq.com");  // 设置邮件抄送人,可以只写地址,上述的设置也可以只写地址
//$mail->addBCC("xxx@qq.com");    // 设置秘密抄送人
//$mail->addAttachment("img.jpg");  // 添加附件

$mail->Subject = "网站收到新留言啦!";  // 邮件标题
$mail->Body = "姓名:".$name." 
               电话:".$phone."   
               内容:".$mesage."
               时间:".$mes_time;

if(!$mail->send()){// 发送邮件
    echo "Message could not be sent.";
    echo "Mailer Error: ".$mail->ErrorInfo;  // 输出错误信息
}else{
    echo"<script>alert('表单提交成功的提示');history.go(-1);</script>";  
}

4.4、显示全部表单留言的PHP处理文件

<?php

header('Content-Type: application/json');
header("Content-Type: text/html;charset=utf-8");
// error_reporting(0);

require './phpmailer/PHPMailerAutoload.php';

$name = $_POST['mes_name']; 
$phone = $_POST['mes_phone']; 
$mesage = $_POST['mes_mesage']; 

$con = mysqli_connect('地址','用户','密码','数据库');
if (!$con)
{
	die('Could not connect: ' . mysqli_error($con));
}
mysqli_select_db($con,"数据库");
mysqli_set_charset($con, "utf8");

// 输出数据
$sql = "select * from zbp_mesage";
$result = mysqli_query($con,$sql);

echo "<table border='1'>
<tr>
<th>ID</th>
<th>姓名</th>
<th>手机号</th>
<th>留言内容</th>
<th>留言时间</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
	echo "<tr>";
	echo "<td>" . $row['key'] . "</td>";
	echo "<td>" . $row['mes_name'] . "</td>";
	echo "<td>" . $row['mes_phone'] . "</td>";
	echo "<td>" . $row['mes_mesage'] . "</td>";
	echo "<td>" . $row['mes_time'] . "</td>";
	echo "</tr>";
}
echo "</table>";
mysqli_close($con);

这样独立于网站程序,可以单独上传文件到服务器文件夹使用。

 

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

评论已关闭!

目前评论:1   其中:访客  0   博主  0

    • 风行 风行 2

      很有帮助,谢谢!