在本指南中,您将学习如何在Debian或Ubuntu上使用Postfix,Dovecot和MySQL设置安全的虚拟用户邮件服务器。我们将解释如何创建新的用户邮箱以及如何在配置的域中发送或接收电子邮件。
对于其他Linux发行版或不同的邮件服务器,请查看我们的电子邮件教程。
在使用本指南之前,请确保您已按照入门指南进行操作并设置主机名。还要确保iptables 防火墙没有阻止任何标准邮件端口(25,465,587,110,995,143和993)。如果使用不同形式的防火墙,请确认它没有阻止任何所需的端口。
注意:本指南中的步骤需要root权限。请务必以root身份或使用
sudo
前缀运行以下步骤。有关权限的更多信息,请参阅我们的用户和组指南。
当您准备好更新DNS并开始向服务器发送邮件时,请编辑域的MX记录,使其指向Linode的域或IP地址,类似于以下示例:
example.com A 10 12.34.56.78
example.com MX 10 example.com
mail.example.com MX 10 example.com
确保为可能接收电子邮件的所有域和子域更改MX记录。如果设置全新域,则可以在配置邮件服务器之前执行这些步骤。使用Linode的DNS管理器时,创建指向所需域或子域的MX记录,然后为该域或子域创建A记录,该记录指向正确的IP地址。
验证该hosts
文件是否包含Linode的公共IP地址的行,并与完全限定域名(FQDN)相关联。在下面的示例中,192.0.2.0
是公共IP地址,hostname
是本地主机名,hostname.example.com
是FQDN。
/ etc / hosts文件
1 2 | 127.0.0.1 localhost.localdomain localhost 192.0.2.0 hostname.example.com hostname |
---|
在完成Dovecot配置步骤之前,您需要在邮件服务器上安装SSL证书。SSL证书将向用户验证邮件服务器的身份,并加密用户邮件客户端和邮件服务器之间传输的数据。按照我们的指南使用Certbot安装SSL证书。
记下Linode上的证书和密钥位置。在Dovecot配置步骤中,您将需要每条路径。
192.0.2.0
为您的IP地址:
ssh username@192.0.2.0unix_socket
或auth_socket
授权插件。只要您从localhost上的Linux root用户进行连接,此授权方案就允许您登录数据库的root用户。
出现提示时,选择“ Internet站点”作为Postfix安装程序应配置的邮件服务器类型。该系统邮件名称应为FQDN。
本指南使用以下软件包版本:
邮件服务器的虚拟用户和密码存储在MySQL数据库中。Dovecot和Postfix需要这些数据。按照以下步骤为虚拟用户,域和别名创建数据库表:
mailuserpass
为安全密码:
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass';现在已经创建了数据库和表,将一些数据添加到MySQL。
virtual_domains
表中。替换为您自己的设置example.com
和的值hostname
:
INSERT INTO `mailserver`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'example.com'),
('2', 'hostname.example.com'),
('3', 'hostname'),
('4', 'localhost.example.com');
注意:注意哪个id
域对应于哪个域,该id
值对于接下来的两个步骤是必需的。virtual_users
表中添加电子邮件地址。该domain_id
值引用virtual_domain
表的id
值。将电子邮件地址值替换为您希望在邮件服务器上配置的地址。password
用强密码替换值。
INSERT INTO `mailserver`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
('2', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');virtual_aliases
表中:
INSERT INTO `mailserver`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@example.com', 'email1@example.com');在上一节中,数据已添加到MySQL mailserver
数据库中。以下步骤将测试数据是否已存储并可以检索。
virtual_domains
表的内容:
SELECT * FROM mailserver.virtual_domains;virtual_users
表:
SELECT * FROM mailserver.virtual_users;virtual_aliases
表:
SELECT * FROM mailserver.virtual_aliases;Postfix是一个邮件传输代理(MTA),它在Linode和Internet之间中继邮件。它具有高度可配置性,允许极大的灵活性。本指南维护了许多Posfix的默认配置值。
该main.cf
文件是Postfix使用的主要配置文件。
/etc/postfix/main.cf
文件以匹配示例配置。example.com
用您的域名替换出现的内容:
/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/letsencrypt/live/example.com/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem smtpd_use_tls=yes smtpd_tls_auth_only = yes smtp_tls_security_level = may smtpd_tls_security_level = may smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous # 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 = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = example.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydomain = example.com myorigin = $mydomain mydestination = $myhostname localhost.$mydomain 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 # Handing off local delivery to Dovecot's LMTP, and telling it where to store mail virtual_transport = lmtp:unix:private/dovecot-lmtp # Virtual domains, users, and aliases virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf, mysql:/etc/postfix/mysql-virtual-email2email.cf
main.cf
文件声明的位置virtual_mailbox_domains
,virtual_mailbox_maps
以及virtual_alias_maps
文件。这些文件包含在本指南的MySQL部分中创建的MySQL查找表的连接信息。Postfix将使用此数据来标识所有域,相应的邮箱和有效用户。
为...创建文件virtual_mailbox_domains
。将值替换为password
数据库用户的密码。如果您的数据库使用不同的名称user
,并dbname
取代那些用自己的价值观:
/etc/postfix/mysql-virtual-mailbox-domains.cfuser = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
/etc/postfix/mysql-virtual-mailbox-maps.cf
文件,然后输入以下值。使用数据库用户的密码并根据需要进行任何其他更改:
/etc/postfix/mysql-virtual-mailbox-maps.cfuser = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
/etc/postfix/mysql-virtual-alias-maps.cf
文件并输入以下值。使用数据库用户的密码并根据需要进行任何其他更改:
/etc/postfix/mysql-virtual-alias-maps.cfuser = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
/etc/postfix/mysql-virtual-email2email.cf
文件并输入以下值。使用数据库用户的密码并根据需要进行任何其他更改:
/etc/postfix/mysql-virtual-email2email.cfuser = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'
postmap
命令创建或查询Postfix的查找表,或更新现有的查找表。输入以下命令以确保Postfix可以查询virtual_domains
表。替换example.com
为第一个name
值。1
如果成功,该命令应该返回:
sudo postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cfvirtual_users
。替换email1@example.com
为添加到表中的第一个电子邮件地址。您应该收到1
输出:
sudo postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cfvirtual_aliases
表。替换为表中创建alias@example.com
的第一个source
值。该命令应该返回destination
该行的值:
sudo postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cfPostfix的主程序启动并监视Postfix的所有进程。配置文件master.cf
列出了所有程序以及有关如何启动它们的信息。
/etc/postfix/master.cf
文件的副本:
sudo cp /etc/postfix/master.cf /etc/postfix/master.cf.orig/etc/postfix/master.cf
以包含摘录示例中的值。文件的其余部分可以保持不变:#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# 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 - 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_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_reject_unlisted_recipient=no
-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_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
...
/etc/postfix
目录的权限以限制权限以仅允许其所有者和相应的组:
sudo chmod -R o-rwx /etc/postfixDovecot是邮件传递代理(MDA),它从Postfix传递消息并将它们传递到虚拟邮箱。在本节中,配置Dovecot以强制用户在连接时使用SSL,以便其密码永远不会以纯文本形式发送到服务器。
/etc/dovecot/dovecot.conf
文件。添加protocols = imap pop3 lmtp
到# Enable installed protocols
文件的部分:
dovecot.conf## Dovecot configuration file
...
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
...
postmaster_address=postmaster at example.com
/etc/dovecot/conf.d/10-mail.conf
文件。此文件控制Dovecot如何与服务器的文件系统交互以存储和检索消息:
修改配置文件中的以下变量:
10 mail.conf...
mail_location = maildir:/var/mail/vhosts/%d/%n
...
mail_privileged_group = mail
...
/var/mail/vhosts/
为您的域创建目录和子目录。替换example.com
为您的域名:
sudo mkdir -p /var/mail/vhosts/example.com
此目录将用作发送到您的域的邮件的存储空间。vmail
使用ID 创建组5000
。将新用户添加vmail
到该vmail
组。该系统用户将从服务器读取邮件。
sudo groupadd -g 5000 vmail sudo useradd -g vmail -u 5000 vmail -d /var/mail/var/mail/
文件夹及其内容的所有者更改为属于vmail
:
sudo chown -R vmail:vmail /var/mail/etc/dovecot/conf.d/10-auth.conf
。取消注释以下变量并替换为文件摘录的示例值:
10 auth.conf...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
!include auth-system.conf.ext
...
!include auth-sql.conf.ext
...
注意供参考,查看完整10-auth.conf
文件。
/etc/dovecot/conf.d/auth-sql.conf.ext
使用身份验证和存储信息编辑文件。确保您的文件包含以下行,并且它们已取消注释:
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
}
...
/etc/dovecot/dovecot-sql.conf.ext
使用MySQL连接信息更新文件。取消注释以下变量并使用摘录示例替换值。替换dbname
,user
并password
使用您自己的MySQL数据库值:
dovecot的-sql.conf.ext...
driver = mysql
...
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
...
default_pass_scheme = SHA512-CRYPT
...
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
...
该password_query
变量使用virtual_users
表中列出的电子邮件地址作为电子邮件帐户的用户名凭据。
要使用别名作为用户名:
source
和destination
电子邮件地址的virtual_aliases
表。/etc/dovecot/dovecot-sql.conf.ext
文件的password_query
值更改为password_query = SELECT email as user, password FROM virtual_users WHERE email=(SELECT destination FROM virtual_aliases WHERE source = '%u');
注意:供参考,查看完整dovecot-sql.conf.ext
文件。
/etc/dovecot/
目录的所有者和组更改为vmail
和dovecot
:
sudo chown -R vmail:dovecot /etc/dovecot/etc/dovecot/
目录的权限,以便为目录的所有者递归读取,写入和执行:
sudo chmod -R o-rwx /etc/dovecot/etc/dovecot/conf.d/10-master.conf
:
注意:编辑文件时,请注意不要删除任何打开或关闭花括号。如果出现语法错误,Dovecot将无声地崩溃。您可以检查/var/log/upstart/dovecot.log
以调试错误。
这是一个完整10-master.conf
文件的示例。
通过将协议的端口设置为禁用未加密的IMAP和POP3 0
。取消注释port
和ssl
变量:
10 master.conf ...
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
...
}
...
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
...
找到service lmtp
文件的部分并使用下面显示的配置:
10 master.conf
...
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
#mode = 0666i
mode = 0600
user = postfix
group = postfix
}
...
}
找到service auth
并配置它,如下所示:
10 master.conf
...
service auth {
...
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
}
...
user = dovecot
}
...
在该service auth-worker
部分中,取消注释该user
行并将其设置为vmail
:
10 master.conf
...
service auth-worker {
...
user = vmail
}
将更改保存到/etc/dovecot/conf.d/10-master.conf
文件中。
/etc/dovecot/conf.d/10-ssl.conf
文件以要求SSL并添加域的SSL证书和密钥的位置。替换example.com
为您的域名:
10 ssl.conf...
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required
...
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
email1@example.com
为邮件服务器中的电子邮件地址:
echo "Email body text" | sudo mail -s "Email subject line" recipient@gmail.com -aFrom:email1@example.com您可以设置电子邮件客户端以连接到您的邮件服务器。许多客户端自动检测服务器设置 手动配置需要以下参数:
@example.com
部分。virtual_users
表中的电子邮件地址输入的密码mailuser
。993
进行安全IMAP,使用端口995
进行安全POP3,587
使用SSL进行端口进行SMTP。有关安装电子邮件客户端的详细信息,请参阅在Ubuntu 16.04上安装SquirrelMail。
要向邮件服务器添加新域,电子邮件地址和别名,您需要更新本指南的MySQL部分中创建的相应MySQL表。
virtual_domains
域表的名称,请替换值:
SELECT * FROM mailserver.virtual_domains;newdomain.com
为所需的域名:
INSERT INTO `mailserver`.`virtual_domains` (`name`) VALUES ('newdomain.com');virtual_users
为您的表名:
SELECT * FROM mailserver.virtual_users;
输出应类似于以下内容:
+----+-----------+-------------------------------------+--------------------+
| id | domain_id | password | email |
+----+-----------+-------------------------------------+--------------------+
| 1 | 1 | $6$574ef443973a5529c20616ab7c6828f7 | email1@example.com |
| 2 | 1 | $6$030fa94bcfc6554023a9aad90a8c9ca1 | email2@example.com |
+----+-----------+-------------------------------------+--------------------+
2 rows in set (0.01 sec)newpassword
为用户的密码,并email3@newdomain.com
使用用户的电子邮件地址:
INSERT INTO `mailserver`.`virtual_users`
(`domain_id`, `password` , `email`)
VALUES
('5', ENCRYPT('newpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) , 'email3@newdomain.com');
注意:本domain_id
应该对应于id
在域的值virtual_domains
表。在示例中,我们正在创建一个电子邮件地址,以便newdomain.com
在上一节中添加。virtual_users
为您的表名:
SELECT * FROM mailserver.virtual_aliases;
输出应类似于以下内容:
+----+-----------+-------------------+--------------------+
| id | domain_id | source | destination |
+----+-----------+-------------------+--------------------+
| 1 | 1 | alias@example.com | email1@example.com |
+----+-----------+-------------------+--------------------+
1 row in set (0.00 sec)alias@newdomain.com
为地址以转发电子邮件,并email1@gmail.com
使用您要将邮件转发到的地址。该alias@newdomain.com
需求是已经存在的邮件服务器上的电子邮件地址:
INSERT INTO `mailserver`.`virtual_aliases` (`domain_id`, `source`, `destination`) VALUES ('5', 'alias@newdomain.com', 'myemail@gmail.com');
注意本domain_id
应该对应于id
在域的值virtual_domains
表。在示例中,我们正在创建一个电子邮件地址,以便newdomain.com
在上一节中添加。
您可以创建一个“全能”别名,该别名将转发发送到匹配域的所有电子邮件,这些电子邮件没有匹配的别名或用户。替换@newdomain.com
为您的域名。此值是别名的来源。
INSERT INTO `mailserver`.`virtual_aliases` (`domain_id`, `source`, `destination`) VALUES ('5', '@newdomain.com', 'myemail@gmail.com');有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。
更多教程请前往腾讯云+社区学习更多知识。
参考文献:《https://www.linode.com/docs/email/postfix/email-with-postfix-dovecot-and-mysql/》