一()

邮件相关协议

  • SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 工作在TCP的25端口。它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。跟名字一样smtp非常简单,无法做到认证,邮件存放等功能。

  • POP3(Post Office Protocol)邮局协议第3版,工作在TCP的110端口。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是PC机或 MAC。一旦邮件发送到 PC 机或MAC上,邮件服务器上的邮件将会被删除。但目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。

  • IMAP4(Internet Mail Access Protocol)因特网邮件访问协议第4版,工作在TCP的143端口。IMAP4协议与POP3协议一样也是规定个人计算机如何访问网上的邮件的服务器进行收发邮件的协议,但是IMAP4协议同POP3协议相比更高级。IMAP4支持协议客户机在线或者离开访问并阅读服务器上的邮件,还能交互式的操作服务器上的邮件。IMAP4协议更人性化的地方是不需要像POP3协议那样把邮件下载到本地,用户可以通过客户端直接对服务器上的邮件进行操作(这里的操作是指:在线阅读邮件 在线查看邮件主题 大小 发件地址等信息)。用户还可以在服务器上维护自己邮件目录(维护是指移动)新建 删除重命名共享 抓取文本 等操作)。IMAP4协议弥补了POP3协议的很多缺陷。

邮件相关名词

一般情况下,我们把电子邮件程序分解成传输代理,投递代理用户代理。用户代理用来接受用户的指令,将用户的信件传送至信件传输代理.而投递代理则从信件传输代理取得信件传送至最终用户的邮箱.当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件提交给它。信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目标地址负责的邮件传输代理服务器, 并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者查看自己的电子信箱。

MTA(Mail Transfer Agent)

邮件传输代理工具,通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。常用的MTA有:

  • SendMail:邮件的鼻祖。

  • Qmail:一个数学家开发,作为Linux下面主流的邮件系统内核,大量著名的商业邮件系统都是在Qmail内核下开发,比如Hotmail。

  • Postfix:IBM安全专家开发,模块化设计,并且比sendmail兼容效率更高。

  • Exim:是基于GPL协议的开放源代码软件,由英国剑桥大学的Philip Hazel开发。

  • Exchange:微软公司的一套电子邮件服务组件,是个消息与协作系统。

MDA(Mail Delivery Agent)
  • 邮件投递代理,投递代理则从信件传输代理取得信件传送至最终用户的邮箱。常用的MDA有:

  • ProcMail:Postfix默认的邮件投递工具。

  • MailDrop:相对比较专业的投递代理工具。

MRA(Mail Retrieval Agent)

邮件取回代理,使用POP3或IMAP4协议工作。一般用于从用户信箱取回邮件到邮件用户代理客户端。常用的MRA有:

  • Dovecot:是一个开源的支持IMAP和POP3协议的收邮件服务器(自带SASL功能)。

MUA(Mail User Agent)

邮件用户代理工具。常用的MUA有:

  • OE:Windows旧版本自带的工具。

  • Outlook:Office套件带的工具。

  • FoxMail:腾讯公司的邮件客户端工具。

  • Thunderbird:雷鸟是Linux下的客户端工具。

  • Mutt:Linux下的字符界面客户端工具。

WebMail

基于Web的电子邮件收发系统,扮演邮件用户代理角色,一般而言,WebMail系统提供邮件收发、用户在线服务和系统服务管理等功能。WebMail的界面直观、友好,不需要借助客户端,免除了用户对E-mail客户软件(如:Foxmail、Outlook等)进行配置时的麻烦,只要能上网就能使用WebMail,方便用户对邮件进行接收和发送。WebMail使得E-mail在Internet上的应用广泛。常用的Webmail有:

  • Openwebmail:台湾开发的。

  • Squirrelmail:Centos系统自带。

  • Extmail,Extman:国内开发的也被称为EMOS系统。

Mail Relay

邮件中继,先要明白一个概念,一封邮件只要不是发送给本域内用户的,比如从当前域发送到另一个域,或从当前域发送到另一个域然后转到另外一个域的,这就属于中继。但是一般邮件服务器都会允许本地或本域内的用户进行中继。不然就只能在本域内发送邮件而不能给外部邮箱发送邮件。Postfix默认只能基于IP地址做中继认证。

SASL(simple authentication secure layer)

简单认证安全层,是一种用来扩充C/S模式验证能力的机制。在Postfix可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。

常用的Sasl有

  • cyrus-sasl:Redhat系列自带的SASL认证框架。

  • dovecot-sasl:dovecot组件带的SASL认证框架。

  • courier-authlib:这是一个带有MTA,MDA以及SASL认证的软件,但是一般只是用它的SASL功能。

Postfix介绍

Postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。是为了改良sendmail邮件服务器而产生的。其特点:

  1. postfix是免费的:postfix想要作用的范围是广大的Internet用户,试图影响大多数的Internet上的电子邮件系统,因此它是免费的。

  2. 更快:postfix在性能上大约比sendmail快三倍。一部运行postfix的台式PC每天可以收发上百万封邮件。

  3. 兼容性好:postfix是sendmail兼容的,从而使sendmail用户可以很方便地迁移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。

  4. 更健壮:postfix被设计成在重负荷之下仍然可以正常工作。当系统运行超出了可用的内存或磁盘空间时,postfix会自动减少运行进程的数目。当处理的邮件数目增长时,postfix运行的进程不会跟着增加。

  5. 更灵活:postfix是由超过一打的小程序组成的,每个程序完成特定的功能。你可以通过配置文件设置每个程序的运行参数。

  6. 安全性:postfix具有多层防御结构,可以有效地抵御恶意入侵者。如大多数的postfix程序可以运行在较低的权限之下,不可以通过网络访问安全性相关的本地投递程序等等。

Postfix服务器工作原理

邮件服务器工作在两种情况下:一种是相同域内转发;二是不同域内转发。所以MTA(postfix)内部一般都会有服务端(smtpd)、客户端(smtp)和MDA。smtpd邮件服务器非常简单,只负责转发邮件别的什么功能也没有并且发送方不管是什么地址都可以从smtpd服务器转发到目标地址。

邮件服务器两种工作机制

相同域内转发: 用户A通过工具连接到SMTPD服务端,然后发送一份邮件,而目标收件人是B用户。当SMPTD收到邮件后判断发现是同域内的用户,就会直接启动MDA进程把邮件投进用户邮箱中,当用户通过MUA工具(如mail命令)就可以直接收到邮件。

不同域内转发: 用户A通过工具连接到SMTPD服务端,然后发送一份邮件,而目标收件人是C用户。当SMPTD收到邮件后判断发现是不同域内用户,就会启动SMTP客户端来转发此邮件。SMTP收到请求后就会解析对方MX记录,然后连接对方SMTPD服务器并把邮件发送过去。当对方SMTPD发现此邮件就是本域内的邮件后也会调用MDA进程把邮件投递进用户邮箱中,当用户通过MUA工具(如mail命令)就可以直接收到邮件。

二()

本套邮件系统的搭建,从如何发邮件到收邮件到认证到虚拟用户虚拟域以及反病毒和反垃圾邮件等都有详细的介绍。在搭建过程中必须的参数解释以及原理都有告诉,这样才能更好地理解邮件系统。

卸载自带postfix
$ rpm -q postfix
postfix-2.6.-2.2.el6_1.x86_64
$ rpm -ev postfix --nodeps
环境准备
  1. YUM要配置好。

  2. 编译环境要配置好。

PS: 这两步骤如果有问题,那么可以看本网站提供的YUM和编译章节。

安装MySQL服务器
$ yum install mysql-server mysql mysql-devel perl-DBD-MySQL
$ chkconfig mysqld on
$ service mysqld restart
$ rpm -q mysql
mysql-5.1.-.el6.x86_64
安装cyrus-sasl并启动saslauthd服务
$ yum install cyrus-sasl cyrus-sasl-devel
$ service saslauthd start
$ chkconfig saslauthd on
查看postfix用户
$ id postfix
uid=(postfix) gid=(postfix) 组=(postfix),(mail)

发送邮件的用户,这里就使用系统自带的postfix用户,记住UID:89、GID:89,后面很多地方都要用到这两个ID号,如果此ID号更改了,那么Postfix安装方面会有很多目录权限都需要更改。

编译安装postfix-2.11.7
$ tar zxvf postfix-2.11..tar.gz
$ cd postfix-2.11.
$ make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ' 'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
$ tar zxvf postfix-2.11..tar.gz
$ cd postfix-2.11.
$ make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ' 'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
#-DHAS_MYSQL -I/usr/include/mysql //启用Mysql存储,指定头文件;
#-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl //启用SASL(cyrus)认证框架;
#-DUSE_TLS //启用SSL功能;
#AUXLIBS=-L/usr/lib64/mysql -lmysqlclient //找Mysql客户端库文件;
#-lz //压缩裤文件;
#-lm -L/usr/lib64/sasl2 //模块文件;
#-lsasl2 -lssl -lcrypto //加密库文件;

有以下信息就表示配置成功了

[src/posttls-finger]
cat ../../conf/makedefs.out Makefile.in >Makefile
rm -f Makefile; (cat conf/makedefs.out Makefile.in) >Makefile
$ make
$ make install

按照以下的提示输入相关的路径([]号中的是缺省值,”]”后的是输入值,省略的表示采用默认值)

install_root: [/]
#指定Postfix安装目录,默认
tempdir: [/root/postfix-2.11.] /tmp/postfix
#指定Postfix临时文件目录
config_directory: [/etc/postfix]
#指定Postfix配置文件目录,默认
command_directory: [/usr/sbin]
#指定Postfix二进制文件目录,默认
daemon_directory: [/usr/libexec/postfix]
#指定Postfix服务器进程,默认
data_directory: [/var/lib/postfix]
#指定Postfix可写文件目录,默认
html_directory: [no] /var/www/html/postfix
#指定Postfix帮助文件,可以使用web服务器打开
mail_owner: [postfix]
#指定Postfix属主,默认
mailq_path: [/usr/bin/mailq]
#指定Postfix队列程序路径,默认
manpage_directory: [/usr/local/man]
newaliases_path: [/usr/bin/newaliases]
#指定Postfix生成别名命令位置,默认
queue_directory: [/var/spool/postfix]
#指定Postfix队列目录,默认
readme_directory: [no]
sendmail_path: [/usr/sbin/sendmail]
#指定Postfix客户端(smtp),默认
setgid_group: [postdrop]
#指定Postfix投递组(默认有这个组,但没有这个用户),默认
PS:如果输入错误可以按Ctrl+退格键删除字符。
添加SysV风格服务脚本
[root@localhost ~]# vim /etc/rc.d/init.d/postfix
#!/bin/bash
#
# chkconfig:
# description: Postfix is a Mail Transport Agent, which is the program \
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ $NETWORKING = "no" ] && exit [ -x /usr/sbin/postfix ] || exit
[ -d /etc/postfix ] || exit
[ -d /var/spool/postfix ] || exit RETVAL=
prog="postfix" start() {
# Start daemons.
echo -n $"Starting postfix: "
/usr/bin/newaliases >/dev/null >&
/usr/sbin/postfix start >/dev/null >& && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq ] && touch /var/lock/subsys/postfix
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop >/dev/null >& && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload >/dev/null >& && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
abort() {
/usr/sbin/postfix abort >/dev/null >& && success || failure $"$prog abort"
return $?
}
flush() {
/usr/sbin/postfix flush >/dev/null >& && success || failure $"$prog flush"
return $?
}
check() {
/usr/sbin/postfix check >/dev/null >& && success || failure $"$prog check"
return $?
} restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit
esac
exit $?
# END
[root@localhost ~]# chmod +x /etc/rc.d/init.d/postfix
[root@localhost ~]# chkconfig --add postfix
[root@localhost ~]# chkconfig postfix on
[root@localhost ~]# service postfix start
Postfix相关命令
# 开启postfix;
$ postfix start # 检查配置;
$ postfix check # 重新加载;
$ postfix reload $ postconf [OPTION]
-d:显示Postfix默认的配置;
-n:显示新修改的配置;
-m:显示支持的存储文件类型如hash,mysql等;
-a:显示支持sasl的客户端插件类型;
安装完毕

如果上面没有使用UID为89的postfix用户,那么检查postfix时就会报如下错误。

$ postfix check
postsuper: fatal: scan_dir_push: open directory defer: Permission denied

原因是一般编译安装时,Postfix队列目录/var/spoole/postfix/,下有几个目录会使用系统自带postfix的目录,由于系统默认使用postfix(UID:89)用户给删除了,所以这些目录就找不到postfix用户,开启时就会报错一些权限问题,把以下几个目录权限给修改以下就好了,如果还有一些别的目录一并修改即可。

$ chown -R postfix.root /var/spool/postfix/defer/
$ chown -R postfix.root /var/spool/postfix/deferred/
$ chown -R postfix.root /var/spool/postfix/private/
$ chown -R postfix.postdrop /var/spool/postfix/public/
$ chown -R postfix.postdrop /var/spool/postfix/maildrop/
$ chown -R postfix.root /var/lib/postfix/
Postfix进程
  • master:这条进程是 Postfix 邮件系统的大脑,它产生所有其他进程。

  • smtpd:作为服务器端程序处理所有外部连进来的请求。

  • smtp:作为客户端程序处理所有对外发起连接的请求。

  • qmgr:它是 Postfix 邮件系统的心脏,处理和控制邮件队列里面的所有消息。

  • local:这是 Postfix 自有的本地投递代理MDA,就是它负责把邮件保存到邮箱里。

Postfix邮件的更多相关文章

  1. 烂泥:Postfix邮件服务器搭建之准备工作

    说实话,Postfix邮件服务器的搭建是一件很麻烦的事情,需要各种软件之间的配置和调试.在写这篇文章之前,我也是搭建测试了不下于10次才算把整个流程给走通,今天刚好有时间把整个搭建过程记录下来. 在正 ...

  2. 烂泥:Postfix邮件服务器搭建之软件安装与配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb Postfix邮件服务器的搭建需要使用到几个软件,分别是cyrus-sasl.postf ...

  3. 烂泥:Postfix邮件服务器搭建之虚拟用户配置

    virtual_gid_maps = static: virtual_transport = dovecot dovecot_destination_recipient_limit = 1 注意:po ...

  4. postfix 邮件备份方法

    postfix 邮件备份方法: postfix的bcc(密送)功能可以根据条件,将所有经过postfix队列的邮件根据规则密送到指定的邮箱. postfix带有三个bcc参数: ①.always_bc ...

  5. [系统开发] Postfix 邮件管理系统

    一.简介 开发时间:2012年 开发工具:Perl CGI 这是我开发的 Postfix 邮件管理系统,通过它可以安全.方便的对邮件域名.用户.权限.组.邮箱容量.安全等进行各种设置:界面样式借鉴了 ...

  6. postfix 邮件服务的安装及详解

    该实验系统:cetnos 6.5 sendmail:性能好,设置复杂,适合老手 qmail:体积小260+k ,模块化.需要做二次开发,适合对邮件性能有要求的 postfix:前身是sendmail, ...

  7. Postfix 邮件服务 - PostfixAdmin

    PostfixAdmin 基于web的postfix邮件发送服务器的管理工具,可以直接管理postfix的虚拟域名和邮件用户,前提是这些数据是存储在mysql或者是PostgreSQL数据库中. Po ...

  8. Postfix 邮件服务 - postfix服务

    postfix 邮件服务 也是基于sendmail (需要关闭或卸载sendmail)postfix 是一个电子邮件服务器,它为了改良sendmail邮件服务器而产生的,并且它的配置文件比sendma ...

  9. Postfix 邮件服务器搭建

    搭建服务环境: Centos 6 配置域名hosts: mail.demonC6.com 1.清理系统自带的邮件软件 # rpm -qa | grep sendmail* # rpm -e sendm ...

  10. postfix邮件服务器搭建02-安装篇

    本文接着上文的环境,进行postfix邮件发信端和dovecot邮件收信端的部署,之后部署基于浏览器的extmail图形管理端,使管理员可以通过网页对邮件虚拟用户进行管理,对邮件服务器进行管控 1.p ...

随机推荐

  1. 如何在Java 环境下使用 HTTP 协议收发 MQ 消息

    1. 准备环境在工程 POM 文件添加 HTTP Java 客户端的依赖. <dependency> <groupId>org.eclipse.jetty</groupI ...

  2. linux 安装 Django 安装

    下载源码包:https://www.djangoproject.com/download/ 输入以下命令并安装: tar xzvf Django-X.Y.tar.gz # 解压下载包 cd Djang ...

  3. SVN的Hooks功能--强制添加注释

    所谓hooks,可以类似 理解Linux内核Netfilter框架的hook点和hook函数的概念.当用户在维护代码的过程中,其执行的相关动作正好触发了相关hook点,就 会去执行对应hook点的脚本 ...

  4. PHP压缩html网页代码原理(清除空格,换行符,制表符,注释标记)

    本博启用了一个叫wp super cache的页面压缩工具, 源代码没有去查看,不过原理很简单. 我们可以自己动手书写一个压缩脚本. 清除换行符,清除制表符,去掉注释标记 .它所起到的作用不可小视. ...

  5. Python中的yield和Generators(生成器)

    本文目的 解释yield关键字到底是什么,为什么它是有用的,以及如何来使用它. 协程与子例程 我们调用一个普通的Python函数时,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函 ...

  6. PyCharm 基础设置

    设置主题:File -- Settings -- Editor -- Color & Fonts -- Font -- Scheme 设置为 Darcula 设置字体:File -- Sett ...

  7. U3D 游戏引擎之游戏架构脚本该如何来写

    这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引 ...

  8. Linux centos 下 eclipse 打开文件时关闭

    原文地址:http://processors.wiki.ti.com/index.php/Linux_Host_Support#cairo-misc.c:380:_cairo_operator_bou ...

  9. 转:桩模块 stub 和驱动模块 driver

    迷惑我很久的stub的概念,今天终于看到觉得靠谱的了,原文地址:http://xyzhaoangela.blog.hexun.com/14208786_d.html 桩模块stub:集成测试前要为被测 ...

  10. Android中Adapter总结

    根据一个制作列表的程序开始练手,结果就出现了学习安卓的第一个代码问题 运行程序发现,虽然报错,但是可以成功运行程序. Android中Adapter功能为 显示ListView,最常用的有ArrayA ...