使用Postfix,Dovecot,MySQL和RoundCube在CentOS 8上设置邮件服务器

时间:2020-02-23 14:31:27  来源:igfitidea点击:

为了设置完整的简单邮件服务器,本教程利用了Postfix作为SMTP服务器,Dovecot提供POP/IMAP功能以及RoundCube作为Webmail程序或者客户端的优势,以便用户可以从自己喜欢的Web站点检查和接收电子邮件。浏览器。

为了清除所有行话,让我们知道我们将要使用的组件是什么。

Dovecot:Dovecot是用于Linux/UNIX类系统的开源IMAP和POP3电子邮件服务器,主要考虑安全性。
Postfix:Postfix是一个免费的开源邮件传输代理(MTA),可以通过Internet将电子邮件从一台服务器路由并传递到另一台服务器。
Roundcube:将邮件发送到邮箱后,大多数用户将需要一个易于使用的界面来阅读其邮件。 Roundcube做得很好。它是基于浏览器的多语言IMAP客户端,具有类似于应用程序的用户界面。它提供了我们希望电子邮件客户端提供的全部功能,包括MIME支持,地址簿,文件夹操作,消息搜索和拼写检查。

生产使用的前提条件

为了将服务器用于生产用途,必须确保具备以下条件

  • 我们必须具有完全合格的域名(FQDN)
  • 在公共域名服务器中为域创建A和MX记录。这些记录必须指向服务器的公共IP。

现在我们在同一个页面上,是时候进入它们都一起工作的部分了。顺序有点混乱,但是请理解并确保每个配置正确。

更新,设置主机名并禁用SELinux

这是为了确保我们从最新的软件包开始,以确保应用所有以前的补丁程序,从而从一个安全且最新的系统开始。

$sudo dnf update
$sudo hostnamectl set-hostname mail.example.com

# Disable SELinux
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
sudo reboot

安装postfix,Apache和PHP

我们需要一个邮件传输代理来处理来自我们的邮件服务器的邮件发送和传递。幸运的是,postfix做到了这一点。要安装后缀,请在服务器备份后运行以下命令。

sudo dnf install postfix postfix-mysql httpd vim policycoreutils-python-utils epel-release -y

Roundcube将使用PHP在浏览器中呈现页面,因此需要安装它。请按照以下教程中的说明进行安装。

如何在CentOS 8/RHEL 8上安装PHP 7.4

安装PHP之后,添加额外的PHP软件包,如下所示:

sudo dnf install -y php-common php-json php-xml php-mbstring php-mysqlnd

安装和配置MySQL

我们将需要一个数据库来存储和检索Roundcube和Postfix的重要数据。按照以下教程安装MariaDB:

如何在CentOS 8/RHEL 8上安装MariaDB 10.x

安装MariaDB后,我们将通过为Roundcube安装创建MariaDB用户名和数据库来继续配置它。此外,我们将创建Postfix Mail帐户数据库。使用以下命令登录MariaDB客户端:

mysql -u root -p

提供root密码并为Postfix Mail帐户创建一个数据库,如下所示

create database postfix_accounts;

为我们刚创建的邮件帐户数据库创建一个具有完全权限的用户。

grant all on postfix_accounts.* to theitroad@localhost identified by 'StrongPassword';
flush privileges;

在数据库中创建一个表,该表将存储我们希望在服务器中托管的域。

CREATE TABLE `postfix_accounts`.`domains_table` ( `DomainId` INT NOT NULL AUTO_INCREMENT , `DomainName` VARCHAR(50) NOT NULL , PRIMARY KEY (`DomainId`)) ENGINE = InnoDB;

在数据库中创建一个表,该表将保存用户帐户

CREATE TABLE `postfix_accounts`.`accounts_table` ( 
    `AccountId` INT NOT NULL AUTO_INCREMENT,  
    `DomainId` INT NOT NULL,  
    `password` VARCHAR(300) NOT NULL,  
    `Email` VARCHAR(100) NOT NULL,  
    PRIMARY KEY (`AccountId`),  
    UNIQUE KEY `Email` (`Email`),  
    FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE 
) ENGINE = InnoDB;

在数据库中创建一个表,该表将保存电子邮件别名数据。

别名基本上允许发送到一个帐户的电子邮件在到达邮件服务器后被重定向到另一个帐户。例如,如果希望将所有theitroad @ localhost电子邮件发送到theitroad @ localhost,则可以创建一个别名来完成该功能。

CREATE TABLE `postfix_accounts`.`alias_table` (
    `AliasId` INT NOT NULL AUTO_INCREMENT, 
    `DomainId` INT NOT NULL, 
    `Source` varchar(100) NOT NULL, 
    `Destination` varchar(100) NOT NULL, 
    PRIMARY KEY (`AliasId`), 
    FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
) ENGINE = InnoDB;

将记录添加到我们刚刚在Postfix Mail Accounts数据库中创建的表中。

现在,我们将添加域,一些帐户和别名。

INSERT INTO `postfix_accounts`.`domains_table` (DomainName) VALUES ('example.com');  
INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('Password', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), 'theitroad@localhost');  
INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('Password', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), 'theitroad@localhost');  
INSERT INTO `postfix_accounts`.`alias_table` (DomainId, Source, Destination) VALUES (1, 'theitroad@localhost', 'theitroad@localhost');

我们可以使用喜欢的名称和密码(强):

postfix_admin用户和postfix_accounts数据库名称

为Roundcube创建一个数据库,稍后再安装

现在我们已经在数据库中,我们还可以如下添加roundcubes DB。

create database roundcube;

为我们刚创建的数据库创建一个具有完全权限的用户。

grant all on roundcube.* to theitroad@localhost identified by 'StrongPassword';
flush privileges;

我们可以使用喜欢的名称和密码(强):

roundcube_admin用户和roundcube数据库名称。

完成之后,注销数据库并跳到下一步。

quit;

配置Postfix

现在让我们配置Postfix,以确保它能够从我们的服务器接收和传递邮件。其配置文件位于/etc/postfix下。

配置主配置文件

sudo vim /etc/postfix/master.cf

取消注释文件中的以下行。确保以-o开头的行保持缩进。

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt   ## Comment this if you have no SSL(not recommended)
  -o smtpd_tls_auth_only=yes            ## Comment this if you have no SSL(not recommended)
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_reject_unlisted_recipient=no
pickup    unix  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp

showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
#virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache

在文件底部添加以下与鸽舍相关的配置。

dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

我们将在稍后安装和配置dovecot。

完成上述更改后,请保存文件。

打开main.cf文件

/etc/postfix/main.cf文件具有用于Postfix安装的主要配置选项。

sudo vim /etc/postfix/main.cf

进行以下更改:

配置主机名

取消注释myhostname行,并用服务器主机名替换host.domain.tld。

myhostname = mail.example.com

配置域

将域添加到mydomain行,如下所示:

mydomain = example.com   ## Input your unique domain here

取消注释或者添加以下行,以使它们前面没有#号

myorigin = $myhostname
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
smtpd_recipient_restrictions = permit_mynetworks
home_mailbox = Maildir/

将以下配置行添加到文件末尾。我们会注意到,其他配置与SSL相关。如果我们有SSL文件,请将它们复制到合适的位置,然后如图所示添加它们。如果我们没有SSL,只需在这些选项上添加注释(添加在前面)即可将其停用。

append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
dovecot_destination_recipient_limit = 1
message_size_limit = 4194304
smtpd_tls_key_file = /etc/postfix/ssl/yourkey.key           ##SSL Key
smtpd_tls_cert_file = /etc/postfix/ssl/yourcertificate.crt  ##SSL Cert
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_security_level=may
virtual_transport = dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

还要添加以下配置,该配置使Postfix可以访问在中创建并存储在数据库中的帐户相关数据。

virtual_mailbox_domains = mysql:/etc/postfix/database-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/database-users.cf
virtual_alias_maps = mysql:/etc/postfix/database-alias.cf

现在,让我们将数据库配置添加到这些特定文件,如下所示。请注意,稍后将在本教程的下一步中创建数据库和表。

允许Postfix从数据库访问域

$sudo vim /etc/postfix/database-domains.cf

user = postfix_admin
password = StrongPassword
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT 1 FROM domains_table WHERE DomainName='%s'

允许Postfix从数据库访问用户帐户

$sudo vim /etc/postfix/database-users.cf

user = postfix_admin
password = StrongPassword
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT 1 FROM accounts_table WHERE Email='%s'

允许Postfix访问数据库中的电子邮件别名

$sudo vim /etc/postfix/database-alias.cf

user = postfix_admin
password = StrongPassword
hosts = 127.0.0.1
dbname = postfix_accounts
query = SELECT Destination FROM alias_table WHERE Source='%s'

更改我们上面创建的文件的所有权和权限

更改这些文件的权限

sudo chmod 640 /etc/postfix/database-domains.cf
sudo chmod 640 /etc/postfix/database-users.cf
sudo chmod 640 /etc/postfix/database-alias.cf

和文件的所有权是这样的

sudo chown root:postfix /etc/postfix/database-domains.cf
sudo chown root:postfix /etc/postfix/database-users.cf
sudo chown root:postfix /etc/postfix/database-alias.cf

由于我们进行了新的更改,因此需要重新启动Postfix来加载新的配置。

sudo systemctl restart postfix

测试我们进行的Postfix设置

现在我们的数据库已建立,让我们测试在Postfix上进行的配置是否有效。如果成功,我们应该看到一个1,最后一个看到一个别名电子邮件地址。

sudo postmap -q example.com mysql:/etc/postfix/database-domains.cf
1
sudo postmap -q theitroad@localhost mysql:/etc/postfix/database-users.cf
1
sudo postmap -q theitroad@localhost mysql:/etc/postfix/database-users.cf
1
sudo postmap -q theitroad@localhost mysql:/etc/postfix/database-alias.cf
theitroad@localhost

安装和配置Dovecot

如前所述,Dovecot是适用于类似Linux/UNIX的系统的开源IMAP和POP3电子邮件服务器。这些协议使邮件用户能够从服务器检索到其本地邮件客户端的邮件,并从服务器删除邮件。像这样安装Dovecot:

sudo dnf install dovecot dovecot-mysql -y

成功安装后,让我们添加一个将负责处理系统中邮件的用户和组。

sudo groupadd -g 6000 vmail 
sudo useradd -g vmail -u 6000 vmail -d /home/vmail -m

Dovecot有许多配置文件。让我们逐步编辑它们,以确保准确捕获每个配置。

打开dovecot主配置文件,并确保以下行没有登录。

$sudo vim /etc/dovecot/dovecot.conf

listen = *, ::
protocols = imap pop3 lmtp
!include conf.d/*.conf
!include_try local.conf
log_path = /var/log/dovecot.log  ##Add this for logs

接下来,打开/etc/dovecot/conf.d/10-auth.conf文件,并确保下面的行没有注释。我们会注意到默认情况下启用了#!include auth-system.conf.ext。注释掉它,仅启用!include auth-sql.conf.ext。

$sudo vim /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext     ## Only enable authentication through SQL and leave other authentication methods disabled

之后,我们需要将配置添加到上面启用的文件中。那是/etc/dovecot/conf.d/auth-sql.conf.ext。

这些是使用的一些特殊变量

  • %u用户名
  • theitroad @ localhost中的%n用户部分,如果没有域,则与%u相同
  • theitroad @ localhost中的%d个域部分,如果没有域则为空
  • %h主目录

从下面的配置中可以看到,我们将电子邮件存储在/home/vmail /中。

$sudo vim /etc/dovecot/conf.d/auth-sql.conf.ext

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static     ## Don't forget to change this
  args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
}

创建/home/vmail/domain目录(/home/vmail /%d /)

sudo mkdir /home/vmail/example.com

让我们在上面文件的args中包含的文件中添加为后缀配置的数据库详细信息

$sudo vim /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = "host=127.0.0.1 dbname=postfix_accounts user=postfix_admin password=StrongPassword"
default_pass_scheme = SHA512-CRYPT
password_query = SELECT Email as User, password FROM accounts_table WHERE Email='%u';

现在,我们将配置邮箱位置和名称空间

打开此文件/etc/dovecot/conf.d/10-mail.conf并确保将设置更改为与以下配置相似

$sudo vim /etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/home/vmail/%d/%n/Maildir
namespace inbox {
  inbox = yes
}
mail_privileged_group = mail
mbox_write_locks = fcntl

接下来,打开/etc/dovecot/conf.d/10-master.conf并对其进行以下更改,然后保存。

$sudo vim /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
   mode = 0600
   user = postfix
   group = postfix
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  unix_listener auth-userdb {
   mode = 0600
   user = vmail
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
  }
}

vmail用户负责在服务器中处理邮件。因此,用户需要访问邮件的位置。授予vmail用户所需的权限,如下所示:

sudo chown –R vmail:vmail /home/vmail

向vmail和dovecot用户授予读取配置文件的权限。

sudo chown -R vmail:dovecot /etc/dovecot 
sudo chmod -R o-rwx /etc/dovecot

配置SSL相关问题

在/etc/dovecot/conf.d/10-ssl.conf中,可以选择进行SSL配置。如果没有对Dovecot使用任何SSL的说明,请打开文件并将ssl设置为no

$sudo vim /etc/dovecot/conf.d/10-ssl.conf

ssl = no

##If you want to use SSL here use ssl = required then add the files like:

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

安装和配置Roundcube

现在,使用基于Web的客户端,使用户可以查看他们的邮件。我们可以从他们的官方网页上下载Roundcube的最新稳定版本。

VER="1.4.5"
wget https://github.com/roundcube/roundcubemail/releases/download/$VER/roundcubemail-$VER-complete.tar.gz

解压缩下载的文件并更改结果目录的名称

tar xvzf roundcubemail-$VER-complete.tar.gz
mv roundcubemail-$VER roundcube

现在,将新目录移动到Apache的文档根目录,将其所有权更改为apache并重新启动Apache Web服务器。

sudo mv roundcube /var/www/html/
sudo chown -R apache:apache /var/www/html/
sudo systemctl restart httpd

在我们喜欢的浏览器上加载Roundcube以完成安装

打开浏览器并输入以下网址

http://IP/FQDN/roundcube /安装程序

如果安装程序未加载,请确保Web服务器正在运行,并且已在防火墙上启用了端口80

sudo systemctl status httpd

sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload

请按照以下屏幕截图完成Roundcube的设置

确保所有PHP检查均正常。

如果一切正常,请向下滚动并单击"下一步"。

在下一页上,查找"数据库设置",然后填写我们之前创建的Roundcube数据库详细信息。之后,我们可以根据需要在页面上添加其他配置,然后滚动到底部并单击CREATE CONFIG。

在"创建配置"部分中,找到"创建配置",然后单击它,这将导致一个如下所示的页面,在该页面中,我们需要下载和传输配置文件或者手动创建它。选择一个我们满意的。请注意,此文件可能会自动保存到/var/www/html/roundcube/config /。如果不是,则继续执行步骤。

初始化数据库

如果下载了文件,请将其传输到服务器,然后将其复制到说明中指定的目录中。在那之后单击继续。

sudo cp config.inc.php /var/www/html/roundcube/config/
sudo chown apache:apache /var/www/html/roundcube/config/config.inc.php

编辑配置文件以包括smtp主机,端口和登录方法

$sudo vim /var/www/html/roundcube/config/config.inc.php

$config['default_host'] = 'localhost';  ## If SSL is configured, use: $config['default_host'] = 'ssl//mail.example.com';
$config['support_url'] = '';
$config['defautl_port'] = 143;
$config['smtp_server'] = 'localhost';   ## If SSL is confgured, use: $config['smtp_server'] = 'tls//mail.example.com'; 
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['smtp_auth_type'] = 'LOGIN';
$config['debug_level'] = 1;
$config['smtp_debug'] = true;
$config['plugins'] = array('virtuser_query');                                                                    
$config['virtuser_query'] = "SELECT Email FROM postfix_accounts.accounts_table WHERE Email = '%u'"; ## Enables Roundcube to use authentication for virtual users for outgoing mail

到现在为止一切都还可以。在页面底部,我们会看到一条横幅,建议我们在成功设置Roundcube之后删除整个安装程序目录。

在防火墙上打开所有需要的端口

如果防火墙正在运行,请允许以下端口

  • HTTPS:443
  • SMTP:25
  • POP3:110
  • IMAP:143
  • SMTP安全:465
  • MSA:587
  • IMAP安全:993
  • POP3安全:995
sudo firewall-cmd --permanent --add-port={443,25,110,143,465,587,993,995}/tcp
sudo firewall-cmd --reload

测试我们的邮件服务器

一切就绪并准备就绪后,就该测试我们是否能够发送和接收电子邮件了。

加载浏览器并输入https://IP-or-FQDN/roundcube

输入我们之前配置的任何电子邮件帐户及其相应的密码。

登录后,测试是否可以从本地域和外部域收发邮件,以及是否满足要求。