ICHARM
centos6.5搭建postfix邮件服务器小白攻略
centos6.5搭建postfix邮件服务器小白攻略

本来是想搭建web mail server,但是后来一想,反正只是自己使用,主要还是为了申请https证书时验证域名所有权使用的。所以转而选择postfix。这里要强烈吐槽下,为什么验证域名所有权要使用邮箱的方式,太麻烦。还是使用上传文件来验证的方式简单快捷。

当然使用postfix是有一定的好处的,当需要发送大量的邮件的时候,第三方的邮件服务就可能会限制发件次数。不过也有一些缺陷,就是有可能会被其他的邮件服务商视为垃圾邮件。好了,废话不多。

正在做一个股票预警提示的系统,需要大量的发送邮件,刚开始使用腾讯的smtp服务,但是其限制挺多的,测试的时候,就因为发送太频繁被封了一段时间。所以正好自己搭建一个smtp服务(只用来发送邮件,不用来接收邮件,如果要就收邮件就比较麻烦)。

知识储备

先了解几个email有关的名词

  • MUA:用户代理端,即用户使用的写信、收信客户端软件
  • MTA:邮件传送端,即常说的邮件服务器,用于转发、收取用户邮件。
  • MDA:邮件代理端,相当于MUA和MTA的中间人,可用于过滤垃圾邮件。
  • POP:邮局协议,用于MUA连接服务器收取用户邮件,通信端口110。
  • IMOP:互联网应用协议,功能较POP多,通信端口143。
  • SMTP:简单邮件传送协议,MUA连接MTA或MTA连接MTA发送邮件使用此协议,通信端口25。

postfix正是提供MTA功能的开源软件,这意味着不能像QQ邮箱那样直接在网页收发邮件,而是需要配合本地的MUA(类似于foxmail,outlook之类的软件)来进行可视化的邮件管理操作。

 

DNS解析

DNS解析配置可以参考下图,红色遮挡部分为主机外网ip:

http://www.icharm.me/wp-content/uploads/2016/11/QQ20161115-0.png

TXT的记录类型为解析SPF参数的,可以降低邮件被识别为垃圾邮件的概率。关于这条记录中的记录值怎么写可以参考:SPF语法

上图是使用博客域名来进行测试的,qq邮箱没有识别为垃圾邮件。其中红色遮挡部分为服务器的公网IP,下面的配置是使用51blogs.cn服务器作为测试的。所以和上图有点不同,对应着修改就行了。

修改完成后可以使用,spf在线测试工具,来进行测试:

http://www.icharm.me/wp-content/uploads/2016/11/538C014E-931B-43FC-90BF-590F47A2881E.jpg

 

安装postfix

[root@Centos ~]# rpm -e sendmail

首先卸载sendmail,有些linux发行版会自带sendmail(而且会以sendmail作为默认的MTA程序)。博主使用的腾讯云提供的镜像是没有sendmail的。

[root@Centos ~]# yum install postfix
[root@Centos ~]# yum install cyrus*

使用yum安装postfix,cyrus函数库(为postfix的stmp提供安全的验证支持)。

[root@Centos ~]# alternatives --display mta

查看当前系统默认的MTA程序是什么。如果没有自带sendmail,那么安装完postfix后默认的MTA为postfix。如果不是的则需要修改,如下:

[root@Centos ~]# /usr/sbin/alternatives --set mta /usr/sbin/sendmail.postfix

 

配置postfix

[root@VM_207_29_centos ~]# vim /etc/postfix/main.cf

##将下面的配置项注释取消,后面填上合适值##
myhostname = mail.51blogs.cn
#大约在75行,postfix主机名,修改成你的域名 此项需要添加A记录并指向postfix所在主机公网IP
mydomain = 51blogs.cn
#大约在83行,后面为主机域名
myorigin = $mydomain
#大约在100行,设置postfix邮箱的域名后缀为$mydomain,即51blogs.cn
inet_interfaces = localhost
#大约在117行
#指定postfix系统监听的网络接口 此处必须是localhost或127.0.0.1或内网ip
#若注释或填入公网ip  服务器的25端口将对公网开放
#默认值为all 即监听所有网络接口
#此项指定localhost后 本机postfix就只能发邮件不能接收邮件
inet_protocols = ipv4
#大约在120行,指定网络协议
mydestination = $myhostname, localhost.$mydomain, localhost
#大约在165行
#指定postfix接收邮件时收件人的域名,换句话说,也就是你的postfix系统要接收什么样的邮件。
#此项配置中$myhostname表示postfix接受@$myhostname为后缀的邮箱的邮件 逗号分割支持指多项
#此项默认值使用myhostname
local_recipient_maps =
#此项制定接收邮件的规则 可以是hash文件 此项对本次配置无意义 可以直接注释
mynetworks = 42.121.107.189, 10.200.9.xxx, 127.0.0.1 
#大约在266行
#指定你所在的网络的网络地址
#鄙人生产服务器公网IP42.121.107.189、内网ip10.200.9.xxx(第四位做了隐藏)、以及localhost的ip127.0.0.1
#请依据实际情况修改
smtpd_banner = JJonline.Cn ESMTP Server
#大约在571行
#指定MUA通过smtp连接postfix时返回的header头信息
#原始配置附带有postfix版本号 去掉即可,此项酌情处理


#SMTP Config
broken_sasl_auth_clients = yes
#指定postfix兼容MUA使用不规则的smtp协议--主要针对老版本的outlook 此项对于本次配置无意义
smtpd_client_restrictions = permit_sasl_authenticated
#指定可以向postfix发起SMTP连接的客户端的主机名或ip地址
#此处permit_sasl_authenticated意思是允许通过sasl认证(也就是smtp链接时通过了账号、密码效验的用户)的所有用户
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#发件人在执行RCPT TO命令时提供的地址进行限制规则 此处照搬复制即可
smtpd_sasl_auth_enable = yes
#指定postfix使用sasl验证 通俗的将就是启用smtp并要求进行账号、密码效验
smtpd_sasl_local_domain = $mydomain
#指定SMTP认证的本地域名 本次配置可以使用 smtpd_sasl_local_domain = '' 或干脆注释掉 默认为空
smtpd_sasl_security_options = noanonymous
#取消smtp的匿名登录 此项默认值为noanonymous smtp若能匿名登录危害非常大 此项请务必指定为noanonymous
message_size_limit = 5242880
#指定通过postfix发送邮件的体积大小 此处表示5M
######

 

SMTP

配置postfix启用sasldb2的账号密码验证方式:

vim /etc/sasl2/smtpd.conf
#向这个文件写入如下的内容(这个文件的路径为64位系统的,如果是32位系统应该在/usr/lib/sasl2/smtpd.cof)

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login CRAM-MD5 DIGEST-MD5

接下来新建一个连接stmp服务的用户名和密码:

[root@Centos ~]# saslpasswd2 -c -u `postconf -h mydomain` stock

上面命令会新建一个stock@51blogs.cn的用户,接着会让你输入密码,假设密码为123456789

新建完成后,可以使用sasldblistusers2命令 来查看 已经添加了哪些用户(密码使用userPassword代替):

[root@Centos ~]# sasldblistusers2
stock@51blogs.cn: userPassword

 

启动postfix

经过上面的配置,一个可以发送邮件的smtp服务已经搭建好了,接下来让postfix重启一下,并设置为开启启动

#测试postfix配置文件
[root@Centos ~]# service postfix check
#没有问题的话会返回着色[ok]字样
#重启postfix
[root@Centos ~]# service postfix restart
#设置postfix开机启动
[root@Centos ~]#  chkconfig postfix on
#更改sasldb2数据的权限,让postfix可以读取
[root@Centos ~]# chmod 755 /etc/sasldb2

 

测试smtp

这里哀差闷使用phpmailer的开源发送类来测试发送邮件,下面是代码:

<?PHP
/**
 * @abstract SMTP邮件发送函数、配置函数
 */
require_once("phpmailer/PHPMailerAutoload.php"); 


$mailconf = array(
	'51blogs' => array(
		'host' => 'localhost',
		'port' => 25,	//注意iptables有没有开放25
		'secure' => '',	//加密方式,没有 
		'username' => 'stock@51blogs.cn', //刚刚新建的stmp用户
		'password' => '123456789', 		 //对应的密码
		'formName' => '股票预警(ICHARM)', //显示在源邮件地址旁边的head
	),
);

function sendMail($to, $title ,$content, $conf ,$is_HTML = false){

	//引入PHPMailer的核心文件 使用require_once包含避免出现PHPMailer类重复定义的警告

	//示例化PHPMailer核心类
	$mail = new PHPMailer();
	//是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
	$mail->SMTPDebug = 0; 
	//使用smtp鉴权方式发送邮件,当然你可以选择pop方式 sendmail方式等 本文不做详解
	//可以参考http://phpmailer.github.io/PHPMailer/当中的详细介绍
	$mail->isSMTP();
	//smtp需要鉴权 这个必须是true
	$mail->SMTPAuth=true;
	//链接qq域名邮箱的服务器地址
	$mail->Host = $mailconf[$conf]['host'];
	//设置使用ssl加密方式登录鉴权
	$mail->SMTPSecure = $mailconf[$conf]['secure'];
	//设置ssl连接smtp服务器的远程服务器端口号 可选465或587
	$mail->Port = $mailconf[$conf]['port'];
	//设置smtp的helo消息头 这个可有可无 内容任意
	$mail->Helo = 'Hello smtp.51blogs.cn Server';
	//设置发件人的主机域 可有可无 默认为localhost 内容任意,建议使用你的域名
	$mail->Hostname = 'www.51blogs.cn';
	//设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
	$mail->CharSet = 'UTF-8';
	//设置发件人姓名(昵称) 任意内容,显示在收件人邮件的发件人邮箱地址前的发件人姓名
	$mail->FromName = $mailconf[$conf]['formName'];
	//smtp登录的账号 这里填入字符串格式的qq号即可
	$mail->Username =$mailconf[$conf]['username'];
	//smtp登录的密码 这里填入“独立密码” 若为设置“独立密码”则填入登录qq的密码 建议设置“独立密码”
	$mail->Password =$mailconf[$conf]['password'];
	//设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
	$mail->From = $mailconf[$conf]['username'];
	//邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
	$mail->isHTML($is_HTML); 
	//设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
	$mail->addAddress($to, NULL);
	//添加多个收件人 则多次调用方法即可
	//$mail->addAddress('xxx@163.com','晶晶在线用户');
	//添加该邮件的主题
	$mail->Subject = $title;
	//添加邮件正文 上方将isHTML设置成了true,则可以是完整的html字符串 如:使用file_get_contents函数读取本地的html文件
	$mail->Body = $content;
	//为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录(相对目录、或绝对目录均可) 第二参数为在邮件附件中该附件的名称
	//$mail->addAttachment('./d.jpg','mm.jpg');
	//同样该方法可以多次调用 上传多个附件
	//$mail->addAttachment('./Jlib-1.1.0.js','Jlib.js');
	 
	 
	//发送命令 返回布尔值 
	//PS:经过测试,要是收件人不存在,若不出现错误依然返回true 也就是说在发送之前 自己需要些方法实现检测该邮箱是否真实有效
	$status = $mail->send();
	 
	//简单的判断与提示信息
	if($status) {
	 	return true;
	}else{
		return false;
	 //echo '发送邮件失败,错误信息未:'.$mail->ErrorInfo;
	}
}

function sendMailVerify($to, $username, $url){
	$content = file_get_contents(GPATH_ROOT."/phpmail/mailVerify.tpl");
	$title = "账号激活-股票预警";
	$content = str_replace("{username}", $username, $content);
	$content = str_replace("{verifyurl}", $url, $content);
	$result = sendMail($to, $title, $content, "51blogs",true);
	return $result;
}

然后调用sendMailVerify()函数来执行发送。下面是收到邮件的截图:

http://www.icharm.me/wp-content/uploads/2016/11/QQ20161114-0.png

 

参考

http://blog.csdn.net/ikscher/article/details/9084313

http://blog.jjonline.cn/linux/185.html

http://www.open-open.com/lib/view/open1431592348122.html

发表评论

textsms
account_circle
email

ICHARM

centos6.5搭建postfix邮件服务器小白攻略
本来是想搭建web mail server,但是后来一想,反正只是自己使用,主要还是为了申请https证书时验证域名所有权使用的。所以转而选择postfix。这里要强烈吐槽下,为什么验证域名所有权要使…
扫描二维码继续阅读
2016-11-14