Eu tenho um servidor de e-mail que pode receber e-mails para usuários que estão em um banco de dados MySQL, e permite que eles baixem essas mensagens via POP3s. Tudo isso está funcionando bem. Minha versão do PostFix é 2.7.0, no Ubuntu Server 10.04.
O problema é enviar email. Existem vários problemas:
1.
O servidor escuta na porta 25, mas os ISPs bloqueiam 25, por isso preciso adicionar uma porta de escuta. Deve ser 465 ou 587? ou ambos? Como eu adiciono uma porta adicional para SMTP seguro?
Eu preciso aceitar todas as conexões em 25 sem autenticação, mas aceito somente email para destinatários / domínios válidos no sistema e bloqueio de retransmissão. Isso está funcionando atualmente.
A porta 587 ou 465 deve permitir a retransmissão para qualquer endereço / domínio, mas somente para usuários válidos que se autenticam.
O topo do meu arquivo 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
Suponho que posso remover o comentário de uma dessas linhas, mas não sei qual delas ou quais opções para descomentar.
Além disso, por que o SMTP não tem uma restrição de rejeição? É porque sempre aceita tudo na porta 25 e decide se vai mantê-los mais tarde? Para onde vão as mensagens que entram na porta 25, mas não tem um domínio válido aqui? Eu tenho um catchall para o domínio que servimos. Eles devolveriam eles? Eu li que pular era ruim porque poderia fazer você parecer um spammer.
2.
Meus usuários já estão em um banco de dados MySQL para mensagens recebidas, e gostaria de usar esse mesmo banco de dados para permitir mensagens de saída.
main.cf se parece com:
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$
O que eu altero para autenticar os remetentes do banco de dados de usuários existente?
3.
Atualmente, o correio deste servidor criado pelo comando mail () do PHP está sendo entregue apenas para usuários que estão no banco de dados mysql de usuários válidos. Eu preciso do PHP para poder enviar mensagens para qualquer usuário em qualquer lugar. Devo configurar o PHP para autenticar com SMTPs, uma vez que está funcionando?
ATUALIZAÇÃO:
Eu mudei meu master.cf para ficar assim e abri 587 no Firewall.
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
Agora não posso entrar em contato com o 587:
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
OK, então eu tenho que usar o TLS, o que é bom, mas eu não sei como testar mais quando o TLS estiver rodando?
Quando eu EHLO na porta 25, recebo:
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
Eu não quero que os usuários possam enviar senhas de texto simples, posso desabilitar logins simples?
UPDATE 2:
Meu /etc/postfix/sasl/smtpd.conf original:
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'
O texto acima faz isso quando se tenta autenticar:
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
Eu também tentei alterar o arquivo para o seguinte com base em this tutorial sugerido:
pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
authdaemond_path: courier-authdaemon-socket
Mas não consegui criar um link físico na última etapa do guia:
ln /var/run/courier/authdaemon/socket courier-authdaemon-socket
Porque o / var / run está em uma partição separada. Em vez disso, criei um link temporário, mas a autenticação ainda falhava. Acho que o primeiro exemplo com o MySQL parece mais correto.