一、发送邮件
1、需求
在 PHP 应用开发中,往往需要验证用户邮箱、发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持。
如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮件发送程序了,不过开发这样一个程序并不容易。
因此在实际开发我们可以借助第三方提供的PHPMailer 封装类,使用它可以更加便捷的发送邮件,免去了我们很多额外的麻烦。
2、分析发送邮件的流程
服务器打包好邮件内容->第三方邮件服务器->用户邮箱
3、第三方邮箱服务器
PHPMailer 是一个封装好的 PHP 邮件发送类,支持发送 HTML 内容的电子邮件,以及可以添加附件发送,并不像 PHP 本身 mail() 函数需要服务器环境支持,您只需要设置邮件服务器以相关信息就能实现邮件发送功能。因此我们需要借助一个第三方邮箱服务器来完成我们的工作,如163邮箱、qq邮箱都可以。下面我们以163邮箱为例。
1)申请163邮件服务器的发送邮件授权码
首先,我们需要在163的邮箱里面先申请发送邮件服务:http://email.163.com/
2)开启SMTP 协议
所有的主流邮箱都支持 SMTP 协议,但并非所有邮箱都默认开启,您可以在邮箱的设置里面手动开启。
第三方服务在提供了账号和密码之后就可以登录 SMTP 服务器,通过它来控制邮件的中转方式。
3)开始发送邮件
我们使用PHPMailer这个类进行邮件的发送,先将如下文件拷贝到项目目录中
<?php
//发送邮件:以我的163邮箱,给我的QQ邮箱发送邮件
//引入需要的核心类文件
require \'./PHPMailer/PHPMailer.class.phpmailer.php\';
//实例化对象
$mail = new PHPMailer();
//3.设置属性,告诉我们的服务器,谁跟谁发送邮件
$mail -> IsSMTP(); //告诉服务器使用smtp协议发送
$mail -> SMTPAuth = true; //开启SMTP授权
$mail -> Host = \'smtp.163.com\'; //告诉我们的服务器使用163的smtp服务器发送
$mail -> From = \'dick@163.com\'; //发送者的邮件地址
$mail -> FromName = \'dick\'; //发送邮件的用户昵称
$mail -> Username = \'dick\'; //登录到163邮箱的用户名、账号
$mail -> Password = \'password\'; //第三方登录的授权码,在邮箱里面设置
//编辑发送的邮件内容
$mail -> IsHTML(true); //发送的内容使用html编写
$mail -> CharSet = \'utf-8\'; //设置发送内容的编码
$mail -> Subject = \'静夜思\'; //设置邮件的主题、标题
$mail -> MsgHTML(\'床前明月光,疑是地上霜。。。\');//发送的邮件内容主体
//告诉服务器接收人的邮件地址
$mail -> AddAddress(\'10001qq.com\');
//调用send方法,执行发送
$result = $mail -> Send();
if($result){
echo \'ok\';
}else{
echo $mail -> ErrorInfo;
}
4)封装邮件发送类
发送邮件的代码基本固定,所以为了以后方便使用,我们可以将其封装成一个工具类。
将发送邮件的代码封装到Email.class.php类中,将可能会变化的内容保存到配置文件中,例如发送邮件主机地址、邮箱账号等
<?php /* * 使用PHPMailer发送邮件的代码 */ class Email { //发送邮件 //参数1:邮件的标题 //参数2:邮件的内容 //参数3:接收者的邮箱地址 public static function send($title,$content,$getter) { //发送邮件:以我的163邮箱,给我的QQ邮箱发送邮件 //引入需要的核心类文件 //实例化对象 $mail = new PHPMailer(); //3.设置属性,告诉我们的服务器,谁跟谁发送邮件 $mail -> IsSMTP(); //告诉服务器使用smtp协议发送 $mail -> SMTPAuth = true; //开启SMTP授权 $mail -> Host = $GLOBALS[\'config\'][\'email_host\']; //告诉我们的服务器使用163的smtp服务器发送 $mail -> From = $GLOBALS[\'config\'][\'sender\']; //发送者的邮件地址 $mail -> FromName = $GLOBALS[\'config\'][\'nickname\']; //发送邮件的用户昵称 $mail -> Username = $GLOBALS[\'config\'][\'account\']; //登录到163邮箱的用户名、账号 $mail -> Password = $GLOBALS[\'config\'][\'token\']; //第三方登录的授权码,在邮箱里面设置 //编辑发送的邮件内容 $mail -> IsHTML(true); //发送的内容使用html编写 $mail -> CharSet = \'utf-8\'; //设置发送内容的编码 $mail -> Subject = $title; //设置邮件的主题、标题 $mail -> MsgHTML($content);//发送的邮件内容主体 //告诉服务器接收人的邮件地址 $mail -> AddAddress($getter); //调用send方法,执行发送 $result = $mail -> Send(); if($result){ return true; }else{ return $mail -> ErrorInfo; } } }
二、发送短信
1、发送短信流程
由于业务中需要写登录注册的API的接口,所以了解了下手机号注册的前后端交互的流程;
(1)用户操作客户端点击发送验证码,(然后客户端ajax发送请求,并且按钮处于60s静默时间)
(2)后端逻辑层,接受传递过来的手机号,验证格式是否合法,进入数据库匹配是否存在
(3)生成验证码,存在session中,然后curl发送到第三方的短信接口链接中
(4)配置第三方短信平台,向指定手机号用户发送验证码信息
2、第三方平台
发送短信需要借助第三方平台,可以选择的平台有很多,其原理都差不多类似,下面以某平台为例实现。
(1)注册平台账号
http://www.yuntongxun.com/user/reg/init
(2)进入产品与服务,可以查看其配套文档
(3)将发送短信的核心类:CCPRestSmsSDK.php 拷贝到项目目录
(4) 开启CURL,因为发送短信使用到了PHP的一个扩展:curl
(5) 后台逻辑开发
核心:创建验证码 -> 封装POST请求函数 -> 发送验证码到第三方平台 -> 再由第三方转发至用户的手机
一般第三方平台会提供使用demo,直接复制修改使用即可
(6)在项目中注册用户时发送短信验证码
由于短信是收费的,为了将来能够统计发送的短信数量,其次将来还要验证短信的有效期等,所以我们要将验证码单独保存
由于一个用户可以发送多条短信,用户和短信之间是一对多的关系