Estou tentando obter relatórios por email de nossas instâncias AWS EC2. Estamos usando o Exchange Online (parte do Microsoft Online Services). Eu configurei uma conta de usuário especificamente paraRetransmissão SMTPe configurei o Postfix para atender a todos os requisitos para retransmitir mensagens por meio deste servidor. No entanto, o servidor SMTP do Exchange Online rejeitará mensagens, a menos que o endereço De corresponda exatamente ao endereço de autenticação (a mensagem de erro é 550 5.7.1 Client does not have permissions to send as this sender
).
Com uma configuração cuidadosa, posso configurar meus serviços para enviar como este usuário. Mas não sou um grande fã de ser cuidadoso - prefiro que o postfix force o problema. Existe uma maneira de fazer isso?
Responder1
É assim que realmente fazemos isso no postfix.
Esta configuração altera os endereços dos remetentes do tráfego de e-mail SMTP de origem local e retransmitido:
/etc/postfix/main.cf:
sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check
Reescrever o endereço do envelope do email originado do próprio servidor
/etc/postfix/sender_canonical_maps:
/.+/ [email protected]
Reescrever do endereço no e-mail retransmitido SMTP
/etc/postfix/header_check:
/From:.*/ REPLACE From: [email protected]
Isso é muito útil se você estiver, por exemplo, usando um servidor smtp de retransmissão local que é usado por todos os seus multifuncionais e vários aplicativos.
Se você usar o servidor SMTP do Office 365, qualquer e-mail com um endereço de remetente diferente do e-mail do próprio usuário autenticado será simplesmente negado. A configuração acima evita isso.
Responder2
O opcionalgenéricotabela especifica um mapeamento de endereço que se aplica quando o correio é entregue (enviado) do servidor.
Isto é o oposto decanônicomapeamento, que se aplica quando o correio é recebido pelo servidor.
(Observação: os endereços FROM e TO são correspondidos para substituição de qualquer tabela genérica e canônica.)
Usando tabela canônica quando o correio érecebido pelo servidorjá está explicado em outras respostas.
Você pode reescrever endereços FROM quando o correio forenviado do servidorusando smtp_generic_maps
.
De acordo comdocumentação postfix:
/etc/postfix/main.cf:
smtp_generic_maps = hash:/etc/postfix/generic
/etc/postfix/generic:
[email protected] [email protected]
@localdomain.local [email protected]
Então faça:
sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload
Referências:
Responder3
Atualização: Seguindo o conselho de um amigo de TI, estou executando o postfix em todos os meus servidores, em vez de criar um servidor de correio em nuvem. Aqui está minha solução até agora:
/etc/postfix/main.cf
# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain
# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic
# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com
# Only listen on the local interfaces (not the public)
inet_interfaces = localhost
# I left out a bunch of CentOS defaults. postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
/etc/postfix/sasl_passwd
# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com [email protected]:YourP@ssw0rd
/etc/postfix/generic
# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal [email protected]
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal [email protected]
/etc/aliases
# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon: postmaster
postmaster: root
# And the important part - your email or distribution group
root: [email protected]
/etc/passwd
# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
# rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash
Coisas pelas quais estou feliz:
- Muitas mensagens são enviadas para o root, e uma linha
alias
direciona quem as recebe. - Todas as mensagens de usuários locais são traduzidas para provenientes de
[email protected]
, portanto, passam pelo servidor SMTP do MS Online. - O postfix tem uma documentação muito melhor que o sendmail.
Coisas com as quais não estou feliz:
- São necessárias alterações personalizadas para cada host e várias etapas. Eu escrevi um script bash para ajudar.
- O
passwd
truque do nome nem sempre funciona e pode ser difícil descobrir de qual servidor vem o e-mail. - Cada e-mail enviado coloca três avisos no log:
warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list
(O servidor SMTP envia umaAUTH
lista nula antesSTARTTLS
, masAUTH LOGIN
depois).certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate
(Existem algumas opções de configuração em torno dos certificados, mas não tenho certeza se a entrega de mensagens é interrompida quando o certificado é renovado)certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted
(Igual ao nº 2)
Obrigado à comunidade serverfault por compartilhar opiniões fortes sobre servidores de e-mail.
Responder4
Uma resposta ainda mais simples versus um regex (de acordo com a resposta de @Jasper) é usar uma pesquisa estática:
sender_canonical_maps = static:[email protected]
static
sempre retorna o mesmo valor (https://www.postfix.org/DATABASE_README.html#types)