这两天心血来潮,准备在Debian 7 下搭建一个电子邮件系统,然后就去学习了一下。
根据度娘定义:电子邮件系统由用户代理MUA(Mail User Agent)以及邮件传输代理MTA(Mail Transfer Agent),MDA(Mail Delivery Agent)邮件投递代理组成。
Mail User Agent (MUA):邮件使用者代理人,这是使用者用来写信、收信的程序。例如,我们常用的 Outlook Exporess、Thunderbird 等。它的作用在于提供使用者一个好用的收发信件接口,并将信传到自己的邮件服务器。这个一般不需要自己弄,我在安卓手机上用gmail客户端,win7电脑上用foxmail客户端,当然在手机和电脑上都可以使用浏览器,通过webmail访问邮箱,我使用的是rainloop,它是使用MUA方式在服务器上实现的webmail解决方案。
Mail Delivery Agent (MDA):邮件递送代理人,负责将要给本地使用者的邮件分配到使用者的信箱中。在 UNIX 中,MDA 通常是 mail 这支程序。
Mail Transfer Agent (MTA):邮件转送代理人,是一个负责转送信件的服务器。UNIX 中使用的 Sendmail、Postfix 就是 MTA 软件。它的作用在于收到 MTU 寄来的信后,根据信件地址,将信件转送到目的地。在目的地中,也有另一台 MTA 会负责接收信件。有时候信件并不会一次就从使用者的计算机传送到目的地的主机,而是会经由许多 MTA 转送到目的地的主机。这种 MTA 接收非自己的信件,并转送到别台 MTA 的动作就叫作「Relay」。

另外,还需要了解到:
POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
区别:
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
SMTP
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

当然,为了实现这些功能还需要装一些辅助软件,例如web服务器软件,数据库软件等等。
我所用的软件包括:
1). web服务器:apache2
2). MTA & MDA(实现SMTPS):postfix
3). IMAP 和 POP3电子邮件服务器:dovecot
4). 数据库软件:mysql
5). webmail(MUA模式):rainloop免费版
6). 交互网页语言支持:php
7). 后台管理软件:postfixadmin

0、安装前准备工作:

a.申请一个域名,DNS绑定vps的ip地址,添加spf记录,做好反向DNS(Reverse DNS)解析

找个国外的域名供应商,千万别买国内的。。。国外的可以找name.com或者godaddy上搜一个,然后注册,绑定vps的公网ip地址,添加spf记录(Sender Policy Framework。翻译过来就是发信者策略架构,SPF是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。),防止你的邮件服务器发出的信被认为是垃圾邮件。
我添加了两个spf,分别是v=spf1 ip4:我的IP ~all 和 v=spf1 mx -all,另外还在vps供应商处做了反向DNS的解析。

b.在vps中添加hostname

1).修改 /etc/hostname 添加一个名字,例如:holycoco。

echo "holycoco" > /etc/hostname

2).使之生效。

hostname -F /etc/hostname

3).修改 /etc/hosts,添加一些内容,如果网站是example.com,就这样写,如果网站是别的就填别的。

127.0.0.1 localhost.localdomain localhost
我的IP holycoco.example.com holycoco

4).检查host。

hostname
hostname -f

前者应该显示holycoco,后者应该显示holycoco.example.com,千万别略过这步骤,否则会后悔的。。。

1、安装apache2

a.安装

apt-get install apache2
cp /etc/apache2/apache2.conf /etc/apache2/apache2.backup.conf
vi /etc/apache2/apache2.conf

b.由于我的vps内存只有1GB所以进行优化:

KeepAlive Off
...
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 6
MaxSpareServers 12
MaxClients 80
MaxRequestsPerChild 3000
</IfModule>

c.重启服务

service apache2 restart

d.禁用apache默认设置,创建一些文件夹,做一些配置

a2dissite *default
cd /var/www
mkdir example.com
mkdir -p example.com/public_html
mkdir -p example.com/log
mkdir -p example.com/backups
vi /etc/apache2/sites-available/example.com.conf

e.为了支持多个域名,编辑内容如下,(重启apache以后可能会有warning,因为还没建后面几个文件夹)

# domain: example.com
# public: /var/www/example.com/public_html/
<VirtualHost *:80>
  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin webmaster@example.com
  ServerName  www.example.com
  ServerAlias example.com
  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /var/www/example.com/public_html
  # Log file locations
  LogLevel warn
  ErrorLog  /var/www/example.com/log/error.log
  CustomLog /var/www/example.com/log/access.log combined
</VirtualHost>
<VirtualHost *:80>
  DirectoryIndex index.html index.php
  DocumentRoot /var/www/example.com/public_html/postfixadmin
  ServerName pfadmin.example.com
</VirtualHost>
<Directory /var/www/example.com/public_html/webmail>
  Options FollowSymLinks
  <IfModule mod_php5.c>
    php_flag register_globals off
  </IfModule>
  <IfModule mod_dir.c>
    DirectoryIndex index.php
  </IfModule>
</Directory>
<Directory /var/www/example.com/public_html/webmail/data>
 deny from all
</Directory>
<VirtualHost *:80>
  DirectoryIndex index.html index.php
  DocumentRoot /var/www/example.com/public_html/webmail
  ServerName webmail.example.com
</VirtualHost>

f.使配置文件生效,重启服务

a2ensite example.com.conf
service apache2 restart

2、安装mysql

a.安装

apt-get install mysql-server
mysql_secure_installation

设置完root的密码,一定要自己记录下来。。。
另外安全设置时要删除匿名用户,删除默认测试数据库,禁止root远程登录

b.为1GB内存进行优化

vi /etc/mysql/my.cnf
max_connections = 75
key_buffer = 32M
max_allowed_packet = 1M
thread_stack = 128K
table_cache = 32

c.创建数据库,后面要用:

mysql -u root -p
create database mynamemailserver;
GRANT all privileges  ON mynamemailserver.* TO 'mymailuser'@'holycoco.example.com' IDENTIFIED BY 'mypassword';
GRANT all privileges  ON mynamemailserver.* TO 'mymailuser'@'127.0.0.1' IDENTIFIED BY 'mypassword';

d.重启数据库服务

service mysql restart

这里可以不建表,因为装postadmin的时候会建的。。。

3、安装php支持

a.安装

apt-get install php5 libapache2-mod-auth-mysql libmysqlclient15-dev php5-mysql curl libcurl3 libcurl3-dev php5-curl php5-json php-pear

b.为1GB内存进行优化,修改部分内容

vi /etc/php5/apache2/php.ini
max_execution_time = 30
memory_limit = 128M
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
register_globals = Off

c.记录日志,重启web服务,加载php模块

mkdir -p /var/log/php
chown www-data /var/log/php
service apache2 restart

4.安装postfix和dovecot

a.安装

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

弹出的框里面Postfix configuration选Internet Site,System mail name填入example.com,如果网站是别的就填别的。

b.配置postfix,限制用户邮箱大小等一系列东东,用户认证使用dovecot,而不是默认的virtual_mailbox

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
vi /etc/postfix/main.cf

/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 (Debian/GNU)
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/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.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
smtpd_tls_cert_file=/etc/dovecot/dovecot.pem
smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
#Enabling SMTP for authenticated users, and handing off authentication to Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
          permit_sasl_authenticated,
          permit_mynetworks,
          reject_unauth_destination
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
inet_interfaces = all
myhostname = holycoco.example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
#Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Virtual mailbox settings.
 
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_uid_maps = static:postfix 用户的uid

virtual_gid_maps = static:postfix 用户的gid

message_size_limit = 102400000
virtual_mailbox_limit = 2097152000
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual-mailbox-limit-maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has exceeded the quota.
virtual_overquota_bounce = yes

virtual_uid_maps 和 virtual_gid_maps 改成postfix用户的uid和gid ,可用 id postfix 命令获取
注:postfix服务重启后会有warning,据说可以别理它。。。

c.添加数据库查询配置文件,用来认证用户登录时候的sql语句

这些表现在还没建,后面装postfixadmin的时候会自动建的

vi /etc/postfix/mysql-virtual-alias-maps.cf

这个是转发表查询

user = mymailuser
password = mypassword
hosts = 127.0.0.1
dbname = mynamemailserver
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#query = SELECT destination FROM virtual_aliases WHERE source='%s'
vi /etc/postfix/mysql-virtual-mailbox-domains.cf

这个是domain表查询

user = mymailuser
password = mypassword
hosts = 127.0.0.1
dbname = mynamemailserver
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
vi /etc/postfix/mysql-virtual-mailbox-limit-maps.cf

这个是邮箱空间配额查询,不知道有没有用。。。

user = mymailuser
password = mypassword
hosts = 127.0.0.1
dbname = mynamemailserver
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
vi /etc/postfix/mysql-virtual-mailbox-maps.cf

这个是最关键的登录查询了

user = mymailuser
password = mypassword
hosts = 127.0.0.1
dbname = mynamemailserver
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

d.配置开启哪些邮件服务

cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
vi /etc/postfix/master.cf

允许smtp走ssl,在端口 25,另外还有587和465(这个不懂),反正就是把submission和smtps前面注释去掉。

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
submission inet n       -       -       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

e.重启postfix服务

service postfix restart

f.配置dovecot

cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig
vi /etc/dovecot/dovecot.conf
!include conf.d/*.conf
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
vi /etc/dovecot/conf.d/10-mail.conf
#这个配置很重要
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail

检查权限

ls -ld /var/mail

应该是这样

drwxrwsr-x 2 root mail 4096 Mar  6 15:08 /var/mail
mkdir -p /var/mail/vhosts/example.com
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
chown -R vmail:vmail /var/mail
vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
vi /etc/dovecot/conf.d/auth-sql.conf.ext
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
vi /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
default_pass_scheme = SHA512-CRYPT
#注意这2个表现在还没有,后面postfixadmin会建的
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 502 AS uid, 502 AS gid FROM mailbox WHERE username = '%u'
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
vi /etc/dovecot/conf.d/10-master.conf
#禁止不加 密登录
service imap-login {
    inet_listener imap {
      port = 0
    }
  ...
  }
  service pop3-login {
    inet_listener pop3 {
      port = 0
    }
  ...
  }
#lmtp
  service lmtp {
   unix_listener /var/spool/postfix/private/dovecot-lmtp {
     mode = 0600
     user = postfix
     group = postfix
    }
    # Create inet listener only if you can't use the above UNIX socket
    #inet_listener lmtp {
      # Avoid making LMTP visible for the entire internet
      #address =
      #port =
    #}
  }
#auth
service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
  # permissions make it readable only by root, but you may need to relax these
  # permissions. Users that have access to this socket are able to get a list
  # of all usernames and get results of everyone's userdb lookups.
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    #group =
  }
  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}
  # Auth process is run as this user.
  user = dovecot
}
#auth-worker
service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  user = vmail
}

检查自签名证书,非常重要

ls /etc/dovecot/dovecot.pem
ls /etc/dovecot/private/dovecot.pem
vi /etc/dovecot/conf.d/10-ssl.conf

强制ssl

ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem
ssl = required

重启dovecot服务

service dovecot restart

5.安装postfixadmin

a.下载安装postfixadmin

wget 'http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.92/postfixadmin-2.92.tar.gz?use_mirror=jaist'
tar zxvf postfixadmin-2.92.tar.gz
mv postfixadmin-2.92 /var/www/example.com/public_html/postfixadmin

这时候/var/www/example.com/public_html/postfixadmin下应该有config.inc.php文件,否则就是再嵌了个文件夹了。。。

b.修改配置文件

vi config.inc.php
$CONF['default_language'] = 'cn';
$CONF['configured'] = true;
$CONF['default_language'] = 'en';
$CONF['database_type'] = 'mynamemailserver';
$CONF['database_host'] = '127.0.0.1';
$CONF['database_user'] = 'mymailuser';
$CONF['database_password'] = 'mypassword';

汉化不完全的可以打开language下的cn.lang手工修改。。。

c.用浏览器访问Postfixadmin的设置页http://pfadmin.example.com/setup.php,会进行检查,各项ok后,最后自动生成数据表,shell下检查一下,如果是这些就ok了:

show tables;
...
| admin                         |
| alias                         |
| alias_domain                  |
| config                        |
| domain                        |
| domain_admins                 |
| fetchmail                     |
| log                           |
| mailbox                       |
| quota                         |
| quota2                        |
| vacation                      |
| vacation_notification         |
...

d.在浏览器页面下面创建Setup password,填复杂一些,点击“Generate password hash”获取hash代码,将代码拷贝到配置文件config.inc.php中的以下配置中

$CONF['setup_password'] = 'changeme';#(用hash代码替换changeme)

e.然后重启apache2服务:

service apache2 restart

f.再次访问http://pfadmin.example.com/setup.php,创建管理员的账号和密码

(需要正确输入之前创建的Setup password(填的不是hash值)才能创建管理员账号)
设置完成后要做一些安全工作

rm setup.php
chown root config.inc.php

g.最后访问PostfixAdmin的登录页http://pfadmin.example.com/

使用管理员账号登录后,就可以添加domain和多用户邮箱什么的了。

6.安装rainloop

其实webmail有很多,为啥选这个呢,因为这个干净,纯php webmail前台页面,它并不创建一个数据库,应用直接访问邮件服务器来显示电子邮件。解压就能用,支持多国语言。

a.下载解压

mkdir /var/www/example.com/public_html/webmail
cd /var/www/example.com/public_html/webmail
wget http://repository.rainloop.net/v2/webmail/rainloop-latest.zip
unzip rainloop-latest.zip
rm rainloop-*.zip

这时候webmail目录下应该有个index.php,还有2个文件夹data和rainloop,否则又是嵌套了一层。

b.设置权限

cd /var/www/example.com/public_html/webmail
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chown -R www-data:www-data .

c.直接访问管理页面进行配置:

URL : http://webmail.example.com/?admin
User : admin
Pass : 12345

登陆以后进行修改,设置复杂密码。

d.设置主要是修改几个地方:

Login 里面不要填default domain,如果你只有一个domain的话,选择Try to determine user domain
Domain 里面 add domain,然后点击新增的domain名字,填写imap和smtp信息,注意不要选use short login,我发现选了以后反而是disabled,不选反而ok。。然后smtp我选的是use php mail(),否则test通不过。
按上面的设置,正确的应该是:Port 993 for secure IMAP, Port 995 for secure POP3, and Port 25 with SSL for SMTP
大工告成!
访问http://webmail.example.com/ 就可以登录邮箱了。或者用第三方客户端进行设置以后也可以使用,第三方客户端设置时,接收服务可选IMAP 993 SSL(接受所有证书)或POP3 995 SSL(接受所有证书),发送服务选SMTP 25 STARTTLS(接收所有证书)。这里之所以用dovecot自签名的证书,是因为穷!商业证书都太贵了,土豪可以选Verisign。。。
最后发2个图。


AltText


AltText
参考文档:
1.https://www.linode.com/docs/getting-started
2.https://www.linode.com/docs/websites/hosting-a-website
3.https://www.linode.com/docs/email/running-a-mail-server
4.https://www.linode.com/docs/email/postfix/email-with-postfix-dovecot-and-mysql
5.http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html
6.http://help.163.com/10/0203/13/5UJONJ4I00753VB8.html
7.http://www.sulabs.net/?p=311
8.http://www.tecmint.com/rainloop-webmail-a-modern-fast-web-based-email-client-for-linux/