如何在 Ubuntu 22.04 上安装和配置邮件服务器教程

简介:

在本指南中,我们将演示如何在 Ubuntu 22.04 上安装和配置邮件服务器,因为大中型公司可以从拥有私人邮件服务器中获益匪浅。通过使用邮件服务器,可以密切监视所有电子邮件流量。此外,自定义设置的灵活性使得建立清晰且有组织的电子邮件服务成为可能。虽然有多种设置 Linux 邮件服务器的选项,但我们将特别关注 Postfix 和 Dovecot。

准备工作

服务器准备

必要前提:

  • 一个充满求知欲的大脑。
  • 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。

我将以 雨云 为例,带大家创建一台属于自己的云服务器,以便学习本篇文章的内容。

链接: https://rainyun.ivwv.site

创建服务器

以下步骤仅供参考,请根据实际需求选择配置。

  • 点击 云产品云服务器
  • 建议选择距离你较近的区域,以保证低延迟。
  • 按照自己需求合理选择配置并订购。
  • 随后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。
  • 我们使用 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

我的博客:https://blog.ivwv.site

相关推荐
超龄超能程序猿2 分钟前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
帧栈18 分钟前
mysql基础(一)快速上手篇
mysql
奈斯ing19 分钟前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡1 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛1 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
丶意冷1 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
fangeqin1 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
小Mie不吃饭1 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
fo安方2 小时前
运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证
运维·中间件·zabbix
爱奥尼欧2 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft