如何正确配置 postfix 和 opendkim 并让接收服务器知道签名者邮寄的所有详细信息?

Kar*_*rma 3 email-server postfix dkim domainkeys

我想要实现的目标 - 底线:邮件进入收件箱而不是垃圾邮件文件夹。

我有一台运行 postfix(邮件服务器)的服务器,我有 3 个域。邮件服务器用于传入和传出邮件。

我正在使用 opendkim 进行签名并拥有 DNS 记录。

经过长时间的观察,我意识到由于不正确的邮寄者和签名者分配,邮件成为垃圾邮件。

考虑一下,我的邮件服务器是 mailserver.example.com,其他 3 个域是 example1.com、example2.com 和 example3.com

当有人从 admin@example1.com 发送电子邮件时,它应该显示:

admin@example1.com 通过 mailserver.example.com

邮寄者:mailserver.example.com

签名:example1.com

我观察到 mailjet 和 amazon 电子邮件几乎不会进入垃圾邮件,事实是,“可能”是因为原始主机名 / ip 反向解析为邮寄者和签名者。

配置文件:

/etc/opendkim/Keytable

mvs._domainkey.example1.com example1.com:selc:/etc/opendkim/keys/example1_com/selc.private
mvs._domainkey.example2.com example2.com:selc:/etc/opendkim/keys/example2_com/selc.private
Run Code Online (Sandbox Code Playgroud)

/etc/opendkim.conf

Domain          example1.com
KeyFile     /etc/opendkim/keys/example1_com/selc
Selector        selc

Domain          example2.com
KeyFile     /etc/opendkim/keys/example2_com/selc
Selector        selc

Canonicalization    simple
Mode            sv
Syslog                  yes
LogWhy                  yes
UMask                   022
UserID                  opendkim:opendkim
KeyTable           /etc/opendkim/KeyTable
SigningTable       /etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts      /etc/opendkim/TrustedHosts
Socket                  inet:34562@localhost
X-Header        no
Run Code Online (Sandbox Code Playgroud)

最后

/etc/opendkim/SigningTable

example1.com selc._domainkey.example1.com
example2.com selc._domainkey.example2.com
Run Code Online (Sandbox Code Playgroud)

我在哪里失踪?

Gee*_*gus 8

首先,请删除这些值(如果您使用 KeyTable,则不需要它们):

Domain      example1.com
KeyFile     /etc/opendkim/keys/example1_com/selc
Selector    selc

Domain      example2.com
KeyFile     /etc/opendkim/keys/example2_com/selc
Selector    selc
Run Code Online (Sandbox Code Playgroud)

像这样设置您的KeyTable

mykey1 example1.com:recordname1:/path/to/domain.key
mykey2 example2.com:recordname2:/path/to/domain.key
Run Code Online (Sandbox Code Playgroud)

设置您SigningTable这样的(注意通配符匹配和mykey1mykey2KEYTABLE):

*@example1.com mykey1
*@example2.com mykey2
Run Code Online (Sandbox Code Playgroud)

最后更改您的opendkim.conf以通过refile :前缀(支持正则表达式)包含SigningTable

SigningTable    refile:/etc/opendkim/SigningTable
Run Code Online (Sandbox Code Playgroud)

供参考(注和域中记录recordname1recordname2KEYTABLE):

recordname1._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=..."
recordname2._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=..."
Run Code Online (Sandbox Code Playgroud)

此外,请检查InternalHosts文件中是否有您的节点主机名(您从中发送邮件):

server1.example1.com
server2.example2.com
mail.example1.com
mail.example2.com
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用refile:前缀来添加如下内容:

*.example1.com
*.example2.com
Run Code Online (Sandbox Code Playgroud)

如果您有多个主机并且不想手动包含所有主机。如果您只接受本地邮件,则应在此处添加localhost

如果您的主机在InternalHosts文件中丢失,您应该检查日志文件中关于跳过签名的DKIM通知。

opendkim.conf 示例:

# Set these values (Syslog, SyslogSuccess, LogWhy) for debugging and check syslog for details
Syslog      yes
SyslogSuccess   yes
LogWhy      yes

UMask       002
UserID      opendkim:opendkim

KeyTable            /etc/opendkim/KeyTable
SigningTable        refile:/etc/mail/SigningTable
InternalHosts       refile:/etc/mail/hosts
Run Code Online (Sandbox Code Playgroud)