LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1015|回复: 2

在Slackware11上使用Qmail安装简单的smtp服务~

[复制链接]
发表于 2006-12-8 20:34:25 | 显示全部楼层 |阅读模式
为什么要smtp服务而不配置mail server
因为我们要用php发邮件必须配置php.ini的sendmail路径~
所以自己弄个小型轻量的SMTP正好用~

sendmail个头不小 而且安全老大难问题~
exim不错 但是功能太多
Courier更强大~
还是qmail吧~

首先下载3个文件
http://www.qmail.org/netqmail-1.05.tar.gz
http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
daemontools老老实实下载http://www.linuxpackages.net/这里的tgz文件~
因为我源代码装上怎么也起不来~
首先建立安装目录~
mkdir /var/qmail

cd /usr/local/src/netqmail-1.05/netqmail-1.05
进入1.05的目录
编辑INSTALL.ids文件
删除和你系统无关的部分
我保留如下
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails
然后执行这个脚本
/bin/sh INSTALL.ids
然后编译
make setup check
然后设置你的本地的域名
我设置的是localhost反正本地用
./config-fast slackeare.local

下面安装
ucspi-tcp和deamontool
其实都可以下载tgz安装的~
installpkg daemontools-0.76-i486-2sam.tgz

cd /usr/local/src/ucspi-tcp-0.88
patch < /usr/local/src/netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch
make
make setup check
ucspi-tcp安装完毕

下面开始配置 按照官方的办法
建立/var/qmail/rc
#!/bin/sh

# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default

exec env - PATH="/var/qmail/binPATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`"

然后改权限
chmod 755 /var/qmail/rc
mkdir /var/log/qmail
选择传送方式
echo ./Mailbox >/var/qmail/control/defaultdelivery
这样你就可以通过/var/qmail/bin/maildirmaike 来创建你当前用户的Mailbox

安装daemontool好像会自动生成qmailctl脚本
我们修改下 修改前先备份是个好习惯
cp /var/qmail/bin/qmailctl /var/qmail/bin/qmailctl.bak
然后
#!/bin/sh

# For Red Hat chkconfig
# chkconfig: - 80 30
# description: the qmail MTA

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`

case "$1" in
  start)
    echo "Starting qmail"
    if svok /service/qmail-send ; then
      svc -u /service/qmail-send /service/qmail-send/log
    else
      echo "qmail-send supervise not running"
    fi
    if svok /service/qmail-smtpd ; then
      svc -u /service/qmail-smtpd /service/qmail-smtpd/log
    else
      echo "qmail-smtpd supervise not running"
    fi
    if [ -d /var/lock/subsys ]; then
      touch /var/lock/subsys/qmail
    fi
    ;;
  stop)
    echo "Stopping qmail..."
    echo "  qmail-smtpd"
    svc -d /service/qmail-smtpd /service/qmail-smtpd/log
    echo "  qmail-send"
    svc -d /service/qmail-send /service/qmail-send/log
    if [ -f /var/lock/subsys/qmail ]; then
      rm /var/lock/subsys/qmail
    fi
    ;;
  stat)
    svstat /service/qmail-send
    svstat /service/qmail-send/log
    svstat /service/qmail-smtpd
    svstat /service/qmail-smtpd/log
    qmail-qstat
    ;;
  doqueue|alrm|flush)
    echo "Flushing timeout table and sending ALRM signal to qmail-send."
    /var/qmail/bin/qmail-tcpok
    svc -a /service/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /service/qmail-send
    ;;
  pause)
    echo "ausing qmail-send"
    svc -p /service/qmail-send
    echo "ausing qmail-smtpd"
    svc -p /service/qmail-smtpd
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /service/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /service/qmail-smtpd
    ;;
  restart)
    echo "Restarting qmail:"
    echo "* Stopping qmail-smtpd."
    svc -d /service/qmail-smtpd /service/qmail-smtpd/log
    echo "* Sending qmail-send SIGTERM and restarting."
    svc -t /service/qmail-send /service/qmail-send/log
    echo "* Restarting qmail-smtpd."
    svc -u /service/qmail-smtpd /service/qmail-smtpd/log
    ;;
  cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp.cdb
    echo "Reloaded /etc/tcp.smtp."
    ;;
  help)
    cat <<HELP
   stop -- stops mail service (smtp connections refused, nothing goes out)
  start -- starts mail service (smtp connection accepted, mail can go out)
  pause -- temporarily stops mail service (connections accepted, nothing leaves)
   cont -- continues paused mail service
   stat -- displays status of mail service
    cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- schedules queued messages for immediate delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
  queue -- shows status of queue
   alrm -- same as doqueue
  flush -- same as doqueue
    hup -- same as reload
HELP
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0
将以上脚本内容替换进去
建一个连接
ln -s /var/qmail/bin/qmailctl /usr/bin
为 qmail 的服务创建 supervise 目录
    mkdir -p /var/qmail/supervise/qmail-send/log
    mkdir -p /var/qmail/supervise/qmail-smtpd/log

建立 /var/qmail/supervise/qmail-send/run 文件
#!/bin/sh
exec /var/qmail/rc

建立 /var/qmail/supervise/qmail-send/log/run 文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

建立 /var/qmail/supervise/qmail-smtpd/run 文件:
#!/bin/sh

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`

if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
    echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
    echo /var/qmail/supervise/qmail-smtpd/run
    exit 1
fi

if [ ! -f /var/qmail/control/rcpthosts ]; then
    echo "No /var/qmail/control/rcpthosts!"
    echo "Refusing to start SMTP listener because it'll create an open relay"
    exit 1
fi

exec /usr/local/bin/softlimit -m 2000000 \
    /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
        -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
建立concurrencyincoming 控制文件.
    echo 20 > /var/qmail/control/concurrencyincoming
    chmod 644 /var/qmail/control/concurrencyincoming

建立 /var/qmail/supervise/qmail-smtpd/log/run 文件
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

将各个run文件设置为可执行文件:
    chmod 755 /var/qmail/supervise/qmail-send/run
    chmod 755 /var/qmail/supervise/qmail-send/log/run
    chmod 755 /var/qmail/supervise/qmail-smtpd/run
    chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

然后建立log文件目录:
    mkdir -p /var/log/qmail/smtpd
    chown qmaill /var/log/qmail /var/log/qmail/smtpd

最后, 建立 supervise 目录到 /service 目录的链接:
    ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service
允许本地主机和内网的主机通过SMTP方式发送邮件:
    echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp
    echo '192.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp

    qmailctl cdb
替代系统senmail
    ln -s /var/qmail/bin/sendmail /usr/lib
    ln -s /var/qmail/bin/sendmail /usr/sbin
建立别名
    echo freewolf > /var/qmail/alias/.qmail-root
    echo freewolf > /var/qmail/alias/.qmail-postmaster
    ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon
    ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse  
    chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
现在差不多了
qmailctl start
启动看看
运行qmailctl stat
看看
/service/qmail-send: up (pid 12889) 66 seconds
/service/qmail-send/log: up (pid 12903) 66 seconds
/service/qmail-smtpd: up (pid 12893) 66 seconds
/service/qmail-smtpd/log: up (pid 12898) 66 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0

说明已经成功跑起来了
最后我们修改php.ini的sendmail路径为/var/qmail/bin/sendmail
一定要看看这个文件是不是可执行的

你在局域网上发个邮件试试吧 是不是已经ok了~
这样一个最基本的qmail已经架好了~
对我来说够用了~
发表于 2006-12-8 22:51:05 | 显示全部楼层
谢谢分享。slackware做server和桌面都很不错。
回复 支持 反对

使用道具 举报

发表于 2006-12-8 23:04:33 | 显示全部楼层
收藏了,谢谢楼主分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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