• ThinkPHP---TP功能类之邮件


    【一】概论

    (1)简介:

    这里说的邮件不是平时说的email邮件(邮件地址带有@符号的),而是指的一般论坛网站的站内信息,也叫私信或者pm(private message私信)

    【二】站内信案例

    (1)站内信构成:邮件的发送(写邮件)、邮件的接收(收件箱)、邮件的发件箱(发送的邮件列表)

    (2)准备工作:

    ①数据表:sp_email

    SQL语句:①后面的comment为注释,方便开发人员分辨;②附件这里数据库设计为只能上传一个附件

    create table sp_email(
        id int(11) not null auto_increment,
        from_id int(11) not null comment'发送者id',
        to_id int(11) not null comment'接收者id',
        title varchar(50) not null comment'标题',
        file varchar(255) default null comment'文件',       //完整路径
        hasfile smallint(1) default '0' comment'是否有附件', //有文件为1,没有文件为0.默认0(没有附件)
        filename varchar(255) default null comment'文件原始名',
        content text comment'内容',
        addtime int(11) default null comment'添加时间',       //发送时间
        isread smallint(1) default '0' comment'是否已读',     //是否已读,回值
        primary key(id)
    )engine=myisam auto_increment=1 default charset=utf8;

    ②修改模板文件index.html,创建导航菜单(发邮件、邮件收件箱、已发邮件)

             <li>
                <a href="javascript:;" class="emailManage">邮件管理</a>
                <ul>
                    <li><a href="{:U('Email/send')}" class="documentManage">发邮件</a></li>
                    <li><a href="{:U('Email/sendBox')}" class="documentManage">发件箱</a></li>
                    <li><a href="{:U('Email/recBox')}" class="documentManage">收件箱</a></li>
                </ul>
            </li>

    ③创建控制器EmailController.class.php

    <?php
        namespace AdminController;
        use ThinkController;
        class EmailController extends Controller{
        }
    ?>

    (3)邮件发送

    分析

    控制器:EmailController.class.php

    方法:send(二合一,展示模板和数据保存)

    模板:send.html

    下面分步操作:

    第一步:创建send方法,展示模板页面

    <?php
        namespace AdminController;
        use ThinkController;
        class EmailController extends Controller{
            //send方法,展示模板+数据保存
            public function send(){
                $this->display();
            }
        }
    ?>

    第二步:将send.html模板文件复制到指定目录下ApplicationAdminViewEmailsend.html,并替换静态资源路径

    第三部:改写send方法,查询收件人,在模板中列出收件人列表

    //send方法,展示模板+数据保存
            public function send(){
                //查询收件人信息,除去自己(id与session('id')相等的),因为自己不可以发送给自己
                $data = M('user')->field('id,truename')->where('id != '.session('id'))->select();
                $this->assign('data',$data);
                $this->display();
            }

    第四步:在模板里展示收件人列表

    第五步:检查表单,表单完整代码

    <form action="" method="post" enctype="multipart/form-data">
        <fieldset>
            <legend>发送邮件</legend>
                <p>
                    <label for="to_id">收件人:</label>
                    <select name="to_id" id="to_id">
                        <option value="0">请选择收件人</option>
                        <volist name="data" id="vol">
                            <option value="{$vol.id}">{$vol.truename}</option>
                        </volist>
                    </select>
                </p>
                <p><label for="title">标题:</label><input type="text" name="title" id="title"></p>
                <p><label for="file">附件:</label><input type="file" name="file" id="file"></p>
                <p><label for="author">内容:</label><textarea name="content"></textarea></p>
                <div>
                    <a href="javascript:;" id="submitBtn">提交</a>
                    <a href="javascript:;" id="resetBtn">清空</a>
                </div>
        </fieldset>
    </form>

    第六步:将提交数据保存到数据表

    先判断请求类型,若为POST请求,则处理数据,否则展示数据和模板页面。先将大概结构写出来

    public function send(){
                //判断请求类型
                if (IS_POST) {
                    //接收数据
                    $post = I('post.');
                    //实例化自定义模型
                    $model = D('Email');
                    //调用具体类的方法实现数据的保存
                    $result = $model -> addData($post,$_FILES('file'));
                    if($result){
                        $this->success('邮件发送成功',U('sendBox'),3);
                    }else{
                        $this->error('邮件发送失败');
                    }
    
                }else{
                    //查询收件人信息,除去自己(id与session('id')相等的)
                    $data = M('user')->field('id,truename')->where('id != '.session('id'))->select();
                    $this->assign('data',$data);
                    $this->display();
                }    
    }

    第七步:创建自定义模型EmailModel.class.php,添加保存方法addData。先列出自定义模型的方法架构

    <?php
        namespace AdminModel;
        use ThinkModel;
        class EmailModel extends Model{
            public function addData($post,$file){
            }
        }
    ?>

    第八步:编写需要的addData方法实现数据处理和保存入库(文件处理+数据处理)

    //文件分为文件+字符
                if(!$file['error']){//判断是否有文件上传
                    //1. 配置数组,定义配置
                    $cfg = array(
                        //配置上传路径
                        'rootPath'    =>    WORKING_PATH . UPLOAD_ROOT_PATH
                    );
                    //2. 实例化上传类
                    $upload = new ThinkUpload($cfg);
                    //3. 上传操作,并接受上传结果
                    $info = $upload->uploadOne($file);
                    dump($info);die;
                }else{
    
                }

    先判断上传是否成功,上传成功的话会输出有9个元素的一维数组

    接下来判断是否上传成功,若成功则继续处理补全字段。完整代码

    <?php
        namespace AdminModel;
        use ThinkModel;
        class EmailModel extends Model{
            public function addData($post,$file){
                //文件分为文件+字符
                if(!$file['error']){//判断是否有文件上传
                    //1. 配置数组,定义配置
                    $cfg = array(
                        //配置上传路径
                        'rootPath'    =>    WORKING_PATH . UPLOAD_ROOT_PATH
                    );
                    //2. 实例化上传类
                    $upload = new ThinkUpload($cfg);
                    //3. 上传操作,并接受上传结果
                    $info = $upload->uploadOne($file);
                    if ($info) {//成功后补全字段
                        //处理数据表中需要的字段file、hasfile、filename
                        $post['file'] = UPLOAD_ROOT_PATH . $info['savepath'] . $info['savename'];//文件在磁盘上的存储路径
                        $post['hasfile'] = 1;//表示是否有文件,能走进来说明肯定有文件,所以为1
                        $post['filename'] = $info['name'];//文件的原始名称
                    }else{}
                    // 补全字段from_id和addtime
                    $post['from_id'] = session('id');//发件人id
                    $post['addtime'] = time();//发送时间
                    //数据保存
                    return $this->add($post);
                }else{
    
                }
            }
        }
    ?>

    效果图:

    数据成功保存到数据表

    (4)发件箱

    分析:

    控制器:EmailController.class.php

    方法:sendBox

    模板:sendBox.html

    下面分步进行

    第一步:创建方法sendBox,获取列表数据展示数据和模板文件

    注意:发件箱里需要显示出收件人的名字(数据表里存的是from_id收件人的id,所以需要联表查询数据)

    主表:sp_email(别名t1) ;从表:sp_user(别名t2)

    联表条件:t1.to_id = t2.id

    原生SQL:(两个方法table和join,table相当于join的inner内联,这里用table)

                       注意:table方法后跟两个表名,join方法后跟一个表名(左联)

    select t1.*,t2.truename as truename from sp_email as t1 left join sp_user as t2 on t1.to_id=t2.id where t1.from_id=当前用户id;

    将上述SQL代码复制到Navicate中执行结果

    接下来参考上述代码到ThinkPHP里去执行连贯操作,然后输出打印下查询结果

    浏览器测试后,显示出查询数据。接着将数据传递给模板,代码

    //sendBox方法,发件箱
            public function sendBox(){
                //联表查询当前用户已经发送的邮件
                $data = M('Email')->field('t1.*,t2.truename as truename')->alias('t1')->join('left join sp_user as t2 on t1.to_id=t2.id')->
    where('t1.from_id = '.session('id'))->select(); $this->assign('data',$data); $this->display(); }

    第二步:复制模板文件sendBox.html到指定位置,并换掉静态资源路径

    <table border="1" cellspacing="0" cellpadding="10">
        <thead>
            <tr><td>序号</td><td>收件人</td><td>标题</td><td>附件</td><td>内容</td><td>发送时间</td><td>状态</td><td>操作</td></tr>
        </thead>
        <volist name="data" id="vol">
            <tr>
                <td>{$vol.id}</td>
                <td>{$vol.truename}</td>
                <td>{$vol.title|msubstr=###,0,10}</td>
                <td>{$vol.filename|msubstr=###,0,16}
    <notempty name="vol.filename"><a href="__CONTROLLER__/download/id/{$vol.id}">【下载】</a></notempty>
    </td>
    <td>{$vol.content|msubstr=###,0,10}</td> <td>{$vol.addtime|date='Y-m-d H:i:s',###}</td> <td>
    <if condition="$vol.isread == 0"><span style="color:red">未读</span><else/><span style="color:green">已读</span></if>
    </td> <td> <a href="javascript:;" class="showBtn" data="{$vol.id}"" data-title="{$vol.title}">查看</a> | <a href="__CONTROLLER__/edit/id/{$vol.id}" class="editBtn">删除</a> </td> </tr> </volist> </table>

    显示效果:

    注意:

              1. 为了区别读取状态,这里我需要加判断。如果isread为0则表示未读,否则表示已读;

              2. 为了测试效果,我去Navicate里将isread手动修改为1,然后刷新浏览器测试(为了直观,可以在模板里加上颜色)

    第三步:添加附件下载功能

    //download下载附件
            public function download(){
                //接收id
                $id = I('get.id');
                //查询数据
                $data = M('Email') -> find($id);
                //下载代码,主要需要的是路径,接下来拼接路径
                $file = WORKING_PATH . $data['file'];
                //输出文件
                header("Content-type: application/octet-stream");//文件流,告诉浏览器输出的东西是文件流
                header('Content-Disposition: attachment; filename="' . basename($file) . '"');//文件名
                header("Content-Length: ". filesize($file));//文件大小
                //输出缓冲区
                readfile($file);
            }
  • 相关阅读:
    Visual Studio IDE 背景色该为保护眼睛色
    搭建windows server 2008 r2 FTP 后 开启防火墙无法访问的解决办法
    Div+CSS展示物流跟踪轨迹信息
    如何删除打印队列中的任务
    用SoapUI进行Webservice的性能压力测试
    C# httpwebrequest post 传输百分号‘%’
    在线转换工具
    JSON数据转换到POCO的代码
    后端接口的幂等性(转)
    全局流水ID号生成的几种方法
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/8711535.html
Copyright © 2020-2023  润新知