2024年9月13日星期五

postfix + dovecot创建邮箱服务器的要点

1、在/etc/postfix/main.cf中:
mydestination表示的是postfix需要处理的域名(发件人的域名)

virtual_mailbox_domains是dovecot处理的发件人域名。

mydestination和virtual_mailbox_domains的域名不能重复,就是不能让postfix处理,又让dovecot处理。

2、myorigin是本地发送邮件的时候添加的域名。如果你的本机hostname是abcd,myorigin=efd.com那么mail发送邮件,发件人将是abcd@efd.com

3、relay_domains = 为空。如果你仅有一台邮件服务器。这个是设置一些域名为relay_domains定义的邮件,将通过relay_hostname指定的机器来发送。

4、下面这两行,是一个坑。网上教程多是下面这样的,5000是自己创建的vmail用户的uid和gid:

virtual_uid_maps = static:5000

virtual_gid_maps = static:5000

不可以使用root用户以及root组的用户来执行(dovecot限制了)

实际需要改为:

virtual_uid_maps = hash:/etc/postfix/virtual_uids

virtual_gid_maps = hash:/etc/postfix/virtual_gids

原因是,这条命令的意思,需要postfix在将邮件存储到虚拟邮箱的时候,使用的用户是哪个。如果是用 static:5000,那么就是指定使用vmail用户。这样当你用邮箱客户端登陆的获取邮件的时候,就会权限出错。因为通过IMAP登录获取邮件的用户是登录用户。登录用户和存储用户vmail不一致,当然就读取不了。所以需要根据邮箱的用户来存储收到的邮件。这坑居然花了我一个天。

virtual_uids和virtual_gids的文件格式是:用户 ID 如下面:

abcd@efd.com 5001

1234@efd.com 5002

5、virtual_mailbox_maps = hash:/etc/postfix/vmailbox

这个是用户和指定邮箱文件路径的匹配。其他地方也指定了。不知是什么原因需要多个地方指定,格式如下,用户 用户邮箱路径

root@efd.com    efd.com/root/

然后需要命令postmap /etc/postfix/vmailbox 生成校验的文件

6、下面这个设置:

smtpd_sender_restrictions = reject_sender_login_mismatch,

check_sender_access hash:/etc/postfix/sender_access,

                            permit_mynetworks,

                            reject_unauth_pipelining,

                            reject_non_fqdn_sender,

                            reject_unknown_sender_domain,

                            permit_sasl_authenticated,

                            reject

文件/etc/postfix/sender_access可以用于定义需要除了设定域名以外的发件人域名,允许接入。比如发件人是abcd@tdfsda.com,正常上面的接入是不可以的。但是你在sender_access文件中加上 tdfsda.com  ok, 那么就可以postfix或dovecot就可以允许接入和处理。

7、sender_canonical_maps = hash:/etc/postfix/sender_canonical 这个是mail发邮件的时候将发件人root@abcd的格式 转换成对应的格式。

8、在/etc/dovecot/dovecot.conf的配置中,需要指定邮箱的根目录:

mail_location = maildir:/var/mail/vhosts/%d/%n/Maildir
(你看这里再次指定,不知道为何。%d 表示收件人@后面的域名,%n是@前面的用户名)

9、smtpd_sender_login_maps = hash:/etc/postfix/sender_login_maps

是smtp接入时,提供的登录用户名的转换。格式是:接入的用户名  需要转换的用户名

abcd@efd.com abcd@efd.com

也需要postmap /etc/postfix/sender_login_maps 进行校验转换

10、在/etc/dovecot/conf.d/10-auth.conf文件是整个登录的鉴权设置,包括postfix创建的SMTPD服务器的接入鉴权。和postfix需要smtp去连其他服务输入用户名密码的设置不是一样的。(之前这个差点被整蒙了,看清楚SMTPD和SMTP,一个是本机的SMTP的后台服务设置,一个是postfix连其他服务器的SMTP的连接设置)

passdb {

  driver = passwd-file

  args = /etc/dovecot/users

}

userdb {

  driver = passwd-file

  args = /etc/dovecot/users

  default_fields = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n

}
再一次定义邮件路径,为何我也不知道。uid=vmail gid=vmail 表示使用vmail去读写这些邮件目录

这里有个坑,就是文件/etc/dovecot/users的用户,必须是服务器的用户。否则passdb可以通过,userdb通过不了,日志会显示找不到用户。

创建用户需要用命令:

useradd abcd@efd.com

并且需要将用户加入到vmail的组中,否则/var/mail/vhosts/%d/%n的邮箱地址显示该用户没有权限,拒绝接入。

加入组的命令:sudo usermod -aG vmail abcd@efd.com

/etc/dovecot/users文件内容的格式是:用户:{PLAIN}password

abcd@efd.com:{PLAIN}nidemima

11、/etc/dovecot/conf.d/10-mail.conf中这两行一定要有,而且格式不能变。

mail_home = /var/mail/vhosts/%d/%n

mail_location = maildir:~/Maildir

(为啥再一次指定邮箱路径?晕倒)否则不会为邮箱创建目录,找不到目前就不给接入。

12、证书指定:

ssl = yes

ssl_cert = </etc/letsencrypt/live/efd.com/fullchain.pem

ssl_key = </etc/letsencrypt/live/efd.com/privkey.pem

建议指定一下ca文件,否则可能有证书验证错误的问题:

ssl_ca = </etc/letsencrypt/live/efd.com/chain.pem

12、/etc/dovecot/conf.d/10-master.conf中对运行imap的用户指定:

service imap {

  user = vmail

}

13、#下面这条命令是确保25端口使用tls,否则对方如gmail会提醒是非加密邮件

smtp_tls_security_level = dane

14、虚拟邮箱路径,后面不要有/,否则多一个斜杠,就会出现/home//user,这种情况,就会说创建不了文件的错误。

virtual_mailbox_base = /home

15、如你的服务器是局域网内的一台机器。不要用iptables来转发流量,因为SNAT的方式,会导致丢失流量的源IP地址。就是邮件服务器只是看到你的网关的ip。这样postfix就认为是回环了。出现 mail loops back to myself 的错误。当你将局域网ip段加入到mynetworks的时候。

这些坑,对于初学者的我,花了好几天的时间才琢磨出来。一个地方错误,都得研究半天。供大家参考。

如果需要增加邮箱的别名

比如* abc@abc.com 的地址等于abc@abc.com

那么需要增加一个文件:/etc/postfix/virtual_maps,里面增加一行:

/^.*abc@abc\.com$/ abc@abc.com

然后在/etc/postfix/main.cf中,增加一行:

virtual_alias_maps = regexp:/etc/postfix/virtual_maps



没有评论:

发表评论

安装 PaddleOCR的方法

  安装飞桨版本:https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/develop/install/pip/windows-pip.html 命令:  python -m pip...