设为首页 收藏本站
查看: 1356|回复: 0

[经验分享] Red Hat搭建邮件服务器(sendmail+dovecot+openwebmail+procmail)

[复制链接]

尚未签到

发表于 2015-11-25 12:11:09 | 显示全部楼层 |阅读模式
  原文:http://blog.iyunv.com/uid-26722078-id-3495692.html
  

  
本文主要说明了通过Sendmail+Dovecot+Openwebmail+procmail搭建邮件服务器的方法,并包括简单的备份策略和一个上传备份邮件的程序MailUpload。
    Sendmail实现SMTP协议,是邮件传输代理程序,作为发送邮件服务器。
     Dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持Linux/Unix 系统,作为接收邮件服务器。  
    Openwebmail是一个perl语言编写的web邮件系统。
    Procmail是一个可以自定义的强大的邮件过滤工具。
  操作系统:more /etc/redhat-release  显示:Red Hat Enterprise Linux Server release 6.3 (Santiago)


1.安装配置sendmail
查询是否已经安装sendmail
    为避免与已经安装的sendmail产生冲突,在安装之前用rpm命令查询一下服务器是否已经安装了sendmail。
    rpm –qa | grep sendmail
    不同的系统可能缺少的包不一样,我安装时包括以下包
    hesiod-3.1.0-19.el6.x86_64.rpm(hesiod是与名称服务(name service)相关的一个包,一般系统都默认已经安装了的)
    sendmail-8.14.4-8.el6.x86_64.rpm
    sendmail-cf-8.14.4-8.el6.noarch.rpm(sendmail-cf是sendmail的配置文件)
    由于sendmail的配置文件(sendmail.cf)是由模板文件(sendmail.mc)生成的,其生成要用到m4工具,所以需要安装m4这个工具。

配置/etc/mail/sendmail.mc
    sendmail.mc是模板文件,通过配置sendmail.mc然后用m4命令生成最后的配置文件,sendmail.mc需要修改的地方有两处:


    第52、53行:
    dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
    dnl define(`confAUTH_MECHANISMS’, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    改成
    TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
    define(`confAUTH_MECHANISMS’, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
    (去掉前面的dnl)

    第116 行:
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
    改成
    DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
    ( 将127.0.0.1改成0.0.0.0)
    其中dnl是配置文件中的m4宏,它表示丢弃直到下一个换行为止的字符(包括那个换行符)的意思。这里sendmail.mc文件修改的第一处如果不修改的话,后面发送邮件会发送失败;第二处如果不改动话系统只监听本机的127.0.0.1这个lo接口,修改之后将监听的接口开启到整个internet上,否则无法接收来自Internet的信件。


生成/etc/mail/sendmail.cf


    sendmail.mc是模板文件,sendmail.cf才是真正的配置文件,但是sendmail.cf配置文件比较复杂,一般不直接修改sendmail.cf文件而是通过sendmail.mc文件来生成sendmail.cf文件。sendmail.mc文件修改好之后,通过
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf命令来生成sendmail.cf文件


   sendmail.cf文件生成之后,直接启动sendmail服务的话,会报错,提示sendmail.cf文件第39行有错误。定位到39行之后,发现其实第39行就是一空行,直接删掉该行即可。




修改/etc/mail/local-host-names文件


   如果要收到形如xxx@abc.com、abc@mail.hzly.com的邮件的话,就要设置正确的主机名,主机名的设置在/etc/mail/local-host-names文件里添加:
   mail.hzly.com
   配置文件设置完毕后,即可启动sendmail服务了,用service sendmail start命令来启动

2.安装配置dovecot
    查询是否安装用rpm -qa | grep dovecot命令来检查,如果安装了的话则会显示已经安装的版本。
修改/etc/dovecot/conf.d/10-mail.conf
   修改邮箱位置,如果不修改的话,后面在发邮件的时候会提示跟mail_location相关的错误,修改操作如下:
第25行:
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
修改成
mail_location = mbox:~/mail:INBOX=/var/mail/%u
(去掉前面的#号)
修改/etc/dovecot/conf.d/10-auth.conf
   修改是否允许简单信息验证,如果不修改的话,后面发邮件会提示验证错误而不能通过验证,操作如下:
第9行:
#disable_plaintext_auth = yes
修改成
disable_plaintext_auth = no
(去掉前面的#号,将yes改成no)
修改/etc/dovecot/conf.d/10-ssl.conf
   修改是否使用ssl验证,如果不修改的话,同样在发送邮件的时候会提示不能通过验证,操作如下:
第6行:
#ssl = yes
修改成
ssl = no
(去掉前面的#,yes改成no)
添加用户
   用useradd 用户名(如useradd userone)添加用户,用passwd 用户名(如 passwd userone)来修改密码,这样就添加了一个叫userone的用户。
创建/home/userone/mail/.imap/INBOX目录
    添加用户之后,需要在用户目录下建立INBOX文件夹,否则后面在收信的时候会报错。切换到userone用户下,然后用mkdir /home/userone/mail/.imap/INBOX -p命令创建文件夹。
修改/etc/skel/.bash_profile
    为了方便避免每新建一个用户就要建一个INBOX文件夹,可以在/etc/skel/.bash_profile文件中添加脚本来自动建立INBOX文件夹,如下所示:
在末尾添加:


123if[ ! -d ~/mail/.imap/INBOX ];then     mkdir -p ~/mail/.imap/INBOXfi

启动dovecot
    配置文件修改完毕后,就可以启动dovecot服务了。用service dovecot start命令启动。
3.foxmail客户端连接
    sendmail和dovecot都安装完毕,服务都启动好了之后,这时一个基本的邮件服务器搭建完成,可以用foxmail客户端来进行连接。
4.安装配置openwebmail
    openwebmail的rpm包可以到http://openwebmail.org/上下载,同样,openwebmail安装是也有依赖关系,它是依赖如下两个包:perl-Text-Iconv-1.7-6.el6.x86_64.rpm和perl-suidperl-5.10.1-119.el6_1.1.x86_64.rpm,因此要先安装这两个包后才能安装openwebmail,当然运行openwebmail还需要perl环境,一般系统都默认安装了perl环境,如果没有安装就要先装perl环境了。
修改dbm.conf配置文件
    在初始化之前要修改/var/www/cgi-bin/openwebmail/etc/defaults/dbm.conf这个配置文件,如果不修改该文件的话,在后面运行openwebmail-tool.pl --init初始化的时候会报错,修改如下:
第30行:
dbm_ext                 .db
修改成
dbm_ext             .pag
初始化
    安装好了之后,修改dbm.conf配置文件之后,就开始初始化,输入/var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init命令进行初始化操作
修改openwebmail.conf配置文件
    初始化之后,还需要修改/var/www/cgi-bin/openwebmail/etc/openwebmail.conf文件,主要是修改openwebmail的语言以及邮件使用的域名修改如下:,
第62行:
修改为zh_CN.GB2312
第85行:
修改为Cool3D.Chinese.Simplified
第12行:
修改为邮件使用的域名
修改openwebmail.conf
    修改/var/www/cgi-bin/openwebmail/etc/defaults/openwebmail.conf
第26行:
smtpserver要改为相应的主机名或ip
启动http服务
    安装好openwebmail之后,就可以启动http服务来访问了。需要注意的是,openwebmail是依赖于http服务的,所以服务器必须要安装http服务才行。如果httpd装好了,只需要用service httpd start命令启动即可。
修改系统的SELinux设置
    在访问openwebmail之前,需要disable系统的SELinux设置。
访问openwebmail
    打开浏览器,在浏览器中输入:
    http://192.168.18.112/cgi-bin/openwebmail/openwebmail.pl即可访问openwebmail了。


5.安装配置procmail
   首先确定系统已安装procmail。
创建相关的目录
mkdir /etc/procmail
touch /var/log/procmail.log
mkdir /var/mail/backup
创建/etc/procmailrc:
    内容如下:


12345MAILDIR=/var/mailVERBOSE=offPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbinLOGFILE=/var/log/procmail.logINCLUDERC=/etc/procmail/rc.localcopy

创建/etc/procmail/rc.localcopy
    rc.localcopy内容如下   

12:0c/var/mail/backup/

收发的邮件就会备份到/var/mail/backup/目录下面,里面还有子目录,具体可以看一下
MailUpload是一个可以将备份的邮件上传到指定服务器的小程序,服务器端通过一个jsp解析出主题和内容,然后插入数据库以供查询。下面贴出MailUpload的代码,主要是监测指定目录的文件变化情况,然后通过curl提交数据。


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118#include<unistd.h>#include<sys/inotify.h>#include<stdio.h>#include<error.h>#include<errno.h>#include<string.h>#include<stdlib.h> #define ERROR(text) error(1, errno,&quot;%s&quot;, text) struct EventMask {    int       flag;    constchar *name; }; intfreadsome(void*dest, size_t remain, FILE *file){    char *offset = (char*)dest;    while(remain) {        intn = fread(offset, 1, remain, file);        if(n==0) {            return-1;        }         remain -= n;        offset &#43;= n;    }    return0;} intmain(intargc, char *argv[]){    constchar *target;    if(argc == 1) {        target =&quot;.&quot;;    }else{        target = argv[1];    }     struct EventMask event_masks[] = {           {IN_ACCESS        ,&quot;IN_ACCESS&quot;}        ,            {IN_ATTRIB        ,&quot;IN_ATTRIB&quot;}        ,            {IN_CLOSE_WRITE   ,&quot;IN_CLOSE_WRITE&quot;}   ,            {IN_CLOSE_NOWRITE ,&quot;IN_CLOSE_NOWRITE&quot;} ,            {IN_CREATE        ,&quot;IN_CREATE&quot;}        ,            {IN_DELETE        ,&quot;IN_DELETE&quot;}        ,            {IN_DELETE_SELF   ,&quot;IN_DELETE_SELF&quot;}   ,            {IN_MODIFY        ,&quot;IN_MODIFY&quot;}        ,            {IN_MOVE_SELF     ,&quot;IN_MOVE_SELF&quot;}     ,            {IN_MOVED_FROM    ,&quot;IN_MOVED_FROM&quot;}    ,            {IN_MOVED_TO      ,&quot;IN_MOVED_TO&quot;}      ,            {IN_OPEN          ,&quot;IN_OPEN&quot;}          ,             {IN_DONT_FOLLOW   ,&quot;IN_DONT_FOLLOW&quot;}   ,            //{IN_EXCL_UNLINK   , &quot;IN_EXCL_UNLINK&quot;}   ,            {IN_MASK_ADD      ,&quot;IN_MASK_ADD&quot;}      ,            {IN_ONESHOT       ,&quot;IN_ONESHOT&quot;}       ,            {IN_ONLYDIR       ,&quot;IN_ONLYDIR&quot;}       ,             {IN_IGNORED       ,&quot;IN_IGNORED&quot;}       ,            {IN_ISDIR         ,&quot;IN_ISDIR&quot;}         ,            {IN_Q_OVERFLOW    ,&quot;IN_Q_OVERFLOW&quot;}    ,            {IN_UNMOUNT       ,&quot;IN_UNMOUNT&quot;}       ,     };     intmonitor = inotify_init();    if( -1== monitor ) {        ERROR(&quot;monitor&quot;);    }     intwatcher = inotify_add_watch(monitor, target, IN_ALL_EVENTS);    if( -1== watcher  ) {        ERROR(&quot;inotify_add_watch&quot;);    }     FILE *monitor_file = fdopen(monitor,&quot;r&quot;);    char last_name[1024];    char name[1024];     /* event:inotify_event -> name:char[event.len] */    //while (true) {    while(1) {        struct inotify_event event;        if( -1== freadsome(&event, sizeof(event), monitor_file) ) {            ERROR(&quot;freadsome&quot;);        }        if(event.len) {            freadsome(name, event.len, monitor_file);        }else{            sprintf(name,&quot;FD: %d\n&quot;, event.wd);        }         if(strcmp(name, last_name) != 0) {            puts(name);                        //int ret = system(&quot;ls -l&quot;);            strcpy(last_name, name);        }         /* 显示event的mask的含义 */                inti;        for(i=0; i<sizeof(event_masks)/sizeof(struct EventMask); &#43;&#43;i) {            if(event.mask & event_masks.flag) {                printf(&quot;\t%s\n&quot;, event_masks.name);                                if(event_masks.name == &quot;IN_CREATE&quot;) {                                   char cmdline[100]= &quot;\0&quot;;                                   char fullname[256]= ;                                   strcpy(fullname, argv[1]);                                   strcat(fullname, name);                                   printf(&quot;%s file created!\n&quot;,name);                                   intret = system(&quot;curl -F 'action=upload' -F 'filename=@testmail'http://192.168.18.111:8080/test/index.jsp&quot;);                                                                   }            }        }    }    return0;}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-143389-1-1.html 上篇帖子: 转载:PHP & sendmail frustration 下篇帖子: sendmail 配置及错误解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表