关于postfix邮件服务器
如果你完全是内网,那就没戏,配置出来也发不出邮件。不完全的内网的意思是可以操控外网IP,需要在路由器上做一个端口转发,通常把25、110、465(SSL)、995(SSL)这些端口转发到你内网的主机IP上,当然这样内网的IP就要设成固定的。如果是ADSL通常都是采用花生壳软件来实现动态IP解析。 http://wwworaycn,或者 http://www3322org比如你申请了一个 123vicpnet 的动态域名,这样用花生壳软件实现它自动解析到你的动态IP。然后你有自己的域名如 abccom,就需要把 abccom的mx记录设置成 123vicpnet,记住是abccom的mx记录,而不是mailabccom的mx记录。
不知道您为什么要自己搭建邮件服务器+web邮箱系统。对新手而言,是一件挺有挑战性的事情。
邮件服务器一般我们会考虑网络上很多免费的,它们一般技术成熟,服务器稳定,而且都是免费的。您架设的,质量上不一定比它们更好。
而web邮箱管理系统,目前也有很多。对今天的用户而言,也没有太多吸引力,因为有很多的替代品。微软的outlook,国产的foxmail都有多年的历史,也很优秀。而现在移动互联网时代,手机App也很有优势。
我猜测,您是不是想让会员在站内发短信?这跟邮件是两码事。
或者,您只是想通过php系统,给会员的邮箱发邮件?这用不着您架设邮件服务器。
当然,您可能爱上了Postfix,因为偶尔得到一个别致的领带胸针,最后为它配了一整套的西装革履也有可能。
好吧,我来回答您的问题。
1、如何对Postfix收到邮件进行管理?
您需要编写基本的两个程序,收和发。收和发的代码,比比皆是,代码并不复杂。但是您要弄清楚架构。
您的邮件服务器和邮件用户代理服务器(会员系统)在同一个主机上,但您得想成是两个服务,两个系统。就是说,您收邮件时候,读取到邮件后,将数据存到会员系统的mysql上。这个邮件在这台服务器上实际上有两份了。一般服务器软件不会用到mysql,邮件以其他形式在硬盘上存储。
发邮件,您可以通过您Postfix提供的smtp服务往外发。数据您自己通过php程序保留一份,在您会员系统的mysql里。Postfix没必要保留发出去的邮件。
2mysql在这里面的角色是不是只管理用户的帐号密码信息?
如上所述,mysql当然要保留用户的帐号密码信息。但不仅如此,要保留发件的内容,还要放收到的邮件内容。
3对于新手来说怎样做最容易达到预期效果。
万能的百度,一切用现成的就好。
您找到了Postfix,这是邮件服务器。这个架设也不难,网上教程比比皆是。
如果只想做邮件,不想其他的,您搜一个免费的Webmail在线邮件系统就好了。英文的较多,自己做一下汉化。PostfixAdmin可以研究下,它可以和Postfix实现mysql数据共享。
中文的,extmail比较有名,它是一个套件,什么都有,包括Postfix,拿来研究下直接用,无需二次开发。
pop3端口是邮件接收端口,如果你要用他来接收邮件的话就必须打开。
用什么方式接收邮件就看你开了什么端口。pop3的话就要用outlook之类的邮件客户端了。
不开pop3的话就意味着不能通过outlook之类的接收邮件
postfix的安装过程
31原始码包的安装
1. 获取postfix的原始码包
从postfix官方站点wwwpostfixorg取得postfix的原始码包postfix-19991231-pl08targz。将其拷贝到/tmp
2.解开原始码包,将生成/tmp/ postfix-19991231-pl08目录。
tar xvzf postfix-19991231-pl08targz
3.编译原始码包
cd /tmp/ postfix-19991231-pl08
make
4.建立一个新用户“postfix”,该用户必须具有唯一的用户id和组id号,同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程式和可用的用户宿主目录。我们能先用adduser postfix 添加用户再编辑/etc/passwd文件中的相关条目如下所示:
postfix::12345:12345:postfix:/no/where:/no/shell
5.确定/etc/aliases文件中包含如下的条目:
postfix: root
6. 以root用户登录,在/tmp/ postfix-19991231-pl08目录下执行命令:
/installsh
7. 启动postfix
# postfix start
8.关于maildrop目录权限的说明:
postfix能使用一个所有用户都可写的(也即目录权限为1773)的maildrop
目录来让本地用户提交邮件。这种方法避免了使用set-uid 或 set-gid 软件,并且在邮件系统不可用时,用户仍然能提交邮件。其他用户没有访问该目录中的队列文件的权限。接收来自网络的邮件时postfix不使用maildrop目录。不过,由于该目录的权限是733,其他用户能建立一个硬连接到该目录中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致安全性问题。如果你想要使用这种方式来让用户提交邮件,就要在installsh 脚本问你是否需要set-gid 时回答no。
如果你的系统有多个用户的话,最佳取消以上的方式而采用利用set-gid 用
户权限提交邮件的方式。这时,我们首先需要建立一个组id唯一的组"maildrop" 并且确定该组中没有用户成员。然后在installsh 问你是否需要set-gid 时指定"maildrop"。
提示:在安装postfix之前,请删除已安装的sendmail。
32 rpm包的安装
1. 获取postfix的rpm软件包。
我们能从http://wwwalltradinges/postfix/rpms/i386/ 获得postfix的rpm软件包。当前的最新版本是postfix-20000531-2i386rpm。
2. 备份你的/etc/aliases和/etc/aliasesdb,因为postfix要使用该别名数据库。
3. 用以下命令查看系统是否安装了sendmail:
[root@mail /root]# rpm -qa |grep sendmail
sendmail-doc-893-15
sendmail-893-15
sendmail-cf-893-15
4. 用以下命令强行卸载sendmail:
[root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps
5. 用以下命令杀死运行中的sendmail进程:
[root@mail /root]# killall sendmail
6. 安装postfix:
7. 启动postfix
[root@mail /root]# /etc/rcd/initd/postfix start
33 设置系统每次启动时自动启动postfix
1如果你安装的是postfix的原始码包,能在/etc/rcd/rclocal文件中加入如下的语句让系统每次启动时自动启动postfix:
if [ -f /usr/libexec/postfix ]; then
/usr/libexec/postfix start
fi
2如果你安装的是postfix的rpm包,能通过setup命令来设置在系统启动时启动postfix。
四、 postfix的设置详解
41 postfix的设置文件结构
postfix的设置文件位于/etc/postfix下,安装完postfix以后,我们能通过ls命令查看postfix的设置文件:
[root@mail postfix]# ls
installcf maincf mastercf postfix-script
这四个文件就是postfix最基本的设置文件,他们的差别在于:
mailcf:是postfix主要的设置文件。
installcf:包含安装过程中安装程式产生的postfix初始化设置。
mastercf:是postfix的master进程的设置文件,该文件中的每一行都是用来设置postfix的组件进程的运行方式。
postfix-script:包装了一些postfix命令,以便我们在linux环境中安全地执行这些postfix命令。
42 postfix的基本设置
postfix大约有100个设置参数,这些参数都能通过maincf 指定。设置的格式是这样的,用等号连接参数和参数的值。如:
myhostname = mailmydomaincom
等号的左边是参数的名称,等号的右边是参数的值; 当然,我们也能在参数的前面加上$来引用该参数,如:
myorigin = $myhostname
虽然postfix有100个左右的参数,不过postfix为大多数的参数都设置了缺省值,所以在让postfix正常为你服务之前,你只需要设置为数不多的几个参数。下面我们一起来看一看这些基本的postfix参数。需要注意的是,一旦你更改了maincf文件的内容,则必须运行postfix reload命令使其生效。
1. myorigin
myorigin参数指明发件人所在的域名。如果你的用户的邮件地址为user@domaincom,则该参数指定@后面的域名。缺省地,postfix使用本地主机名作为myorigin,不过建议你最佳使用你的域名,因为这样更具有可读性。比如:安装postfix的主机为maildomaincom则我们能这样指定myorigin:
myorigin = domaincom
当然我们也能引用其他参数,如:
myorigin = $mydomain
2. mydestination
mydestination参数指定postfix接收邮件时收件人的域名,换句话说,也就
是你的postfix系统要接收什么样的邮件。比如:你的用户的邮件地址为user@domaincom, 也就是你的域为domaincom, 则你就需要接收所有收件人为user_name@domaincom的邮件。和myorigin相同,缺省地,postfix使用本地主机名作为mydestination。
3. notify_classes
在postfix系统中,必须指定一个postfix系统管理员的别名指向一个用户,
只有这样,在用户遇见问题时才有报告的对象,postfix也才能将系统的问题报告给管理员。notify_classes参数就是用来指定向postfix管理员报告错误时的信息级别。共有以下几种级别:
bounce:将不能投递的邮件的拷贝发送给postfix管理员。出于个人隐私的缘故,该邮件的拷贝不包含信头。
2bounce:将两次不可投递的邮件拷贝发送给postfix管理员。
delay:将邮件的投递延迟信息发送给管理员,仅仅包含信头。
policy:将由于uce规则限制而被拒绝的用户请求发送给postfix管理员,包含整个smtp会话的内容。
protocol:将协议的错误信息或用户企图执行不支持的命令的记录发送给postfix管理员。同样包含整个smtp会话的内容。
resource:将由于资源错误而不可投递的错误信息发送给postfix管理员,比如:队列文件写错误等等。
software:将由于软件错误而导致不可投递的错误信息发送给postfix管理员。
缺省值为:
notify_classes = resource, software
4.myhostname
myhostname 参数指定运行postfix邮件系统的主机的主机名。缺省地,该值被设定为本地机器名。你也能指定该值,需要注意的是,要指定完整的主机名。如:
myhostname = maildomaincom
5.mydomain
mydomain参数指定你的域名,缺省地,postfix将myhostname的第一部分删除而作为mydomain的值。你也能自己指定该值,
6.mynetworks
mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来差别用户是远程的还是本地的,如果是本地网络用户则允许其访问。你能用标准的a、b、c类网络地址,也能用cidr(无类域间路由)地址来表示,
7.inet_interfaces
inet_interfaces 参数指定postfix系统监听的网络接口。缺省地,postfix监听
所有的网络接口。如果你的postfix运行在一个虚拟的ip地址上,则必须指定其监听的地址。
43 postfix的uce(unsolicited commercial email)控制
所谓uce控制就是指控制postfix接收或转发来自于什么地方的邮件。
缺省地,postfix转发符合以下条件的邮件:
来自客户端ip地址符合$mynetworks的邮件。
来自客户端主机名符合$relay_domains及其子域的邮件。
目的地为$relay_domains及其子域的邮件。
缺省地,postfix接受符合以下条件的邮件:
目的地为$inet_interfaces的邮件。
目的地为$mydestination的邮件。
目的地为$virtual_maps的邮件。
不过我们也能通过下面的规则来实现更强大的控制功能。
1. 信头过滤
通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。能指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。
2.客户端主机名/地址限制
通过smtpd_client_restrictions参数限制能向postfix发起smtp 连接的客户端的主机名或ip地址。能指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。
3 是否请求helo命令
能通过smtpd_helo_required参数指定客户端在smtp会话的开始是否发
送一个helo命令。你能指定该参数的值为yes或no。
4 helo主机名限制
能通过smtpd_helo_restrictions参数指定客户端在执行helo命令时发送
给postfix的主机名。缺省地,postfix接收客户端发送的任意形式的主机名。能指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。
5 rfc 821信头限制
rfc 821对邮件的信头做了严格的规定,不过广泛使用的sendmail并不支
持该规定,所以对于该参数我们只能说不,
6 通过发件人地址进行限制
能用smtpd_sender_restrictions参数通过发件人在执行mail from命令时提供的地址进行限制。能指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。
reject_unknown_sender_domain:如果mail from命令提供的主机名在dns中没有相应的a 或 mx 记录则拒绝该客户端的连接请求。能用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。
check_sender_access maptype:mapname:根据mail from命令提供的主机名、父域搜索access数据库。如果搜索的结果为reject 或 "[45]xx text" 则拒绝该客户端的连接请求;如果搜索的结果为ok、relay 或数字则接受该客户端的连接请求。能用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。能通过该参数过滤来自某些不受欢迎的发件人的邮件。
reject_non_fqdn_sender:如果mail from命令提供的主机名不是rfc规定的完整的域名则拒绝客户端的连接请求。能用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。
缺省地,postfix接受来自所有发件人的邮件。
7 通过收件人地址进行过滤
能用smtpd_recipient_restrictions参数通过发件人在执行rcpt to命令
时提供的地址进行限制。缺省值为:
smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains
能指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序
进行的,第一条符合条件的规则被执行。可用的规则有:
check_relay_domains:如果符合以下的条件,则接受smtp连接请求,否则拒绝该连接,能用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。
客户端主机名符合$relay_domains及其子域
目的地为$inet_interfaces、$mydestination或$virtual_maps
permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就
接受smtp连接请求:
解析后的目标地址符合$relay_domains及其子域
解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps
reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,
就拒绝该客户端smtp连接请求:
解析后的目标地址符合$relay_domains及其子域
解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps
check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为reject 或 "[45]xx text" 则拒绝该客户端的连接请求;如果搜索的结果为ok、relay 或数字则接受该客户端的连接请求。能用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。
reject_unknown_recipient_domain:如果收件人的邮件地址在dns中没有相应的a 或 mx 记录则拒绝该客户端的连接请求。能用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。
reject_non_fqdn_recipient:如果发件人在执行rcpt to命令时提供的地址
不是完整的域名则拒绝其smtp连接请求。能用the non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。
0条评论