我有一个邮件服务器,可以接收MySQL数据库中的用户的邮件,并让他们通过POP3下载这些邮件。 这一切工作正常。 我的PostFix版本是2.7.0,在Ubuntu服务器10.04上。
问题是发送邮件。 有几个问题:
1.
服务器侦听端口25,但ISP阻止25,所以我需要添加一个监听端口。 这应该是465或587? 或两者? 如何为安全SMTP添加额外的端口?
我需要接受25的所有连接而不进行身份validation,但只接受邮件只用于系统上的有效收件人/域和块中继。 这目前正在工作。
端口587或465应允许中继到任何地址/域,但仅限于有效的用户进行身份validation。
我的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$
我要更改什么来使其从现有的用户数据库validation发件人?
3.
目前来自PHP的mail()命令创build的这个服务器的邮件只被传递给有效用户的mysql数据库中的用户。 我需要PHP能够发送邮件给任何地方的任何用户。 我应该设置PHP来validation与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运行后进一步testing?
当我在25号港口的EHLO时,我得到:
250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN
我不希望用户能够发送明文密码,我可以禁用普通login吗?
更新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'
以上是在尝试validation时执行的:
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
我也尝试将文件更改为以下build议的基础上的教程:
pwcheck_method: authdaemond mech_list: PLAIN LOGIN authdaemond_path: courier-authdaemon-socket
但是在指南的最后一步,我无法build立一个硬链接:
ln /var/run/courier/authdaemon/socket courier-authdaemon-socket
因为/ var / run在一个单独的分区上。 我创build了一个软链接,但auth仍然失败。 我认为MySQL的第一个例子似乎更正确。
1)
为了让smtpd监听备用端口,你需要修改master.cf复制已经存在的smtpd条目,把第一个域从smtp
改为587
或者你想要监听的任何端口。 如果要使用端口465,请取消注释smtps
条目。 我不会build议在这个端口上使用未encryption的smtp,因为它可能会引起邮件客户端的混乱和问题(因为465被指定为ssl端口)。
您希望启用身份validation的选项是smtpd_sasl_auth_enable=yes
, smtpd_recipient_restrictions=permit_sasl_authenticated
(您已拥有该选项,因此您只需configuration它)。 正如你在main.cf中有这些设置,它们为所有的端口启用。 没有理由只在25以外的端口上允许它们。如果邮件通过未经authentication的,那么它只会被本地交付所接受。 如果通过身份validation,它可以去任何地方。
我不确定你的意思是'为什么SMTP没有拒绝限制?'。
2)
您必须使用SASL进行身份validation。 所以validation是由postfix对话的外部服务提供的。 你仍然可以使用你现有的MySQL数据库,你只需要configuration一个SASL服务来使用它。 赛勒斯SASL是Postfix的默认提供者。 更多可以在这里阅读。
3)
您已经拥有smtpd_recipient_restrictions = permit_mynetworks
和mynetworks = 127.0.0.0/8
,因此localhost中的任何内容都将被接受,包括PHP。
注意我build议查看所有可用于smtpd_recipient_restrictions
的选项。 只要将此设置为此处提供的值,而不是其他任何值都可能导致不良行为。 我会阅读关于所有我提到的设置的postconf手册页 ,以便在实现它们之前了解它们在做什么。