Centos6 安装Postfix+Dovecot

1.安装Postfix

rpm -e sendmail  //有些VPS需要删除自带的sendmail
yum remove sendmail  //有些VPS需要删除自带的sendmail
yum install -y postfix

修改MTA(默认邮件传输代理)

alternatives --config mta

出现如下显示直接回车:

Enter to keep the current selection[+], or type selection number:

查看是否设置成功

alternatives --display mta

第一行可以看到mta的状态。 例如:mat - status is manual.

2.安装Dovecot

yum install dovecot -y

1.配置Postfix

编辑/etc/postfix/main.cf,可以下载下来修改,也可以使用vim进行编辑:

yum install -y vim
vim /etc/postfix/main.cf

修改如下:

# 75行: 取消注释,设置
hostnamemyhostname = mail.nbu431.com
# 83行: 取消注释,设置域名
mydomain = nbu431.com
# 99行: 取消注释
myorigin = $mydomain
# 116行: 修改
inet_interfaces = al
l# 119行: 推荐ipv4,如果支持ipv6,则可以为all
inet_protocols = ipv4
# 164行: 添加
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# 264行: 取消注释,指定内网和本地的IP地址范围,因为现在的VPS基本内网IP就等于外网IP 所以X.X.X.X就是外网IP
mynetworks = X.X.X.X, 127.0.0.1
# 419行: 取消注释,邮件保存目录
home_mailbox = Maildir/
# 571行: 添加
smtpd_banner = $myhostname ESMTP

# 添加到最后
# 规定邮件最大尺寸为10M
message_size_limit = 10485760
# 规定收件箱最大容量为1G
mailbox_size_limit = 1073741824
# SMTP认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions=permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject

修改好了之后使用/etc/rc.d/init.d/postfix start开启postfix,使用chkconfig postfix on将postfix开机启动。

2.配置Dovecot

修改如下:

[[email protected] ~]# vim /etc/dovecot/dovecot.conf

# 26行: 如果不使用IPv6,请修改为*
listen = *
[[email protected] ~]# vim /etc/dovecot/conf.d/10-auth.conf
# 9行: 取消注释并修改
disable_plaintext_auth = no
# 97行: 添加
auth_mechanisms = plain login
[[email protected] ~]# vim /etc/dovecot/conf.d/10-mail.conf
# 30行: 取消注释并添加
mail_location = maildir:~/Maildir

[[email protected] ~]# vim /etc/dovecot/conf.d/10-master.conf
# 88-90行: 取消注释并添加
# Postfix smtp验证
unix_listener /var/spool/postfix/private/auth {
                       mode = 0666 
                       user = postfix 
                       group = postfix
}

[[email protected] ~]# /etc/rc.d/init.d/dovecot start
Starting Dovecot Imap:                    [ OK ] 

[[email protected] ~]# chkconfig dovecot on

 

域名解析

1、添加一个A记录解析为mail.xxx.com  绑定VPS IP地址

2、添加一个MX记录 名称为xxx.com 级别为10 值为:mail.xxx.com

3、添加一个TXT记录 名称为mail.xxx.com 内容为:”v=spf1 mx -all”

在这里需要说一下,VPS的系统用户就是邮件的用户:

例如root,它既是VPS的管理员用户,同时也是我们搭建的邮箱用户,作为邮箱用户,它的账号是:[email protected],邮箱密码就是vps的root登录密码。

3、开启防火墙

vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT

:wq! #保存
/etc/init.d/iptables restart   #重启防火墙

接下来我们测试一下postfix是否正常:

yum install telnet-server #安装telnet服务 
yum install telnet.*  #安装telnet客户端

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.daehub.com ESMTP Postfix      #在这里的时候再下一行输入ehlo localhost
ehlo localhost
250-mail.daehub.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

如果没有反应可以尝试输入:

service postfix restart

重启postfix试一下。

js 倒计时插件

    /**
     * [setCountDown description]
     * @type {Object}
     * @Author xiege
     * @param init  入口函数
     * @param opt{
     *              endtime:'',
     *              done:function(){},
     *              callback:function(){}
     *           }[endtime:结束时间,done:操作函数,callback:倒计时归零时回调函数]
     */
    var setCountDown = {
            timer:null,
            init:function(opt){
                var _this = this;
                this.setShowTime(opt.endtime,opt.done);
                this.timer = setInterval(function(){
                    _this.setShowTime(opt.endtime,opt.done,opt.callback)
                },1000)
            },
            getCountdown:function(time){
                var curShowTimeSecondsVal = this.getSecond(time) - this.getSecond();
                if(curShowTimeSecondsVal<0) return [0,'00','00','00'];
                // console.log(curShowTimeSecondsVal)
                // 剩余秒数
                var curShowTimeSeconds = parseInt(curShowTimeSecondsVal%60);
                // 计算剩余天数
                var curShowTimeDays = parseInt(curShowTimeSecondsVal/3600/24);
                // 计算剩余小时
                var curShowTimeHours = parseInt((curShowTimeSecondsVal/3600)) - curShowTimeDays*24;
                // 计算剩余分钟
                var curShowTimeMinutes = parseInt((curShowTimeSecondsVal - parseInt((curShowTimeSecondsVal/3600))*3600)/60);
                curShowTimeHours = curShowTimeHours > 9 ? curShowTimeHours : '0' + curShowTimeHours;
                curShowTimeSeconds = curShowTimeSeconds > 9 ? curShowTimeSeconds : '0' + curShowTimeSeconds;
                curShowTimeMinutes = curShowTimeMinutes > 9 ? curShowTimeMinutes : '0' + curShowTimeMinutes;
                return [curShowTimeDays,curShowTimeHours,curShowTimeMinutes,curShowTimeSeconds];
            },
            getSecond:function(times){
                if(times){
                    var year = parseInt(times.slice(0,4)),
                        month = parseInt(times.match(/-\d*/gi)[0].replace('-','')-1),
                        day = parseInt(times.match(/-\d*/gi)[1].replace('-','')),
                        hour = parseInt(times.match(/\d*:/)[0].replace(':','')),
                        minute = parseInt(times.match(/:\d*/)[0].replace(':',''));
                    return (new Date(year,month,day,hour,minute,0)).getTime()/1000;
                }
                return (new Date()).getTime()/1000;
            },
            setShowTime:function(endtime,done,callback){
                var _this = this;
                // var oSetTime = document.getElementById('time');
                var day = this.getCountdown(endtime)[0],
                    hour = this.getCountdown(endtime)[1],
                    minute = this.getCountdown(endtime)[2],
                    second = this.getCountdown(endtime)[3];
                done([day,hour,minute,second])
                // oSetTime.innerHTML = '剩余时间:'+day+'天'+hour+'小时'+minute+'分'+second+'秒';
                if(day==0&&hour=='00'&&minute=='00'&&second=='00'){
                    clearInterval(_this.timer);
                    _this.timer = null;
                    if(callback) callback();
                }
            }
        };
    setCountDown.init({
        endtime:start, //结束时间  2017-08-13 02:00
        done:function(data){
            // console.log(data)
            document.getElementById('time').innerHTML = '剩余时间:'+data[0]+'天'+data[1]+'小时'+data[2]+'分'+data[3]+'秒';
        },
        callback:function(){
            // window.location.reload()
            //callback –> 回调函数,用于当倒计时结束时的回调,作相应的操作
        }
    })

 

laravel Cookie使用

1、首先引入

use Illuminate\Support\Facades\Cookie;

2、写入数据

Cookie::queue('test','hello',20);    //队列
Cookie::make('test','hello',20);    //写入

3、获取数据,依赖于 Request,所以我们需要首先引入

use Symfony\Component\HttpFoundation\Request;

4、获取数据

$request->cookie('test');

5、清除cookie

Cookie::forget('test');

 

laravel Eloquent in 查询

whereIn 方法验证指定字段的值包含在指定的数组之内:

$users = DB::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();

whereNotIn 方法验证指定字段的值包含在指定的数组之内:

$users = DB::table('users')
                    ->whereNotIn('id', [1, 2, 3])
                    ->get();

 

centos 清理日志文件

1、查看日志文件命令:

last -f

比如查看可疑ip登陆

last -f /var/log/wtmp

为了方便清理。找了个清理日志的脚本(clearLog.sh):

#!/bin/sh
cat /dev/null > /var/log/syslog
cat /dev/null > /var/adm/sylog
cat /dev/null > /var/log/wtmp
cat /dev/null > /var/log/maillog
cat /dev/null > /var/log/messages
cat /dev/null > /var/log/openwebmail.log
cat /dev/null > /var/log/maillog
cat /dev/null > /var/log/secure
cat /dev/null > /var/log/httpd/error_log
cat /dev/null > /var/log/httpd/ssl_error_log
cat /dev/null > /var/log/httpd/ssl_request_log
cat /dev/null > /var/log/httpd/ssl_access_log

另外清理linux系统垃圾还有以下命令

sudo apt-get autoclean 清理旧版本的软件缓存

sudo apt-get clean 清理所有软件缓存

sudo apt-get autoremove 删除系统不再使用的孤立软件

 

laravel ftp 驱动上传文件

1、因为laravel默认filesystems文件是没有ftp配置的,所以我们先配置一下。

filePath: /config/filesystems.php

'ftp' => [
            'driver'   => 'ftp',
            'host'     => 'FTP地址',
            'username' => 'FTP 用户名',
            'password' => 'FTP密码',
            'port'     => 21,  //ftp端口
            'root'     => '/',  //ftp目录
        ],

2、在控制器进行上传操作

            $file = $request->file('img');   //img 是input 的name值

            //判断文件是否上传成功
            if ($file->isValid()) {

                //原文件名称
                $originName = $file->getClientOriginalName();

                //文件扩展名
                $ext = $file->getClientOriginalExtension();

                //文件类型
                $type = $file->getClientMimeType();

                //临时绝对路径
                $realPath = $file->getRealPath();

                //存储文件名
                $filenName = date("Y-m-d").'-'.uniqid().'.'.$ext;

                //执行上传文件
                $bool = Storage::disk('ftp')->put($filenName,file_get_contents($realPath));

            }

 

laravel ORM 遍历一对一关联数据

laravel中两个表做数据关联,这里是一个实际例子,一个产品表products,一个产品视频介绍二维码表pqrcodes,两个表中数据一对一关系,在产品详细信息展示页面想将产品的二维码信息同时展示出来,比如二维码过期时间等,这样就需要对两个表进行数据关联。

Product模型


namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

   protected $table='products';
   //关联Pqrcode表
   public function pqrcode(){
       //id是pqrcodes的主键,qid是products中pqrcodes的外键
       return $this->hasOne('App\Pqrcode','id','qid');
   }
}

Pqrcode模型

namespace App;

use Illuminate\Database\Eloquent\Model;

class Pqrcode extends Model
{
    protected $table = 'pqrcodes';
}

控制器中调用

$products = Product::with('pqrcode')->where('uid','=',Auth::user()->id)->get();

我采用的是预加载方法with(),这样可以加快速度。

将$products变量注册到前端页面

return view('home.member.index')->with('products',$products);

前端页面中调用关联表中的数据

@foreach($products as $item)
<tr>
    <td>{{$item['id']}}</td>
    <td>{{$item['name']}}</td>
    <td>状态</td>
    <td>{{$item['pqrcode']['expired_at']}}</td>
    <td><button class="btn btn-primary show-qrcode" id="show-qrcode-{{$item['id']}}">查看二维码</button></td>
</tr>
@endforeach

 

apt出现no public key available for the following key IDs

今天使用apt-get update更新时出现了报错:

Reading package lists... Done
W: There is no public key available for the following key IDs:
6FB2A1C265FFB764

 

出现没有key的问题。

骨骼了下。解决记录下

apt-get install debian-keyring debian-archive-keyring
安装key源
apt-key update
更新key

接着apt-get update
解决

 

laravel 中间件添加、注册、使用

添加:

在app/Http/Middleware/下面新增中间件例如:app/Http/Middleware/Huodong.php

namespace App\Http\Middleware;

use Closure;

class Huodong
{

    //handle 是固定方法。
    public function handle($request,Closure $next)
    {
       if (time() < strtotime('2017-06-28')) {
            return redirect('member/huodong');
       }
       return $next($request);

       //$next 后面执行的逻辑 叫后置操作。
    }


}

中间件注册

app/Http/Kernel.php

 protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'huodong'  => \App\Http\Middleware\Huodong::class,   //这个是新增
    ];
}

中间件使用,在路由中增加

Route::get('member/huodong',['uses' => '[email protected]']);

//这个是中间件
Route::group(['middleware' => ['huodong']],function(){
    Route::get('member/huodong1',['uses' => '[email protected]']);
});