![Postfix 中继连接错误、身份验证错误、发件人地址被拒绝以及指定发件人问题](https://linux22.com/image/758102/Postfix%20%E4%B8%AD%E7%BB%A7%E8%BF%9E%E6%8E%A5%E9%94%99%E8%AF%AF%E3%80%81%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E9%94%99%E8%AF%AF%E3%80%81%E5%8F%91%E4%BB%B6%E4%BA%BA%E5%9C%B0%E5%9D%80%E8%A2%AB%E6%8B%92%E7%BB%9D%E4%BB%A5%E5%8F%8A%E6%8C%87%E5%AE%9A%E5%8F%91%E4%BB%B6%E4%BA%BA%E9%97%AE%E9%A2%98.png)
我想使用 postfix 通过外部 smtp 服务器中继所有消息。
尽管我能够通过 telnet 连接到 SMTP 服务器,但还是出现了连接超时和被拒绝错误。
然后我收到身份验证错误。服务器返回“此服务器需要身份验证”消息。
然后我收到“发件人地址被拒绝:需要完全合格的地址”错误。
之后,我想以 info@mydomain 而不是 root@mydomain 的身份发送电子邮件。
最后,当我尝试将消息发送到 /etc/hostname 中写入的同一域时,消息并没有被中继到外部 SMTP。
我将回答我自己的问题以分享我找到的解决方案,希望它能够帮助其他人减少调试时间的浪费。
答案1
我正在使用 Debian buster,并且已经通过 安装了 postfix apt-get install
。
我如何解决连接超时和连接被拒绝的问题:
在 /etc/postfix/main.cf 中你需要有
relayhost = [smtp.server.com]:PORT
代替
relayhost = smtp.server.com:PORT
我花了几个小时才找到这个解决方案。你需要括号。
我如何解决身份验证问题
smtp_sasl_password_maps = static:smtp_username: smtp_password
成功了。这很可能也可以通过里面的配置来解释,里面的配置是我创建哈希映射时使用的/etc/postfix/sasl_passwd
格式,并设置为。我仍然不确定映射中的身份验证条目的正确格式是什么(带或不带括号,带或不带端口号)。[smtp.server.com]:PORT username:password
/etc/postfix/sasl_passwd.db
postmap /etc/postfix/sasl_passwd
/etc/postfix/main.cf
smtp_sasl_password_maps = /etc/postfix/sasl_passwd.db
我如何解决“发件人地址被拒绝:需要完全合格的地址”错误:
/etc/hostname
在更改为 SMTP 服务器可以接受的内容后,我仍然需要重新启动计算机。
我如何通过中继发送电子邮件[电子邮件保护]代替[电子邮件保护]
如果我尝试
echo "Test Email message body" | mail -s "Email test subject" [email protected]
电子邮件到达账户[电子邮件保护]好像它是从logged_on_user_linux@hostname_linux发送的。要将发件人电子邮件更改为info@而不是root@,我执行以下操作:
echo "This is the main body of the mail" | mail -s "Some random subject" -a "From: [email protected]" [email protected]
如何让 postfix 将所有电子邮件转发到外部 SMTP
外部 SMTP 使用 domain.com,它需要来自该域用户的消息。因此,我需要更改/etc/hostname
为 domain.com(虽然规范地址映射也可能解决这个问题,而无需更改主机名,但我不确定,因为我对 postfix 还不太熟悉)。它起作用了,电子邮件开始到达,发件人是[email protected]
。但这种设置妨碍了我发送电子邮件到[电子邮件保护]由于我的/etc/hostname
域名也是 domain.com,postfix 将这些消息保留给自己。解决方法是更改/etc/postfix/main.cf
:
代替
mydestination = $myhostname, domain.com, localhost, localhost.localdomain, localhost
下列
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
并且
myhostname = localhost
我不太确定myhostname
之前的值是多少,但它可能以某种方式指向 domain.com。