简介:
在本指南中,我们将演示如何在 Ubuntu 22.04 上安装和配置邮件服务器,因为大中型公司可以从拥有私人邮件服务器中获益匪浅。通过使用邮件服务器,可以密切监视所有电子邮件流量。此外,自定义设置的灵活性使得建立清晰且有组织的电子邮件服务成为可能。虽然有多种设置 Linux 邮件服务器的选项,但我们将特别关注 Postfix 和 Dovecot。
准备工作
服务器准备
必要前提:
- 一个充满求知欲的大脑。
- 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。
我将以 雨云 为例,带大家创建一台属于自己的云服务器,以便学习本篇文章的内容。
创建服务器
以下步骤仅供参考,请根据实际需求选择配置。
- 点击 云产品 → 云服务器。
- 建议选择距离你较近的区域,以保证低延迟。
- 按照自己需求合理选择配置并订购。
- 随后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。
- 我们使用
PowerShell
进行SSH
远程连接到服务器,Win+R
打开运行窗口,输入powershell
后点击确定。
- 输入
ssh root@你的服务器IP
例如ssh root@154.9.227.239
回车后,首次需要输入yes
,再次回车后即可登录服务器。
- 到此为止,我们的云服务器就远程连接上了。
安装和配置步骤
第一步:设置主机名
主机名是用于标识计算机的标签,它将帮助你区分你的服务器与其他服务器。你需要为你的主机名创建一个 DNS A 记录,因为服务器主机名应该是一个 FQDN(完全限定域名)。例如,在本教程中,我们将使用 ubuntu.yourdomain.com 作为服务器主机名。随后,执行以下命令:
bash
$ sudo hostnamectl set-hostname ubuntu.yourdomain.com
请确保将 ubuntu.yourdomain.com 替换为你自己的指向服务器 IP 地址的子域
第二步:安装依赖项
在这一步中,我们将安装 Apache Web 服务器,带有其扩展的 PHP 和MariaDB 作为数据库服务器。让我们执行以下命令:
bash
$ sudo apt install apache2 git mariadb-server php-{xml,pear,imap,intl,common,json,curl,mbstring,mysql,gd,imagick,zip,opcache,sqlite3} libapache2-mod-php
第三步:创建系统用户
在这一步中,我们将创建一个新的系统用户,用于在服务器上存储电子邮件。让我们调用以下命令。
bash
$ sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual Mail User" vmail
$ sudo mkdir -p /var/vmail
$ sudo chmod -R 770 /var/vmail
$ sudo chown -R vmail:mail /var/vmail
第四步:创建数据库
接下来,让我们创建一个数据库。默认情况下,你可以在没有密码的情况下登录到 MySQL shell。
bash
$ sudo mysql
登录后,让我们运行这些命令。
sql
MariaDB [(none)]> CREATE DATABASE postfixadmin;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'M0d1fyth15';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> \\q
请务必使用强密码替换 M0d1fyth15
。
第五步:安装 Postfix
使用以下命令从 Ubuntu 默认存储库安装 Postfix 邮件服务器:
bash
$ sudo apt install postfix-mysql
邮件服务器相关的数据将存储在 MySQL 数据库中。一旦 postfix-mysql
包安装完成,我们需要创建几个配置文件,以便 Postfix 与数据库进行通信。
bash
$ sudo mkdir -p /etc/postfix/sql
将密码、数据库名称和数据库用户与你在较早步骤中创建的那些匹配。
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_alias_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_domains_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_mailbox_limit_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
bash
$ sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = postfixadmin
password = M0d1fyth15
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
请务必使用你在第四步中设置的密码替换 M0d1fyth15
。
现在,我们可以运行以下命令来编辑 postfix 的 main.cf 文件。
bash
$ sudo postconf -e "myhostname = $(hostname -f)"
$ sudo postconf -e "mydestination = localhost"
$ sudo postconf -e "mynetworks = 127.0.0.0/8"
$ sudo postconf -e "inet_protocols = ipv4"
$ sudo postconf -e "inet_interfaces = all"
$ sudo postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem"
$ sudo postconf -e "smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key"
$ sudo postconf -e "smtpd_use_tls = yes"
$ sudo postconf -e "smtpd_tls_auth_only = yes"
$ sudo postconf -e "smtpd_sasl_type = dovecot"
$ sudo postconf -e "smtpd_sasl_path = private/auth"
$ sudo postconf -e "smtpd_sasl_auth_enable = yes"
$ sudo postconf -e "smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination"
$ sudo postconf -e "virtual_transport = lmtp:unix:private/lmtp"
$ sudo postconf -e "virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf"
$ sudo postconf -e "virtual_alias_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf"
$ sudo postconf -e "virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf"
完成后,我们可以继续编辑 /etc/postfix/master.cf 文件:
bash
$ sudo nano /etc/postfix/master.cf
修改或将以下行添加到文件中。
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 0 tlsproxy
# Choose one: enable submission for loopback clients only, or for any client.
#127.0.0.1:submission inet n - y - - smtpd
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
# -o smtpd_tls_auth_only=yes
# -o local_header_rewrite_clients=static:all
# -o smtpd_reject_unlisted_recipient=no
# Instead of specifying complex smtpd_<xxx>_restrictions here,
# specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"
# here, and specify mua_<xxx>_restrictions in main.cf (where
# "<xxx>" is "client", "helo", "sender", "relay", or "recipient").
# -o smtpd_client_restrictions=
# -o smtpd_helo_restrictions=
# -o smtpd_sender_restrictions=
# -o smtpd_relay_restrictions=
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
第六步:安装 Dovecot
运行以下命令安装 Dovecot。
bash
$ sudo apt install dovecot-mysql dovecot-imapd dovecot-pop3d dovecot-lmtpd
安装 Dovecot 后,我们可以继续执行以下步骤并编辑一些配置文件。
打开 /etc/dovecot/conf.d/10-auth.conf
文件
bash
$ sudo nano /etc/dovecot/conf.d/10-auth.conf
然后,找到这行
auth_mechanisms = plain
并将该行替换为此行:
auth_mechanisms = plain login
然后,我们需要注释掉 !include auth-system.conf.ext
并取消注释行 !include auth-sql.conf.ext
它应该看起来像这样:
#!include auth-system.conf.ext
!include auth-sql.conf.ext
仍然在 10-auth.conf
文件中,我们包含了 auth-sql.conf.ext
。因此,让我们编辑该文件以便执行它。
bash
$ sudo nano /etc/dovecot/dovecot-sql.conf.ext
将以下行插入文件中:
driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=M0d1fyth15
default_pass_scheme = BLF-CRYPT
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT '/var/vmail/%d/%u' as home, 'maildir:/var/vmail/%d/%u' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'
请务必使用你在第四步中设置的密码替换 M0d1fyth15
。保存文件并退出
接下来,打开 /etc/dovecot/conf.d/10-mail.conf
文件,并更改以下值:
bash
$ sudo nano /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = mail
mail_privileged_group = mail
first_valid_uid = 150
last_valid_uid = 150
保存文件,然后退出。现在,让我们继续编辑其他 dovecot 配置文件。
bash
$ sudo nano /etc/dovecot/conf.d/10-master.conf
你需要在该文件中进行一些更改。
找到 service lmtp
部分,并将其更改为以下内容:
service lmtp {
unix_listener /var/spool/postfix/private/lmtp {
mode = 0600
user = postfix
group = postfix
}
}
找到 service auth
部分,并将其更改为:
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
部分更改为以下内容:
service auth-worker {
user = vmail
}
不要忘记保存文件然后退出。现在,是时候更正权限了。
bash
$ sudo chown -R vmail:dovecot /etc/dovecot
$ sudo chmod -R o-rwx /etc/dovecot
第七步:安装 PostfixAdmin
在这一步中,我们将从 Github 下载 PostfixAdmin 并将其存储在 /opt
目录中。
bash
$ sudo cd /opt
$ sudo git clone <https://github.com/postfixadmin/postfixadmin.git>
$ sudo cd /opt/postfixadmin
$ sudo bash install.sh
让我们更正权限。
bash
$ sudo chown -R www-data: /opt/postfixadmin
添加 /etc/apache2/conf-enabled/postfixadmin.conf
bash
$ sudo nano /etc/apache2/conf-enabled/postfixadmin.conf
将这些行插入到该文件中。
Alias /postfixadmin /opt/postfixadmin/public
<Directory "/opt/postfixadmin/public">
AllowOverride All
Options +FollowSymLinks
Require all granted
</Directory>
然后,我们需要重新加载 Apache。
bash
$ sudo systemctl reload apache2
接下来,让我们创建 config.local.php
bash
$ sudo nano /opt/postfixadmin/config.local.php
并插入以下行
php
<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'M0d1fyth15';
$CONF['database_name'] = 'postfixadmin';
$CONF['configured'] = true;
?>
请务必使用你在第四步中设置的密码替换 M0d1fyth15
。
保存文件,然后从编辑器中退出。
转到 http://YOUR_IP_ADDRESS/postfixadmin/setup.php 并创建设置密码。如果你的服务器上已经有一个网站,你也可以在 http://yourdomain.com/postfixadmin/setup.php 访问 postfixadmin
两次输入你的设置密码,然后点击"Generate setup_password hash"按钮。
你将看到一行包含设置密码,你需要将其复制到 config.local.php
中,如下所示:
php
$CONF['setup_password'] = '$2y$10$YpUXiIQAP47pudUDz0n3leljN2ap5xBq/O1ntFmgAtU0WArEXy84y';
将该行添加到 config.local.php 文件后,你可以刷新页面以登录并创建一个超级管理员。
向下滚动以创建超级管理员帐户。要创建超级管理员,需要你先前创建的设置密码。在 admin 字段中,应填写电子邮件地址,它应如下所示:
现在已创建超级管理员,你可以使用凭据登录到 http://192.168.53.5/postfixadmin/login.php 并添加域、电子邮件地址等。
第八步:安装 Webmail
此时,你的服务器可以发送电子邮件。要接收电子邮件,请确保你域名的 DNS MX 记录指向此服务器。你可以使用你喜欢的电子邮件客户端发送电子邮件,也可以使用 Webmail。现在让我们安装 Roundcube。
bash
$ sudo apt install roundcube
接下来,让我们编辑 /etc/apache2/conf-enabled/roundcube.conf
中的 rouncube 配置文件
bash
$ sudo nano /etc/apache2/conf-enabled/roundcube.conf
取消注释这一行
# Alias /roundcube /var/lib/roundcube/public_html
它应该看起来像这样:
Alias /roundcube /var/lib/roundcube/public_html
保存文件,退出,然后重启 apache
bash
$ sudo systemctl restart apache2
下一步是编辑另一个 Rouncube 配置文件,即 /etc/roundcube/config.inc.php
bash
$ sudo nano /etc/roundcube/config.inc.php
找到这个字符串:
$config['smtp_host'] = 'localhost:587';
并将其替换为此字符串:
$config['smtp_host'] = 'tls://%n:587';
总结
现在,你可以导航到 http://YOUR_SERVER_IP_ADDRESS/roundcube 并使用你在上一步中创建的凭据登录。登录后,你可以尝试发送电子邮件。
PS。如果你喜欢这篇文章,请在社交网络上与你的朋友分享,或者只是在评论部分留下评论。谢谢。
雨云 - 新一代云服务提供商: https://rainyun.ivwv.site