CentOS6.5 安装Mail Server Postfix & dovecot 架构

前言

在Linux 的Mail Server 中,大多都是使用Sendmail or Postfix 为主的MTA Server,但随着Sendmail 功能越来越多,也造成了程式肥大且资安漏洞的问题,大多的设定较不易了解。而Postfix 是目前最简单设定,且资安防护比Sendmail 好很多,在CentOS6.x 已从预设的Sendmail 改为Postfix。

架构与观念

postfi1

Mail Server的整个流程及概念是由几个专有名词而组成的

MUA (Mail User Agent):担任Client 端Active 的角色,例如Microsoft Outlook / Thunderbird 等主动发出收信及寄信的软体。

MTA (Mail Transfer Agent):协助MUA ( Client ) 将信件寄出和接收信件讯息,例如Sendmail、Postfix 等Mail Server。

MDA (Mail Delivery Agent):在MUA 收到信件后,由MDA 决定信件该去哪里,简单来说就是一个过滤的功能,常见的有procmail、Mailscanner + Spamassassion、maildrop、dovecot 这些都可以提供MDA 的实现。

Mailbox / Maildir:就是电子邮件放置的位置。

Mailbox 是早期所使用的储存格式,将所有电子邮件由一个档案组成,但在效能、扩充等等能力皆受到考验,已渐渐由Maildir 替代。

Maildir 储存方式为每一封邮件为一个档案,多数功能都比Mailbox 优,但对于超大型的Maildir 搜寻效能将受到考验,且有早期的Web Mail 不支援Maildir ( Openwebmail 2.01 before )

环境 & 目的

需要可收发的Mail Server,并且需要Webmail 可使用
OS & Service : CentOS 6.5 64bit、SMTP、POP3、IMAP、HTTP

Package :
postfix-2.6.6-6.el6_5.x86_64
cyrus-sasl-md5-2.1.23-13.el6_3.1.x86_64
cyrus-sasl-2.1.23-13.el6_3.1.x86_64
cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64
cyrus-sasl-lib-2.1.23-13.el6_3.1.x86_64
dovecot-2.0.9-7.el6.x86_64
openwebmail-data-2.53-3.i386
openwebmail-2.53-3.i386

设定 Postfix & sasl 验证

SETP.1 安装套件

[php]yum -y install postfix cyrus-sasl-md5 cyrus-sasl-plain cyrus-sasl[/php]

SETP.2 设定 postfix , main.cf

[php]vim /etc/postfix/main.cf
myhostname = 81tu.com // HostName
mydomain = 81tu.com // Mail domain , example: eric@81tu.com
inet_interfaces = all // 允许 all 都可以通过 mail server 转发邮件。
inet_protocols = ipv4 // 只接受使用 ipv4 協定
mynetworks = 10.XXX.XXX.0/24, 221.XX.XX.0/24, 127.0.0.0/8 //10开头的代表的是内网ip,221是公网的ip
mydestination = 81tu.com,mail.81tu.com $myhostname, localhost.$mydomain, localhost, mydomain // 能夠收信的主機名稱,如果 MX 標誌務必加入此行。

# 以下为sasl auth setting
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination[/php]

SETP.3 启动服务

[php]chkconfig saslauthd on
service saslauthd restart
chkconfig postfix on
service postfix restart[/php]

SETP.4 开启防火墙对应的端口

[php]# SMTP
iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
# POP
iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 110 -j ACCEPT
# POP3S
iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 995 -j ACCEPT
# IMAP
iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 143 -j ACCEPT
# IMAPS
iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 993 -j ACCEPT[/php]

SETP.5 用 telnet 工具检测

[php]yum -y install telnet
iptables -F //不执行这个会出现解析不到主机
telnet mail.81tu.com 25
ehlo localhost [/php]

postfix2
出现AUTH PLAIN LOGIN (AUTH=PLAIN LOGIN ) 即设定完成

验证目标为本机使用者,并且提供imap 服务给webmail、pop3 给MUA

设定 dovecot

SETP.6安装套件

[php]yum -y install dovecot[/php]

SETP.7 编辑设定档 , dovecot.conf

[php]vim /etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp // 这里设定的服务启动后会Listen port,范例imap(143)、POP3(110)[/php]

SETP.8 编辑设定档 , 10-auth.conf

[php]vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no // 取消明码传输, 若无取消在MUA端预设禁止明码会出现error。 [/php]

SETP.9 编辑设定档 , 10-mail.conf

[php]vim /etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u // 用maildir储存格式并放到使用者的家目录~ [/php]

SETP.10 启动服务

[php]chkconfig dovecot on
service dovecot restart[/php]

SETP.11 建立帐号, 范例使用本机帐号验证,最好的方式还是使用LDAP

[php]adduser user1
passwd user1
usermod -s /sbin/nologin user1 // 资安因素不让帐号允许登入
chmod -R 0777 /var/mail [/php]

SETP.12 检查
postifx3

关于openwebmail的配置,我配置之后无法打开允许,是不是因为没有安装perl安装后也无法允许所以暂时没有搞懂,有懂的欢迎留言,先行谢过

文章内容主要来源台湾网站,有点小问题,不够完善,而且国内访问不了,特此转来。
原地址:http://shazi.twbbs.org/centos6-5-%E5%AE%89%E8%A3%9Dmail-server-%E4%B8%80-postfix-%E6%9E%B6%E6%A7%8B/

窃听风云3片尾曲 共你痴痴爱在 容祖儿 超高音质 下载

黄耀明 风云
容祖儿翻唱的歌名叫《共你痴痴爱在》

共你痴痴爱在 – 容祖儿
(电影《窃听风云3》主题曲)
词:
曲:顾嘉辉
青山原是我身边伴
伴着白云在我前
碧海是我的心中乐
与我风里渡童年

当初你面对山海约誓
此生相爱永不变
想不到海山竟多变幻
再也不见旧时面

是谁令青山也变
变了俗气的嘴脸
又是谁令碧海也变
变作俗流滔天

风中仍共你痴痴爱在
未让浮云坏诺言
即使那海枯青山陷
与你的约誓 也不变迁

是谁令青山也变
变了俗气的嘴脸
又是谁令碧海也变
变作俗流滔天

链接: http://pan.baidu.com/s/1pJrzAR5 密码: mnsi

wordpress左侧根据主菜单,自动显示子导航菜单栏目

22
11
根据后台设置的导航菜单
获取当前菜单的子菜单,若果没有子菜单,则返回到父级菜单,显示左侧导航。
参考http://www.webfinder.cn/archives/163.html
返回的是数组,在函数中对数组进行了处理。
对一些不在导航菜单中显示分类进行了单独处理。
目前只处理了一级下拉菜单的情况。有需要的可以进行完善。
一篇文章有多个分类情况$queried_object_id有时候会出现并不是预期的值。希望高手指教。
只需要在分类页面对应位置写上
[php]<?php echo get_sub_menu(); ?>[/php]
对应的格式可以修改下面的代码。
[php]
function get_sub_menu($menu_name=’primary’,$num=’0′){

global $wp_query;
//获取当前页面分类信息
$cat = get_the_category(); $cat = $cat[0];
$queried_object_id = (int) $wp_query->queried_object_id;

$locations = get_nav_menu_locations();
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

$menuitems = wp_get_nav_menu_items( $menu->term_id, array( ‘order’ => ‘DESC’ ) );
$parent_id=false;
$home_page_id = $home_page_id = (int) get_option( ‘page_for_posts’ );
//单页面$queried_object_id匹配为当前分类的ID
if(is_single()){
$queried_object_id=$cat->cat_ID;
}

foreach ($menuitems as $item){

if ($item->object_id==$queried_object_id && (
‘taxonomy’ == $item->type || ‘post_type’ == $item->type || ‘custom’ == $item->type
)) {
//此处只判断一级下拉菜单的情况
if($item->menu_item_parent==0 ){
$parent_id = $item->ID;
break;
}else{
$parent_id = $item->menu_item_parent;
break;
}
}
}

if ($parent_id!==false) {
foreach ($menuitems as $item){

if ($item->menu_item_parent==$parent_id) {
$sub_menu[]=(array)$item;
}
if (!empty($sub_menu)&&$item->ID==$parent_id) {
$output .='<div class="lsmainlf1">
<div class="lsmainlf1top">’;
$output .= $item->title.'</div>
</div>
<div class="lsmainlf2">
<ul>’;
}
}
}else{
$sub_menu = ”;
}

if(!empty($sub_menu)){
foreach ($menuitems as $item){

if ($item->ID==$parent_id) {
$output .='<div class="lsmainlf1">
<div class="lsmainlf1top">’;
$output .= $item->title.'</div>
</div>
<div class="lsmainlf2">
<ul>’;
}
}

foreach ($sub_menu as $k=>$v){
if ($v[‘menu_item_parent’]==0) {
$output .='<div class="lsmainlf1">
<div class="lsmainlf1top">’;
$output .= $v[‘title’].'</div>
</div>
<div class="lsmainlf2">
<ul>’;
}else{
$output .= ‘<li><a href="’.$v[‘url’].’"’;
if($v[‘object_id’]==$queried_object_id){ $output .= ‘ class="cur"’;}
$output .= ‘>’.$v[‘title’].'</a></li>’;
}
}
$output .= ‘</ul>
</div>
<div class="lsmainlf3"></div>’;
}elseif($cat->cat_name){
$cat_ID=$cat->cat_ID;
$output .='<div class="lsmainlf1">
<div class="lsmainlf1top">’;
$output .= $cat->cat_name.'</div>
</div>
<div class="lsmainlf2">
<ul>’;

$output .= ‘<li><a href="’.get_category_link( $cat_ID).’"’;
$output .= ‘ class="cur"’;
$output .= ‘>’.$cat->cat_name.'</a></li>’;
$output .= ‘</ul>
</div>
<div class="lsmainlf3"></div>’;

}else{

$output .='<div class="lsmainlf1">
<div class="lsmainlf1top">’;
$output .= get_the_title().'</div>
</div>
<div class="lsmainlf2">
<ul>’;

$output .= ‘<li><a href="’.get_category_link( $cat_ID).’"’;
$output .= ‘ class="cur"’;
$output .= ‘>’.get_the_title().'</a></li>’;
$output .= ‘</ul>
</div>
<div class="lsmainlf3"></div>’;
}
return $output;
}
[/php]

wordpress通过自定义栏目排序,不添加,也可以正常显示

在主题的functions.php中添加以下代码
_li_love_count为自定义的字段名称

function lovesort($query)
{ $query->set('meta_query', array(
'relation' => 'OR',
array( //check to see if _li_love_count has been filled out
'key' => '_li_love_count',
'compare' => '=',
'value' => int
),
array( //if no _li_love_count has been added show these posts too
'key' => '_li_love_count',
'value' => int,
'compare' => 'NOT EXISTS'
)
) );
$query->set('meta_key' , '_li_love_count');
$query->set('orderby' , 'meta_value_num');
$query->set('order' , 'desc');
}
add_filter('pre_get_posts' , 'lovesort');

wordpress 火车头自动发布时下载图片并设置为缩略图

是在原来的火车头自动发布的基础上进行增加了下缩略图的下载并添加,采集的时候并不需要下载图片。
//引用系统文件
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
//通过url下载远程图片
$image = media_sideload_image($post_img, $postID, $post_title);