建立自己的邮件服务器

概要
如果你有自己的服务器,再有自己的域名,就可以设置一个自己的邮箱了。用自己的域名的邮箱给别人发邮件是不是感觉很酷。这篇文章就是我自己设置邮件服务器的过程,希望能帮到想要设置邮件服务器的人。

先看效果图


设置好之后不但能够收发邮件,附件也是支持的。

首先主要用到的软件有
邮件服务器 postfix (https://help.ubuntu.com/community/Postfix)
邮件递送 dovecot (https://help.ubuntu.com/community/Dovecot)
网页客户端 rainloop (http://www.rainloop.net/)
系统环境 ubuntu 14.04
云服务器 azure (http://www.windowsazure.cn)

开始安装各种软件之前先来说明一下整体的架构。这里要安的软件比较多,如果不从整体上先了解一下,很容易把自己给弄乱了。

整个邮件服务器的主体就是postfix,实际的邮件是由这个软件进行处理的。这个安装好之后就能收发邮件了。devecot负责用户身份验证,pop3 imap 的处理。这个安装好就可以用outlook这样的邮件客户端了。rainloop就是一个网页版的邮件客户端,和outlook,Thunderbird基本上是一样的。这个安装好之后就可以像用qq邮箱一样用自己的邮箱了。我的安装基本就是照着上面几个链接里的方法进行的。OK,开始安装了。
安装 postfix
教程链接(https://help.ubuntu.com/community/Postfix)
输入安装指令
#在这里输入代码(从下一行开始,不要删除我...)
sudo apt-get install postfix
配置 postfix

#在这里输入代码(从下一行开始,不要删除我...)
sudo dpkg-configure postfix

这里基本上和链接里面说的一样,我觉得没必要重复了
最后贴一下我的配置文件
/etc/postfix/main.cf

#在这里输入代码(从下一行开始,不要删除我...)
# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/smtpd.crt
smtpd_tls_key_file = /etc/ssl/private/smtpd.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

smtpd_relay_restrictions =
myhostname = mail.randoms.me
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = shareyan.cn,mail.shareyan.cn , localhost.shareyan.cn, localhost,randoms.me,mail.randoms.me
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/
mailbox_command =
smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
virtual_alias_maps = hash:/etc/postfix/virtual
# We also need to make sure the domain is enabled
virtual_alias_domains=randoms.me
我记得是最后和认证相关的好像和ubuntu的教程不太一样。

安装Dovecot
教程链接(https://help.ubuntu.com/community/Dovecot)
#在这里输入代码(从下一行开始,不要删除我...)
sudo apt-get install dovecot-imapd dovecot-pop3d

基本方法和ubuntu的教程里面是一样的,这里也贴出自己的配置文件
/etc/dovecot/dovecot.conf
#在这里输入代码(从下一行开始,不要删除我...)

dict {
  #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
  #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
}

# Most of the actual configuration gets included below. The filenames are
# first sorted by their ASCII value and parsed in that order. The 00-prefixes
# in filenames are intended to make it easier to understand the ordering.
!include conf.d/*.conf

# A config file can also tried to be included without giving an error if
# it's not found:
!include_try local.conf
protocols = imap
mail_location = maildir:/home/%u/Maildir
auth_verbose = yes  # 认证详细日志
auth_debug = yes     # 认证的debug信息打开,可以显示出SQL查询语句,正常后可关闭
auth_debug_passwords = yes   #可以显示密码失败的详细信息,正常后可关闭
auth default {
    socket listen {
        client {
            path = /var/spool/postfix/private/auth
            mode = 0660
            user = postfix
            group = postfix
        }
    }
    mechanisms = plain login
}
这里的配置和教程不一样,因为ubuntu的教程配置后我发现认证没办法通过。所以在网上搜索其它的配置方法,最后找到了这个有效的配置方法。

安装railloop
教程链接(http://www.rainloop.net/docs/installation/)
rainloop是一个非常好的web mail客户端。但是他的文档写得实在是太简略了,安装废了不少的功夫。
运行安装指令
先cd 到你要安装的文件夹,这里我是/var/www建议和我保持一致,这样下面的配置文件就可以复用了。
#在这里输入代码(从下一行开始,不要删除我...)

curl -s http://repository.rainloop.net/installer.php | php
设置文件权限
#在这里输入代码(从下一行开始,不要删除我...)

cd /var/www/rainloop
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
设置用户组权限
#在这里输入代码(从下一行开始,不要删除我...)
cd /var/www/rainloop
chown -R www-data:www-data .
安装php, mysql (https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu)
#在这里输入代码(从下一行开始,不要删除我...)
sudo apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql
sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt
添加必要的php库(http://www.tecmint.com/install-rainloop-webmail-in-arch-linux/ 这篇文章好像是rainloop的作者写的)
修改 /etc/php5/fpm/php.ini, 在最后添加上下面的代码。注意这里和链接里的不太一样,因为系统环境不同,如果你是ubuntu那么就按照我说的做。
#在这里输入代码(从下一行开始,不要删除我...)
extension=iconv.so
extension=imap.so
extension=mcrypt.so
extension=mssql.so
extension=mysqli.so
extension=openssl.so ( enables IMAPS and SMTP SSL protocols on mail servers)
extension=pdo_mysql.so
修改里面的open_basedir
#在这里输入代码(从下一行开始,不要删除我...)
open_basedir = /var/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/var/www/
重启php
#在这里输入代码(从下一行开始,不要删除我...)
sudo service php-fpm restart
检查一下phpinfo如果和图中一致就OK了


设置nginx
在 nginx里面添加上下面的代码,注意要把我的域名换成你自己的。还要手动创建相关的log文件。
#在这里输入代码(从下一行开始,不要删除我...)

server {
        server_name mail.randoms.me;
        root /var/www/rainloop/;
        access_log /var/www/rainloop/logs/access.log;
        error_log /var/www/rainloop/logs/error.log;

        location / {
                index index.html index.htm index.php;
                autoindex on;
                autoindex_exact_size off;
                autoindex_localtime on;
        }

        location ~ \.php$ {
                fastcgi_index index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        location ^~ /data {
                deny all;
        }
}
测试一下nginx的配置
#在这里输入代码(从下一行开始,不要删除我...)
sudo nginx -t
如果出现test ok,就说明这个配置没有问题。
这时候访问 mail.yourdomain.com就可以打开rainloop了。

下面就是开始配置rainloop了
进入admin页面 http://mail.yourdomain.com?admin, 默认的用户名是admin密码是12345.
在domain里面做如下的设置


注意一定要点选上use short login否则会通不过认证。很重要的一件事,别忘了改密码。

添加mysql数据库
#在这里输入代码(从下一行开始,不要删除我...)

mysql -u root -p
create database if not exists rainloop;
create user rainloop_user@localhost identified bypassword”;
grant all privileges on rainloop.* to rainloop_user@localhost;
flush privileges;
exit;
注意把password改成自己的密码。

在rainloop的admin panel里面添加上数据库设置
在contacts里面填入刚创建的数据库参数


测试完成后就可以了。
现在就可以尝试登录了 http://mail.yourdomian.com



设置dns解析
本地的软件设置完了,还要设置dns的解析。这个就要到你的域名服务商去设置了,设置很简单,添加一个mx记录就可以了。

Debug
在安装过程中会遇到各种的问题,这时候找到问题发生的原因就很关键,最好的方法就是看log。postfix的log在/var/logs/syslog里面, dovecot的log也在里面。rainloop的log在之前设置的nginx.conf里面。

这个文章写得比较粗糙。如果你有什么疑问可以给我发邮件 randoms@randoms.me

对了,这样设置好之后有可能你发的邮件会被拒收,或者总是进入别人的垃圾箱里。这是因为没有设置rdns record。什么是rdns呢?就是从ip反向解析到域名的记录。没有这个记录接收邮件的人就无法确认这个邮件确实来自邮件的发送者,所以接受者一般会拒收邮件或者作为垃圾邮件处理邮件。rdns要到你的云服务提供商那里去设置,但是有些服务商并不提供这种设置。azure是支持设置的。具体可以看这里 http://azure.microsoft.com/blog/2014/07/21/announcing-reverse-dns-for-azure-cloud-services/。实际上对于azure不设置也可以,我也不知道为什么。也许只要有一个rdns记录就可以了,并不要求记录和mail的domian相对应。
标签上篇: 下一步计划 次篇: 简谱