前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决Postfix,Dovecot和MySQL的问题

解决Postfix,Dovecot和MySQL的问题

作者头像
evildickman
发布2018-09-03 14:18:04
6K0
发布2018-09-03 14:18:04

本指南是Postfix,Dovecot和MySQL安装指南的配套文件。由于设置邮件服务器非常棘手,因此我们创建了这套指南来帮助您解决可能遇到的任何问题。到本指南的末尾时,您将了解如何调试Postfix,Dovecot和MySQL邮件服务器的问题。

第一部分,故障排除检查表,采用自上而下的故障排除方法来帮助您查找邮件服务器的特定错误。第二部分,逐步配置,使用自下而上的方法来向您展示基本邮件服务器是如何运行的,然后逐步添加更多功能。

故障排除核对表

正确诊断问题是解决问题的第一步。乍一看,许多邮件服务器错误看起来很普遍。通常问题的第一个迹象是您尝试创建测试邮件帐户但却无法连接。本节是查找邮件服务器诸多错误的速成课程。我们建议按顺序阅读以下部分,因为故障排除技术是按从普遍到特殊排列的。

Postfix和Dovecot正在运行吗?

有时您的邮件服务器无法正常运行,因为所需的服务未运行。对于已运行很长时间的邮件服务器,资源过度使用是导致服务停止的最可能原因。检查您的资源使用以排除该问题并没有什么坏处。但是,当您刚刚设置新的邮件服务器时,更有可能的是服务启动问题是由配置错误引起的。一些配置错误 - 特别是语法错误 - 非常严重,足以阻止服务启动。

要检查Postfix和Dovecot是否正在运行并查找启动错误,请按照下列步骤操作:

  1. 运行此命令以检查Postfix是否正在运行:
代码语言:txt
复制
service postfix status
代码语言:txt
复制
 您应该看到以下输出:
代码语言:txt
复制
* postfix is running
  1. 接下来,运行此命令以检查Dovecot是否正在运行:
代码语言:txt
复制
service dovecot status
代码语言:txt
复制
您应该看到类似于以下内容的输出:
代码语言:txt
复制
dovecot start/running, process 2241
  1. 检查结果。如果您没有看到输出或输出stop/waitingnot running,则表示该服务未运行。下一步是尝试重新启动服务。
  2. 尝试重新启动服务。即使Postfix和Dovecot当前正在运行,重新启动他们也是一个很好的故障排除手段,因为这样你就可以检查启动消息,这可以为你排除故障提供线索。输入以下命令以重新启动Postfix:
代码语言:txt
复制
service postfix restart

您应该看到以下消息:

代码语言:txt
复制
* Stopping Postfix Mail Transport Agent postfix                    [ OK ] 
* Starting Postfix Mail Transport Agent postfix                    [ OK ]
  1. 执行以下命令重新启动Dovecot:
代码语言:txt
复制
service dovecot restart

您应该看到以下消息:

代码语言:txt
复制
dovecot stop/waiting 
dovecot start/running, process 31171
  1. 检查结果。如果您收到错误,或者Dovecot的重新启动消息未包含新进程ID,则服务启动将会被阻止。
  2. 如果您在重新启动尝试时收到特定错误,请上网搜索相关解决方法。
  3. 检查应用程序的启动日志以查看更详细的消息。Postfix的停止和启动消息将被记录/var/log/mail.log(及其所有其他消息)。输入以下命令以查看日志中的最新行:
代码语言:txt
复制
tail /var/log/mail.log

在正常重启时,您应该看到以下内容:

代码语言:txt
复制
/var/log/mail.log

May 22 15:41:59 godel postfix/master[19624]: terminating on signal 15 
May 22 15:41:59 godel postfix/master[20232]: daemon started -- version 2.9.6, configuration /etc/postfix
  1. Dovecot的默认启动日志也在/var/log/mail.log。在正常重启时,您应该看到以下内容:
代码语言:txt
复制
/var/log/mail.log

May 22 17:46:54 master: Warning: Killed with signal 15 (by pid=1 uid=0 code=kill) 
May 22 17:48:09 master: Info: Dovecot v2.0.19 starting up (core dumps disabled)

注意 如果您移动了Dovecot日志,则会/var/log/dovecot.log改为使用正常的Dovecot启动消息。如果找不到Dovecot日志,请使用以下命令找到它们: doveadm log find

  1. 如果您没有看到这些正常的启动消息,请检查错误。在线搜索错误信息。
  2. 如果在Dovecot启动期间出现问题,您还应该检查/var/log/upstart/dovecot.log。在正常启动时,不会将任何内容记录到此文件中。但是,如果存在启动问题,则会在此日志中添加一个条目,这可能非常有用。要查看此文件,请运行以下命令:
代码语言:txt
复制
tail /var/log/upstart/dovecot.log

这是一个示例,其中/etc/dovecot/conf.d/10-master.conf已识别文件中的语法错误:

代码语言:txt
复制
/var/log/upstart/dovecot.log

doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-master.conf line 36: Unexpected '}'
  1. 如果您发现语法错误,请打开有问题的文件并查看提到的行(上例中的第36行)。在Dovecot设置过程中发生语法错误实际上相当普遍,因为有太多不同的文件和许多嵌套括号。
  2. 使用Notepad ++或其他一些可以轻松匹配括号的程序来帮助您修复错误。或者,您可以恢复相应的默认配置文件(如果您遵循主要设置指南,则使用.orig命名)。

检查日志

如果正在运行Postfix,Dovecot和MySQL,则下一个故障排除步骤是检查邮件日志。默认情况下,将记录所有传入和传出连接以及任何关联的错误/var/log/mail.log。查看日志文件最有用的方法之一是使用该tail命令,该命令与-f标志结合使用时,会显示日志的最新部分,因为它已更新。

  1. 通过输入以下命令开始跟踪日志:
代码语言:txt
复制
tail -f /var/log/mail.log
  1. 给自己发送测试消息或建立与邮件服务器的连接。
  2. 使用相关信息查看日志。
  3. 要停止tail,请按 CTRL-C

如果在日志中看到错误或警告,请复制它。在线搜索确切的错误(没有特定于您的服务器的详细信息),您可能会找到解决方案或其他疑难解答帮助。

启用详细日志

默认邮件日志可能不包含您需要的所有信息。在这种情况下,下一步是为Postfix和Dovecot启用详细日志记录,并将Postfix和Dovecot日志分成两个单独的文件,更容易排序。Postfix日志将记录中继到外部服务器或从外部服务器中继的消息,Dovecot日志将记录授权尝试。

Dovecot

按照以下说明启用Dovecot的详细日志记录并将日志位置更改为/var/log/dovecot.log

  1. 通过输入以下命令打开/etc/dovecot/conf.d/10-logging.conf文件以进行编辑:
代码语言:txt
复制
nano /etc/dovecot/conf.d/10-logging.conf
  1. 添加此行以设置日志的新文件路径:
代码语言:txt
复制
/etc/dovecot/conf.d/10-logging.conf

log_path = /var/log/dovecot.log
  1. 取消注释auth_verbosemail_debug行,然后将它们设置为yes
代码语言:txt
复制
/etc/dovecot/conf.d/10-logging.conf

auth_verbose = yes

mail_debug = yes
  1. 保存更改。
  2. 输入以下命令重启Dovecot:
代码语言:txt
复制
service dovecot restart

Dovecot日志现在将显示有关授权尝试和收件箱连接的更多信息。您可以在以下位置查看新日志/var/log/dovecot.log。请记住在完成故障排除后禁用详细日志记录,以便服务器不会填满日志。

Postfix

请按照以下说明为Postfix启用详细日志记录:

  1. 打开位于/etc/postfix/master.cf的的文件输入入以下命令:
代码语言:txt
复制
nano /etc/postfix/master.cf
  1. 添加-v到该smtp行以启用详细日志记录:
代码语言:txt
复制
/etc/postfix/master.cf

# ========================================================================== 
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100) 
# ========================================================================== 
smtp      inet  n       -       -       -       -       smtpd -v
  1. 保存更改。
  2. 输入以下命令重新启动Postfix:
代码语言:txt
复制
service postfix restart

Postfix日志现在将显示有关进出外部服务器的消息的更多信息。您仍然可以查看日志/var/log/mail.log。请记住在完成故障排除后禁用详细日志记录,以便服务器不会被填满日志。

检查端口可用性

有时会发生电子邮件问题,因为邮件服务器和邮件客户端在相同的端口上没有相互通信。对于从客户端到服务器的邮件,反之亦然,两者都必须使用相同的端口,并且这些端口也必须沿着两者之间的互联网路由打开。如果您按照随附的Postfix,Dovecot和MySQL安装指南,您应该使用以下端口:

  • 25,465或587用于外发邮件(SMTP)的TLS加密
  • 993使用SSL加密传入IMAP
  • 995使用SSL加密进入POP3

首先,检查邮件客户端设置,确保选择了正确的端口和安全设置。

接下来,使用Telnet工具检查Linode上以及客户端和Linode之间路由上的端口是否都已打开。应该在您的Linode和家用计算机上运行相同的测试。首先,我们将介绍如何从两个位置运行测试,然后我们将讨论其含义。

从Linode端检查

要测试您的Linode,请按照下列步骤操作:

  1. 建立与Linode的SSH连接。
  2. 运行以下命令,替换12.34.56.78为您的Linode的IP地址:
代码语言:txt
复制
telnet 12.34.56.78 25
  1. CTRL-]退出Telnet ,然后输入quit
  2. 对端口465,587,993和995重复步骤2。

阅读下面对Telnet结果的讨论,并使用本节末尾显示的输出来分析您的结果。

从Mac端检查

要在Mac上运行Telnet测试,请按照下列步骤操作:

  1. 打开终端应用程序。
  2. 运行以下命令,替换12.34.56.78为您的Linode的IP地址:
代码语言:txt
复制
telnet 12.34.56.78 25
  1. CTRL-]退出Telnet ,然后输入quit
  2. 对端口465,587,993和995重复步骤2。

阅读下面对Telnet结果的讨论,并使用本节末尾显示的输出来分析您的结果。

从PC端检查

要在Windows计算机上运行Telnet测试,请按照下列步骤操作。您需要首先安装Telnet,因为默认情况下它不附带Windows:

  1. 打开控制面板。
  2. 选择程序
  3. 从“ 程序和功能”中,选择“ 打开或关闭Windows功能”
  4. 从菜单中选择Telnet Client
  5. 单击确定
  6. 等待更改应用。
  7. 打开命令提示符。
  8. 运行以下命令,替换12.34.56.78为您的Linode的IP地址:
代码语言:txt
复制
telnet 12.34.56.78 25
  1. CTRL-]退出Telnet ,然后输入quit
  2. 对端口465,587,993和995重复步骤8。

阅读下面关于Telnet结果的讨论,并根据下面显示的输出分析您的结果。

分析结果

如果测试成功,您应该看到类似于以下内容的输出:

代码语言:txt
复制
Trying 12.34.56.78...
Connected to li468-222.members.linode.com.
Escape character is '^]'.
220 host.example.com ESMTP Postfix (Ubuntu)

要取消连接,请按CTRL-],然后输入quit。如果测试失败,您将看到一条Connection refused消息,Telnet将自行退出。

如果您在Linode上运行测试并且它失败了,您应该检查您是否在邮件服务器设置中正确配置了端口(请参阅设置指南的Dovecot部分中的步骤33-34 ),您已启用端口465和587(请参阅设置指南的Postfix部分中的步骤26-30 ),并且您没有阻止它们的任何防火墙规则

如果您在Linode上运行测试并且成功,但是来自家用计算机的测试失败,则表明您的家庭计算机和Linode之间的网络上的某些端口被阻止。它可能在您的路由器,您的ISP(Internet服务提供商),其他人的ISP等。诊断网络问题的最佳方法是生成MTR报告

如果您的Linode和家用计算机上的Telnet测试都成功,并且您的邮件客户端设置正确,您可以排除端口的任何问题。

验证您的登录凭据

接下来,我们将专注于您的登录凭据。如果配置不正确,可能会导致问题:

  • 您的邮件客户端不接受用户名和密码
  • 一遍又一遍地提示您输入密码
  • 无法连接到邮件服务器

第一步也是最简单的步骤是在邮件客户端中重新输入用户名和密码。确保使用完整的用户名,包括该@example.com部分。用户名和密码区分大小写。如果您确定已在邮件客户端中正确输入了信息,则可能无法在服务器端正确配置授权。

接下来要检查的是您的用户名和密码是否正确输入到正确的MySQL表中。您可以从主安装文章运行MySQL测试,以确保您的表已正确设置。您还可以从mailserver.virtual_users表中删除并重新添加相应的行,以确保正确输入密码。如果MySQL表中的信息正确,则可能是Dovecot未配置为在正确的位置查找授权凭据。

Dovecot包含一个管理工具,它非常有助于解决登录凭据问题。该doveadm user命令允许您查看每个电子邮件用户的用户名,用户ID,组ID和邮箱位置的用户数据库结果。读取此工具的输出会告诉您Dovecot正在寻找授权用户的数据库。如果Dovecot没有寻找预期的数据库,您需要更改Dovecot中与授权相关的设置,以便它使用MySQL来查找用户,而不是其他用户数据库。

  1. 运行doveadm命令以查找您的电子邮件用户(包括@example.com部件):
代码语言:txt
复制
doveadm user email1@example.com

如果一切正常,你应该看到这样的输出:

代码语言:txt
复制
userdb: email1@example.com   
  uid       : 5000   
  gid       : 5000   
  home      : /var/mail/vhosts/example.com/email1

相反,如果你得到:

代码语言:txt
复制
userdb lookup: user email1@example.com doesn't exist

这可能表明1)您没有在MySQL表中正确输入电子邮件地址 - 但我们只是检查了它,所以它也可能是2)Dovecot没有在正确的位置查找您的用户数据库。

  1. 如果Dovecot无法在MySQL中找到用户,它可能仍在寻找系统用户而不是虚拟用户。看看你是否得到了自己的SSH用户的回复:
代码语言:txt
复制
doveadm user myuser

达夫科特应该不会找到你的系统用户输出。如果是,它将如下所示:

代码语言:txt
复制
userdb: myuser   
  system_groups_user: myuser   
  uid       : 1000   
  gid       : 1000   
  home      : /home/myuser
  1. 如果您确实获得此类输出,则需要调整与虚拟用户相关的Dovecot设置。如果您没有获得系统用户的输出,这仍然表示您在与用户相关的Dovecot设置中出现某种错误。返回主要设置指南的Dovecot部分,并特别注意与虚拟用户和MySQL设置有关的部分。

逐步配置

对于某些故障排除方案,您可能会发现自上而下的方法无法帮助您找到问题的根本原因。有时,您需要的是自下而上的方法。

这里提出的自下而上的方法打破了将邮件服务器构建成较小块的复杂任务。这有两个好处。首先,每个部分仅关注一些邮件服务器功能,并包含较少的细节,这使其更容易理解。在项目结束时,您应该深入了解邮件服务器的工作原理。其次,每个块都为邮件服务器添加了一定数量的可测试功能。这样可以通过限制其可能位置的范围来更轻松地查找错误。例如,如果您的邮件服务器在完成“基本Dovecot”后仍在工作,但在“虚拟域和用户”之后未通过测试,则您知道该错误与您在该部分中所做的事情有关。

本指南的第二部分介绍了按功能组织的逐步邮件服务器构建,从核心功能到更多外围功能,并在每个步骤进行测试。您应该同时打开主设置指南,因为我们将引用它。在阅读主要设置指南时,您会注意到我们在这里以不同的顺序安装项目。主要指南旨在简化方法,避免多次编辑同一文件。本指南侧重于对每个组件的更深入理解,因此您有时需要跳转到主要指南的不同部分以供参考。成功完成一个阶段后,我建议您进行系统级备份,以便轻松回到之前!

警告 请记住,此处介绍的早期版本是可用的,但出于安全性和功能原因,不应将其视为生产准备,主要是因为密码以纯文本格式发送,和/或未启用传出SMTP。

在本节中,我们将提供相应的PostfixDovecot文档的链接。这些都是很棒的起点。

设置

阅读入门指南。在安装邮件服务器之前,请按照该部分中列出的步骤操作。

您可能还希望以root用户身份登录服务器,因此您不必为每个命令键入“sudo”。您可以输入以下命令以root身份登录:

代码语言:txt
复制
su

基本的Postfix

在本节中,您将安装Postfix并将其配置为在您的域中为您的系统用户提供邮件,这是最基本的配置。您还将发送测试消息并使用Mailutils查看它。

  1. 输入以下命令安装Postfix:
代码语言:txt
复制
apt-get install postfix
  1. 当出现提示时,选择“ Internet站点”进行配置。(有关此步骤和下一步,请参阅主要指南的 安装包部分中的步骤6和7。)
  2. 输入您的完全限定域名或解析为服务器的任何域名。
  3. 打开/etc/postfix/main.cf进行编辑,并将您的域添加到该mydestination行。如果在安装Postfix之前正确设置了主机名和主机文件,则此列表应该已包含您的完全限定域名以及对localhost的多个引用,您可以将其保留原样。
代码语言:txt
复制
/etc/postfix/main.cf

mydestination = example.com, localhost
  1. 输入以下命令重新启动Postfix:
代码语言:txt
复制
service postfix restart
  1. 注意只要指令告诉您重新启动Postfix,请使用该命令。替代dovecot的postfix指令何时告诉您重新启动Dovecot的。向Linux系统用户发送测试消息。这与您用于SSH的用户相同。您应该使用格式< myuser#example.com >。
  2. 输入以下命令安装Mailutils:
代码语言:txt
复制
apt-get install mailutils
  1. 输入以下命令,使用Mailutils检查邮件。您必须以自己的用户身份登录,因此如果您之前以root用户身份登录,则暂时退出root用户。
代码语言:txt
复制
mail
  1. 输入要阅读的邮件编号。
  2. 如果要退出系统用户的收件箱,请键入 quit

如果您成功向系统用户发送了测试消息,则表明您已成功安装Postfix并将其配置为最基本的邮件传递。默认情况下,它仅为系统用户传递邮件,邮件存储在名为的文件中/var/mail/myuser

基本的Dovecot

在本节中,您将安装Dovecot并进行设置,以便您可以通过IMAP或POP3连接检查系统用户的电子邮件,这是最基本的配置。本节基于Dovecot的基本配置指南,这是一个很好的参考。

  1. 通过输入以下命令安装Dovecot及其IMAP和POP3包:
代码语言:txt
复制
apt-get install dovecot-core dovecot-imapd dovecot-pop3d
  1. 打开/etc/dovecot/conf.d/10-mail.conf进行编辑,并将其设置为mail_location如下所示的行。此设置应指示Dovecot在Postfix存储邮件的同一位置查找邮件,/var/mail/myuser默认情况下应该这样(Dovecot使用该变量%u,所以路径中使用了正确的用户名)。邮箱格式指定为mbox
代码语言:txt
复制
/etc/dovecot/conf.d/10-mail.conf

mail_location = mbox:~/mail:INBOX=/var/mail/%u
  1. 同样在/etc/dovecot/conf.d/10-mail.conf,设置mail_privileged_groupmail
代码语言:txt
复制
/etc/dovecot/conf.d/10-mail.conf

mail_privileged_group = mail
  1. /etc/dovecot/conf.d/10-auth.conf,通过设置disable_plaintext_auth为允许纯文本身份验证no
代码语言:txt
复制
/etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
  1. /etc/pam.d/dovecot,告诉Dovecot使用标准的UNIX身份验证。这意味着您的SSH用户名和密码也适用于邮件。编辑文件,使其仅包含以下内容:
代码语言:txt
复制
/etc/pam.d/dovecot

auth required pam_unix.so nullok account required pam_unix.so
  1. 重启Dovecot。
  2. 给自己发一条测试信息。
  3. 查看你的电子邮件。您可以使用Telnet或邮件客户端。在此阶段,您的电子邮件地址将是您的系统用户(myuser#example.com),您的用户名和密码将与SSH相同(@example.com此阶段不包含用户名)。您的连接类型将是标准的(非安全),您的密码将是明确的。您可能需要手动设置邮件客户端,而不是通过向导。

注意 Telnet和邮件客户端测试不适用root。使用其他系统用户。

如果您通过IMAP或POP3连接成功检查了邮件,则表明您已成功安装Dovecot并将其配置为最基本的收件箱访问。

虚拟域和用户

既然Postfix和Dovecot正在运行,您应该设置虚拟域和用户。拥有邮件的虚拟用户是邮件服务器安全性和便利性的重要一步,因为它无需为需要邮箱的每个人创建系统用户。它还可以更轻松地将新域和用户添加到邮件服务器。

您需要在Postfix和Dovecot中进行与虚拟域和用户相关的一些配置更改。Postfix和Dovecot都需要同时为虚拟域和用户配置,因为您正在更改邮箱位置,需要在它们之间进行协调。以下是您将在本节中配置的内容的一般清单:

  • 使用虚拟用户信息(用户名,密码,邮箱位置)创建两个新的静态文件,一个用于Postfix,另一个用于Dovecot。(您不能使用相同的文件,因为它们需要不同的参数和格式。)您之前不需要写出自己的身份验证信息,因为Postfix和Dovecot只是从系统身份验证中读取,但您现在需要它虚拟用户认证。最终,您将在MySQL数据库中保存此信息,但现在将其设置为平面文件更为简单。
  • 告诉Postfix和Dovecot使用虚拟用户。
  • 列出Postfix配置文件中的虚拟域,而不是使用该mydestination行。
  • 在新位置创建新邮箱。他们曾经在/var/mail/myuser,但现在他们将在/var/mail/vhosts/example.com/user/。这有额外的好处,让你在不同的域名拥有相同的用户名:例如,你现在可以有jane@example.com和jane@example.net是两个不同的邮箱。
  • 告诉Postfix和Dovecot使用新的邮箱位置。
  • 授予一个系统用户(称为vmail)访问所有邮箱,而不是让每个系统用户拥有自己的邮箱。

在您完成本节时,您可能希望在虚拟用户上引用Postfix的Virtual ReadmeDovecot的wiki页面

  1. 为Postfix创建虚拟用户文件。这将列出相对于virtual_mailbox_base参数的所有电子邮件地址及其交付位置(已配置/etc/postfix/main.cf,我们将立即获得)。我们正在调用该文件/etc/postfix/virtual_users_list,它看起来像这样:
代码语言:txt
复制
/etc/postfix/ virtual_users_list

email1@example.com example.com/email1/ 
email2@example.com example.com/email2/
  1. 为Dovecot创建虚拟用户文件。这将以纯文本形式列出您的所有电子邮件用户名(仅使用电子邮件地址)及其密码(显然这不是生产就绪的)。它应该看起来像这样:
代码语言:txt
复制
/etc/dovecot/users

email1@example.com:{Plain}firstpassword 
email2@example.com:{Plain}secondpassword

此列表允许Dovecot在授予虚拟用户访问其收件箱之前检查虚拟用户的用户名和密码。

  1. 编辑Postfix的主配置文件,/etc/postfix/main.cf。删除每个域除了local.hostmydestination参数。创建一个名为的新参数virtual_mailbox_domains并添加您的域:
代码语言:txt
复制
/etc/postfix/main.cf

virtual_mailbox_domains = example.com, hostname, hostname.example.com, localhostexamplecom

注意 mydestinationvirtual_mailbox_domains列表之间不能重叠。

  1. 同样在/etc/postfix/main.cf,添加该行virtual_mailbox_base并将其设置为/var/mail/vhosts以便将邮件传递到新邮箱。每个用户的路径的最后部分位于virtual_users_list步骤1 的文件中。
代码语言:txt
复制
/etc/postfix/main.cf

virtual_mailbox_base = /var/mail/vhosts
  1. 同样在/etc/postfix/main.cf,添加该行virtual_mailbox_maps并将其设置为您在步骤1中创建的虚拟用户文件。它是一个“哈希”类型文件。如果你完全按照这个例子,它将是:
代码语言:txt
复制
/etc/postfix/main.cf
virtual_mailbox_maps = hash:/etc/postfix/virtual_users_list

但是,您可以virtual_mailbox_maps根据需要为此文件命名,并相应地设置参数。

  1. /etc/postfix/main.cf中的最后一项更改是设置新vmail系统用户。该用户将拥有虚拟邮箱。添加以下新行:
代码语言:txt
复制
/etc/postfix/main.cf

virtual_minimum_uid = 100 
virtual_uid_maps = static:5000 
virtual_gid_maps = static:5000
  1. 我们花点时间总结一下你刚刚做出的所有变化/etc/postfix/main.cf。您删除所有域,除了localhostmydestination参数,并增加了对虚拟域和用户,这应该是这样的(添加了一些新的线路#Virtual domains,如果需要的注释):
代码语言:txt
复制
/etc/postfix/main.cf

#Virtual domains 
virtual_mailbox_domains = example.com, host 
virtual_mailbox_base = /var/mail/vhosts 
virtual_mailbox_maps = hash:/etc/postfix/virtual_users_list 
virtual_minimum_uid = 100 
virtual_uid_maps = static:5000 
virtual_gid_maps = static:5000
  1. 既然您已经在Postfix配置文件中进行了所有更改,您应该确保Postfix使用以下命令读取新设置:
代码语言:txt
复制
postmap /etc/postfix/virtual_users_list
  1. 创建vmail用户和组:
代码语言:txt
复制
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/mail
  1. /var/mail/vhosts/example.com/email1为每个电子邮件地址创建目录。你必须从制作vhosts目录开始,然后继续努力。您可以使用mkdir-p如果需要的标志。
  2. /var/mail目录及其下面的所有内容更改为vmail用户和组:
代码语言:txt
复制
chown -R vmail:vmail /var/mail

太棒了!现在,邮件传递实际存在正确的文件夹,拥有这些文件夹的用户与我们告诉Postfix在向服务器写入新邮件时使用的文件夹相匹配。

  1. 重启Postfix。
  2. 尝试向自己发送测试消息。检查/var/log/mail.log; 你应该看到这样的东西:
代码语言:txt
复制
/var/log/mail.log
Mar  8 18:01:27 host postfix/virtual[4418]: E2C7528420: to=<email1@example.com>, relay=virtual, delay=0.01, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)

所说的部分relay=virtual意味着您已经正确设置了虚拟域和用户。

  1. 接下来是Dovecot。首先,更新mail_locationin /etc/dovecot/conf.d/10-mail.conf
代码语言:txt
复制
/etc/dovecot/conf.d/10-mail.conf

passdb {   
  driver = passwd-file   
  args = username_format=%u /etc/dovecot/users 
} 
userdb {
  driver = static   
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n 
}

注意 passdb部分详细介绍了电子邮件用户如何进 该driver行告诉Dovecot你正在使用一个平面文件,args行告诉它它在哪里以及期望的格式。(这是/etc/dovecot/users您在步骤2中创建的文件。)userdb行告诉Dovecot在哪里可以找到服务器上的邮件以及它应该用来访问邮件文件的系统用户。由于每个邮箱的位置格式相同,因此userdb可以是静态的。您告诉它使用该vmail用户来访问邮箱。最后,该home=参数告诉Dovecot寻找邮件var/mail/vhosts/example.com/user。此设置必须与Postfix设置中的virtual_mailbox_base+ /etc/postfix/virtual_users_list相对路径匹配。您必须告诉Dovecot在您告诉Postfix发送邮件的同一个地方寻找邮件。

  1. 现在你只需要告诉Dovecot使用auth-passwdfile.conf.ext而不是auth-system.conf.ext,所以它使用你在步骤2中创建的那个可爱的新密码文件。在/etc/dovecot/conf.d/10-auth.conf,添加#注释掉系统用户文件,并删除#以启用passwdfile配置文件:
代码语言:txt
复制
/etc/dovecot/conf.d/10-auth.conf

#!include auth-system.conf.ext 
!include auth-passwdfile.conf.ext
  1. 重启Dovecot。
  2. 给自己发一条测试信息。
  3. 看看您是否可以使用IMAP或POP3查看您的电子邮件; 您可以使用邮件客户端或Telnet。您现在应该能够使用您的电子邮件地址和电子邮件密码登录,而不是您的系统用户名和密码。

注意 请记住,这三条路径必须匹配:Postfix设置中的 virtual_mailbox_base+/etc/postfix/virtual_users_list 相对路径mail_location,Dovecot中的路径和Dovecot中的路径home=。

如果您最近的测试有效,那么您现在已经成功地将虚拟域和用户设置为Postfix和Dovecot。

Dovecot的LMTP用于本地交付

现在您已经有虚拟域和用户工作,现在是时候更新本地传递代理了。默认情况下,Postfix使用自己的内置LDA。我们将转而使用Dovecot的LMTP(本地邮件传输协议)服务。为此,我们必须在Dovecot中设置一个Postfix可以使用的套接字。

有关官方文档,请参阅Dovecot关于LMTP的wiki文章

  1. dovecot-lmtpd输入以下命令进行安装:
代码语言:txt
复制
apt-get install dovecot-lmtpd
  1. /etc/dovecot/dovecot.conf,添加或修改该protocols行,如下所示。如果您需要添加该行,可以在下面添加!include_try /usr/share/dovecot/protocols.d/*.protocol
代码语言:txt
复制
/etc/dovecot/dovecot.conf

protocols = imap pop3 lmtp
  1. 仔细编辑现有的service lmtp部分,/etc/dovecot/conf.d/10-master.conf如下所示,这将启用套接字:
代码语言:txt
复制
/etc/dovecot/conf.d/10-master.conf
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 =   
    #} 
}

注意 确保计算括号。此部分中的额外或缺少括号将产生语法错误,阻止Dovecot启动。

  1. 重启Dovecot。
  2. 确保接口存在:
代码语言:txt
复制
ls /var/spool/postfix/private/dovecot-lmtp
  1. 现在,告诉Postfix使用新套接字进行本地传递。在/etc/postfix/main.cf,设置此行:
代码语言:txt
复制
/etc/postfix/main.cf

virtual_transport = lmtp:unix:private/dovecot-lmtp
  1. 重启Postfix。
  2. 给自己发一条测试信息。确保您仍然可以收到邮件。

从Postfix到Dovecot的身份验证切换

默认情况下,除非您直接登录服务器,否则Postfix不允许您发送电子邮件。这是一个很好的默认设置,因为您不希望成为垃圾邮件中心。但是,您希望稍微放松生产服务器的设置,以便让经过身份验证的电子邮件用户发送邮件。作为前驱,您需要为Postfix设置身份验证。由于当用户想要检查他们的电子邮件时,Dovecot已经在处理身份验证方面表现出色,您也可以让它为Postfix处理身份验证。

这个过程与LMTP的过程非常相似,因为你首先在Dovecot中创建一个套接字然后告诉Postfix使用它。有关更多信息,请参阅Dovecot关于Postfix和SASL的wiki文章

  1. 仔细编辑/etc/dovecot/conf.d/10-master.conf看起来如下,这将启用套接字:
代码语言:txt
复制
/etc/dovecot/conf.d/10-master.conf
 
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 = $default_internal_user 
 }

注意 请再次注意你的括号。

  1. 在该service auth-worker部分中,设置uservmail
代码语言:txt
复制
/etc/dovecot/conf.d/10-master.conf

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 
}
  1. 重启Dovecot。
  2. 通过输入以下命令检查/ var / spool / postfix / private / auth是否存在:
代码语言:txt
复制
ls /var/spool/postfix/private/auth
  1. 现在,您将配置Postfix以使用Dovecot的身份验证。有关更多信息,请参阅Postfix的Dovecot SASL指南Postfix有关启用SASL的指南。添加以下行/etc/postfix/main.cf。这告诉Postfix身份验证类型,套接字的位置以及应该启用SASL身份验证:
代码语言:txt
复制
/etc/postfix/main.cf

smtpd_sasl_type = dovecot 
smtpd_sasl_path = private/auth 
smtpd_sasl_auth_enable = yes
  1. 重启Postfix。
  2. 给自己发送一条测试消息,确保您仍然可以收到它。

如果您的测试成功,您刚刚将Dovecot的LMTP服务设置为您的本地传递代理。

SSL加密

现在已经设置了身份验证,让我们确保身份验证过程是安全的。为此,您需要使用SSL或STARTTLS加密所有身份验证尝试。有关更多信息,请参阅Dovecot关于SSL加密的wiki文章

  1. 打开/etc/dovecot/conf.d/10-ssl.conf进行编辑,然后设置sslrequired
代码语言:txt
复制
/etc/dovecot/conf.d/10-ssl.conf

ssl = required
  1. 同样在/etc/dovecot/conf.d/10-ssl.conf,检查SSL证书和密钥的路径。默认情况下,它们应设置为Dovecot的证书和密钥。如果这是你正在使用的,请保留这些设置。否则,请更新要使用的证书和密钥的路径。
代码语言:txt
复制
/etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/ssl/certs/dovecot.pem 
ssl_key = </etc/ssl/private/dovecot.pem
  1. 验证您的SSL证书和密钥是否位于上一步中指定的位置。
  2. 禁用纯文本身份验证。在/etc/dovecot/conf.d/10-auth.conf,设置以下行:
代码语言:txt
复制
/etc/dovecot/conf.d/10-auth.conf

disable\_plaintext\_auth = yes
  1. 禁用IMAP和POP3的未加密端口,以便服务器不接受未加密的连接。在/etc/dovecot/conf.d/10-master.conf,设置:
代码语言:txt
复制
/etc/dovecot/conf.d/10-master.conf

service imap-login {    
  inet_listener imap {      
    port = 0   
  }  
  ...  
}   
service pop3-login {    
  inet_listener pop3 {      
    port = 0    
   }  
   ...  
}
  1. 离开imapspop3s端口(他们被注释掉了)。他们的默认设置很好; 您将能够使用993进行安全IMAP,使用995进行安全POP3。
  2. 重启Dovecot。
  3. 尝试在端口110和143上连接到您的服务器(我们建议使用Telnet)。这应该失败,因为我们只是禁用了未加密的端口。
  4. 尝试通过启用SSL加密和端口993或995来检查您的邮件。这应该会成功。

如果您无法在110和143上连接,并且可以在启用了SSL的993和995上进行连接,则您已成功强制加密所有身份验证连接。请注意,此时您将无法通过Telnet登录 - 您只是在测试端口。

SMTP

现在您已经安全地设置了身份验证,您需要配置SMTP。现在,只有当邮件发送到服务器上的域或者系统用户发送时,Postfix才会中继电子邮件,这对于收到的邮件就足够了。但是,对于外发邮件,您需要简化中继限制,以便经过身份验证的用户可以在任何位置发送电子邮件。

  1. 打开/etc/postfix/main.cf进行编辑,然后添加smtpd_recipient_restrictions如下所示的行:
代码语言:txt
复制
/etc/postfix/main.cf

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

注意 smtpd_recipient_restrictions行列出了Postfix用于决定可以中继哪些电子邮件的标准。permit_sasl_authenticated允许经过身份验证的用户发送邮件,应该首先列出。接下来我们有permit_mynetworks,它允许已登录服务器的用户发送邮件。最后,reject_unauth_destination阻止您的服务器为未配置它的域提供邮件。永远不要删除最后的设置!这意味着始终允许经过身份验证的用户和本地用户在任何地方发送邮件。允许非身份验证和非本地用户仅向此服务器负责的域发送邮件。这些限制会阻止您的服务器被用作可以将垃圾邮件从任何人发送到任何地方的开放中继。

  1. 您还需要强制加密传出身份验证。仍在/etc/postfix/main.cf,设置以下行:
代码语言:txt
复制
/etc/postfix/main.cf

smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem 
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem 
smtpd_use_tls=yes smtpd_tls_auth_only = yes

注意 首先,您将告诉Postfix使用Dovecot的SSL证书和密钥,因为如果传入和传出服务器的证书不匹配,某些邮件客户端将会阻塞。然后你告诉Postfix使用(仅)TLS加密。这意味着用户可以在标准端口(25)上进行连接,但在允许用户发送任何身份验证信息之前,他们必须建立加密连接。

  1. 制作/etc/postfix/master.cf文件的副本:
代码语言:txt
复制
cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
  1. 输入以下命令打开配置文件以进行编辑:
代码语言:txt
复制
nano /etc/postfix/master.cf
  1. 找到并取消注释以submission和开头的两行smtps。这将允许您在端口587和465上安全地发送邮件,以及端口25(使用我们的SSL设置也是安全的)。您/etc/postfix/master.cf文件的第一部分应类似于以下内容
代码语言:txt
复制
/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"). 
# 
# 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
  1. 保存您对/etc/postfix/master.cf文件所做的更改。
  2. 重启Postfix。
  3. 设置邮件客户端以作为外发邮件服务器连接到您的Linode。您应该使用TLS加密,或者如果您有此选项,则通过端口25,465或587使用STARTTLS。您的用户名和密码与传入邮件的用户名和密码相同。尝试发送测试消息。

注意 您将无法再使用Telnet进行测试。如果要运行手动测试以进行故障排除,可以使用openssl。您的命令应如下所示(您也可以在端口465和587上进行测试): openssl s_client -connect example.com:25 -starttls smtp

您的邮件服务器现在非常可行且安全。如果您乐意将所有域和用户存储在平面文件中,可以在此处停止。但是,为了使长期维护更容易,我们建议您将域,用户和别名列表存储在MySQL数据库中。

MySQL for Virtual Domains,Users和Aliases

让邮件服务器加快速度的最后一步是使它与MySQL兼容。

  1. 安装MySQL和Postfix和Dovecot的必要组件:
代码语言:txt
复制
apt-get install mysql-server postfix-mysql dovecot-mysql
  1. 创建三个MySQL表virtual_domainsvirtual_users以及virtual_aliases与您的数据填充,按照整个MySQL的部分主安装导轨上。如果您不想使用MySQL命令行,可以安装phpMyAdmin并使用它。
  2. 打开/etc/postfix/main.cf进行编辑。注释掉现有virtual_mailbox_domainsvirtual_mailbox_maps行,并添加以下内容:
代码语言:txt
复制
/etc/postfix/main.cf

#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
  1. 按照步骤11-25 后缀部分主要设置向导来创建/etc/postfix/mysql-virtual-mailbox-domains.cf/etc/postfix/mysql-virtual-mailbox-maps.cf/etc/postfix/mysql-virtual-alias-maps.cf文件。您还将使用postmap命令测试Postfix是否可以找到所有这些信息。
  2. 现在为Dovecot。创建文件/etc/dovecot/conf.d/auth-sql.conf.ext。您将创建一个新passdb部分,指示Dovecot使用MySQL进行身份验证。该userdb部分将与我们之前的部分相同,因为邮箱不会移动。
代码语言:txt
复制
/etc/dovecot/conf.d/auth-sql.conf.ext

passdb {   
  driver = sql   
  args = /etc/dovecot/dovecot-sql.conf.ext 
} u
serdb {
  driver = static   
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n 
}
  1. 打开/etc/dovecot/dovecot-sql.conf.ext以进行编辑,取消注释下面显示的行,并使用适当的MySQL连接信息更新它们:
代码语言:txt
复制
/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 
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
  1. 打开/etc/dovecot/conf.d/10-auth.conf进行编辑。注释掉该!include auth-passwdfile.conf.ext行并取消注释该!include auth-sql.conf.ext行。这会将您的身份验证从平面文件切换到数据库:
代码语言:txt
复制
/etc/dovecot/conf.d/10-auth.conf

#!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
  1. /etc/dovecot/目录的所有者和组更改为vmaildovecot递归:
代码语言:txt
复制
chown -R vmail:dovecot /etc/dovecot
  1. /etc/dovecot/递归方式更改目录的权限:
代码语言:txt
复制
chmod -R o-rwx /etc/dovecot
  1. 打开/etc/dovecot/conf.d/10-master.conf以进行编辑,并在该service auth部分中设置user = dovecot,在该行下方# Auth process is run as this user.
代码语言:txt
复制
/etc/dovecot/conf.d/10-master.conf
service auth { 
...   
  # Auth process is run as this user.   
  user = dovecot 
}
  1. 重启Dovecot。
  2. 确认您仍然可以发送和接收邮件。如果您遇到任何错误,请检查您的日志。

好了,现在您应该了解主要指南并拥有功能齐全的Postfix,Dovecot和MySQL邮件服务器!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 故障排除核对表
  • Postfix和Dovecot正在运行吗?
  • 检查日志
  • 启用详细日志
  • Dovecot
  • Postfix
  • 检查端口可用性
  • 从Linode端检查
  • 从Mac端检查
  • 从PC端检查
  • 分析结果
    • 验证您的登录凭据
    • 逐步配置
    • 设置
    • 基本的Postfix
    • 基本的Dovecot
    • 虚拟域和用户
    • Dovecot的LMTP用于本地交付
    • 从Postfix到Dovecot的身份验证切换
    • SSL加密
    • SMTP
      • MySQL for Virtual Domains,Users和Aliases
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档