作为ubuntu上的各类应用,最终你仍然需要搭建一台mail服务器作为各类通知信息的流通渠道,我这篇搭建mail服务器的文章也是基于这点应用,作为各类服务之间的消息通信报警邮件,而不是对外提供mail服务。
ubuntu 12.04 LTS server环境,选择sendmail是因为和其他各类软件兼容性完全不用考虑,肯定默认是支持的,配置sendmail常常被一些教程类文章所诟病,其实也没这么困难。
选择登陆服务器的user作为邮件的地址,我这里是myuser@mysite为例。
1
|
$
sudo
apt-get
install
sendmail bsd-mailx
|
(bsd-mailx 用于echo管道下发送邮件)这下就有了发送邮件的服务器了
首先 设置收信的域名 在/etc/mail/local-host-names中添加收信的域名
xxx.com
mail.xxx.com
12.12.12.12(ip地址)【没有域名的话也可以写上ip地址,发信时直接名字@12.12.12.12】
其次 ,修改/etc/mail/sendmail.mc,将其中的smtp项修改ip范围即可对外服务器发送邮件
DAEMON_OPTIONS(‘Family=inet, NAME=MTA-v4, Port=smtp, Addr=127.0.0.1 ‘)……
改为DAEMON_OPTIONS(‘Family=inet, NAME=MTA-v4, Port=smtp, Addr=0.0.0.0 ‘)……
同样还有:
DAEMON_OPTIONS(`Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=0.0.0.0′)dnl
然后用m4命令生成新的配置文件[如果提示没权限则输入su切换到root执行]
1
|
$
sudo
m4
/etc/mail/sendmail
.mc >
/etc/mail
.sendmail.cf
|
或:
使配置生效:
#m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
#/etc/init.d/sendmail restart【重启】
重启sendmail服务后测试一下:
1
|
$
echo
"test mail ok"
| mail -s
"test mail ok"
xxxxxxxxx@gmail.com
|
打开web登录邮箱即可看到邮件,当然本地防火墙对于smtp的25号端口不能封锁,否则也就发送不成功。这个命令的xxxx@gmail.com换为本地用户名,即对本地用户发送邮件,一样能测试安装是否成功。
光有发送不行,还需要接受邮件,那么就是pop3+imap接受邮件服务器,选择广为流传的dovecot,配置也很简单。
1
|
$
sudo
apt-get
install
dovecot-imapd dovecot-pop3d
|
如果不是选择的sendmail的默认设置,那么先要检测一下邮箱存储位置在哪里,再开始配置dovecot,使用下面的命令寻找先用前面的echo对本地用户发送一个邮件,然后
1
2
3
|
$
for
mbox
in
/var/mail/
$USER
/var/spool/mail/
$USER ~
/mbox
~
/mail/
* ~/*;
do
grep
-q
"Dovecot test"
$mbox &&
echo
"mbox: $mbox"
done
|
显示的邮箱地址一般是/var/mail/$USER本地用户名
可以cd /var/mail/ 进去查看邮件
那么dovecot的配置就是修改mail存储位置,默认就使用~/mail/来存储,默认设置也是imap来接管邮件接收
1
|
$
sudo
vi
/etc/dovecot/conf
.d
/10-mail
.conf
|
取消 “ mail_location = mbox:~/mail:INBOX=/var/mail/%u ”前的“ # ”保存即可,重启dovecot
1
|
$
sudo
/etc/init
.d
/dovecot
restart
|
至此完成了收发邮件的配置。
接下来配置一个webmail来浏览邮件,我选择了squirrelmail,一样在ubuntu源中
1
|
$
sudo
apt-get
install
squirrelmail
|
使用
1
|
$
sudo
squirrelmail-configure
|
或
1
|
$
sudo
.
/etc/squirrelmail/conf
.pl
|
均可,通过选项【选2】,先修改smtp为sendmail,再修改设定imap用dovecot,检查一下是否是localhost:143即imap端口可用,可以选择
1
2
|
$ telnet localhost 143
a login
"local_username"
"password"
|
来看 dovecot是否ready,登陆是否成功,配置一下apache就能通过web访问了,
将配置好的squirrelmail下的apache.conf链接过去即可
1
|
$
ln -s /usr/share/squirrelmail/ /var/www/mail
|
web访问 http://ip/mail/ 用本地用户名和密码登陆
这里遇到一个bug,默认的~/mail/.imap/INBOX缺失,登陆后报错,自己在这个地方新建一个文件夹INBOX即可
配置结束!
使用中遇到的问题,发送邮件后响应速度很慢,不只是web的问题,就连bash下邮件发送确认也很慢,超过 5s ,这样的性能是不能忍受的。
【解决:】
此问题是由于:
系统sendmail的时候在查询你设置的主机名的A记录或反向域名记录,由于全球9台DNS根系统都在美国,这个时候会去查询本机主机名对应的dns A记录,特别时你安装系统时设置的一些“奇怪”的主机名的时候,比如rac1等等之类的,这个时候sendmail会去做这个操作过程。
Apr 28 13:41:36 rac1 sendmail[3494]: gethostby*.getanswer: asked for “rac1 IN AAAA”, got type “A”
Apr 28 13:42:36 rac1sendmail[3499]: gethostby*.getanswer: asked for “rac1 IN AAAA”, got type “A”
Apr 28 13:43:37 rac1 sendmail: sendmail startup succeeded
Apr 28 13:43:37 rac1 sm-msp-queue[3509]: gethostby*.getanswer: asked for “rac1 IN AAAA”, got type “A”
Apr 28 13:41:36 rac1 sendmail[3494]: gethostby*.getanswer: asked for “rac1 IN AAAA”, got type “A”
Apr 28 13:42:36 rac1sendmail[3499]: gethostby*.getanswer: asked for “rac1 IN AAAA”, got type “A”
Apr 28 13:43:37 rac1 sendmail: sendmail startup succeeded
Apr 28 13:43:37 rac1 sm-msp-queue[3509]: gethostby*.getanswer: asked for “rac1 IN AAAA”, got type “A”
该过程少则一到两分钟,多则四到五分钟,而且要命的是不报任何错误信息,这个时间大大超过了我们能忍受的“8s”时间了,心里承受力差的兄弟就要受煎熬了。
知道了问题的症结,就可以对症下药了,比如我们可以修改系统配置文件/etc/hosts
让sendmial绕过查询远程主机,这里给出一种最简单的方法,给主机设置一个别名
修改/etc/hosts ,未修改之前
127.0.0.1 localhost.localdomain localhost
修改成
127.0.0.1 localhost.localdomain localhost 主机名称
查看本机的主机名称的命令是: hostname
再次重新启动sendmail看看
【中文设置】
输入:sudo squirrelmail-configure
Languages”,将“ Default Language”改成“zh_CN”,“Default Charset”改成“GB2312”。保存退出。