我有一台邮件服务器,可以接收 MySQL 数据库中用户的邮件,并允许他们通过 POP3 下载这些邮件。一切运行正常。我的 PostFix 版本是 2.7.0,安装在 Ubuntu Server 10.04 上。
问题在于发送邮件。有几个问题:
1.
服务器监听端口 25,但 ISP 会阻止 25,因此我需要添加一个监听端口。应该是 465 还是 587?还是两者都是?如何为安全 SMTP 添加其他端口?
我需要接受 25 上的所有连接而无需身份验证,但只接受系统上有效收件人/域的邮件并阻止中继。目前此功能可行。
端口 587 或 465 应该允许中继到任何地址/域,但仅限于经过身份验证的有效用户。
我的 master.cf 文件的顶部是:
smtp inet n - - - - smtpd
#submission inet n - - - - smtpd
# -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 smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
我猜我可以取消注释其中一行,但我不知道要取消注释哪一行或哪些选项。
另外,为什么 SMTP 没有拒绝限制?是因为它总是接受端口 25 上的所有内容,然后决定是否稍后保留它们吗?从端口 25 进入但没有有效域的消息会发往哪里?我有一个针对我们服务的域的万能方法。他们会将它们退回吗?我读到过退回很糟糕,因为它会让你看起来像个垃圾邮件发送者。
2.
我的用户已经在 MySQL 数据库中保存传入邮件,并且我想使用同一个数据库来允许发送邮件。
main.cf 如下所示:
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
# TLS parameters
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/mail.crt
smtpd_tls_key_file = /etc/ssl/private/mail.key.insecure
myhostname = mysite.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination =
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-forwards.cf, mysql:/etc/postfix/mysql-email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_can$
我应该做哪些更改才能使其从现有用户数据库中验证发件人?
3.
目前,此服务器通过 PHP 的 mail() 命令创建的邮件仅发送给有效用户 mysql 数据库中的用户。我需要 PHP 能够向任何地方的任何用户发送邮件。一旦 PHP 工作正常,我是否应该设置 PHP 以通过 SMTP 进行身份验证?
更新:
我已将我的 master.cf 更改为如下所示,并在防火墙中打开了 587。
smtp inet n - - - - smtpd
submission inet n - - - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
现在我无法通过 587 进行 telnet:
telnet xxx.xxx.xxx.xx 587
Trying xxx.xxx.xxx.xx...
Connected to xxx.xxx.xxx.xx.
Escape character is '^]'.
220 mydomain.com ESMTP Postfix
EHLO you
250-mydomain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: <[email protected]>
530 5.7.0 Must issue a STARTTLS command first
STARTTLS
220 2.0.0 Ready to start TLS
好的,所以我必须使用 TLS,这很好,但是我不知道 TLS 运行后如何进一步测试?
当我在端口 25 上使用 EHLO 时,我得到:
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
我不希望用户能够发送明文密码,我可以禁用纯文本登录吗?
更新2:
我原来的 /etc/postfix/sasl/smtpd.conf:
pwcheck_method: saslauthd
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mailusr
sql_passwd: secret
sql_database: mail
sql_select: select password from users where email = '%u'
上面的操作在尝试验证时执行:
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: < c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: dGVzdEBhcsEZ2Vdci1jb20=
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_next: decoded response: [email protected]
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_auth_response: uncoded server challenge: Password:
Feb 27 09:40:00 MyHOSTNAME postfix/smtpd[27274]: > c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: 334 UGFzc3dvcmQ6
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: < c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: dGVzdGluZw==
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: xsasl_cyrus_server_next: decoded response: testing
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: warning: c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: SASL LOGIN authentication failed: authentication failure
Feb 27 09:40:20 MyHOSTNAME postfix/smtpd[27274]: > c-65-34-234-133.hsd1.fl.comcast.net[65.34.xxx.xxx]: 535 5.7.8 Error: authentication failed: authentication failure
我还尝试根据以下内容将文件更改为以下内容这建议的教程:
pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
authdaemond_path: courier-authdaemon-socket
但我无法在指南的最后一步创建硬链接:
ln /var/run/courier/authdaemon/socket courier-authdaemon-socket
因为 /var/run 位于单独的分区。我改为创建了软链接,但身份验证仍然失败。我认为使用 MySQL 的第一个示例似乎更正确。
答案1
1)
要使 smtpd 监听备用端口,您可以修改 master.cf,复制现有的 smtpd 条目,然后将第一个字段从 更改为smtp
或587
您想要监听的任何端口。如果您想使用端口 465,请取消注释该smtps
条目。我不建议在这个端口上使用未加密的 smtp,因为它很可能会引起混淆并导致邮件客户端出现问题(因为 465 被指定为 ssl 端口)。
您要查找的启用身份验证的选项是smtpd_sasl_auth_enable=yes
和smtpd_recipient_restrictions=permit_sasl_authenticated
(您已经拥有,因此只需配置它)。由于您在 main.cf 中拥有这些设置,因此它们对所有端口都启用。没有理由只允许它们在 25 以外的端口上使用。如果邮件未经身份验证就发来,那么它将只被接受用于本地投递。如果它经过身份验证,它可以发往任何地方。
我不确定您所说的“为什么 SMTP 没有拒绝限制?”是什么意思。
2)
您必须使用 SASL 进行身份验证。因此,身份验证由 Postfix 与之通信的外部服务提供。您仍然可以使用现有的 MySQL 数据库,只需配置 SASL 服务即可使用它。Cyrus SASL 是 Postfix 中的默认提供程序。更多信息可以阅读这里。
3)
您已经拥有smtpd_recipient_restrictions = permit_mynetworks
,和mynetworks = 127.0.0.0/8
,因此来自本地主机的任何内容都将被接受,包括 PHP。
笔记
我建议查看 的所有可用选项smtpd_recipient_restrictions
。只需将其设置为此处提供的值,其他任何事情都不会导致不良行为。我会阅读postconf 手册页关于我提到的所有设置,以便您在实施它们之前了解它们在做什么。