AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 866325
Accepted
Thomas Ward
Thomas Ward
Asked: 2017-08-02 09:07:53 +0800 CST2017-08-02 09:07:53 +0800 CST 2017-08-02 09:07:53 +0800 CST

Postfix Relay: Apenas envia mensagens de saída para a Internet em determinado critério, retransmite para outro retransmissor se o critério não for atendido

  • 772

Isso soará um pouco complicado e complexo, mas temos uma configuração muito ruim atualmente para e-mail em um dos ambientes de meus clientes.

Do sistema mais interno para o externo temos:

Exchange Server -> Sendmail Server -> McAfee Email Gateway -> OUTSIDE

Isso é um pouco ruim porque e-mails fora do escritório de destino externo (de alguém dentro do sistema para fora) não funcionam, eles são aparentemente capturados no McAfee Email Gateway e não são retransmitidos para fora.

O que estou tentando fazer é configurar um servidor Postfix como retransmissor E um servidor SMTP e, dependendo do que está sendo recebido:

  1. Enviar e-mail diretamente (usando SMTP, apenas para respostas de ausência temporária)
  2. Retransmita o correio para o servidor Sendmail, para o resto de suas funções de retransmissão, como normalmente aconteceria.

Isso então se pareceria um pouco com o seguinte:

Exchange Server -> Postfix Relay --- Out of Office messages only ---> OUTSIDE
                         |
                   All other mail
                         |
                         ---> Sendmail Server/Relay ---> McAfee Email Gateway ---> OUTSIDE

Estou um pouco confuso sobre como configurar o Postfix para a opção de retransmissão seletiva. Existe alguém que possa dar alguma dica sobre como conseguir isso?

postfix
  • 1 1 respostas
  • 742 Views

1 respostas

  • Voted
  1. Best Answer
    Thomas Ward
    2017-08-03T17:55:07+08:002017-08-03T17:55:07+08:00

    Eu vim com uma abordagem muito hackish para isso.

    Essencialmente, coloquei um 'servidor' SMTP personalizado escrito em Python sendo executado entre o servidor Postfix e o servidor Exchange que realmente lida com o roteamento de retransmissão real . Está escrito em Python e é executado como superusuário na porta 25 (por causa das restrições de vinculação de porta).

    Esse script Python processa a mensagem como faria normalmente, executando um e-mail do analisador de strings e, em seguida, lendo a linha de assunto para determinar para onde enviá-la e, em seguida, enviando a mensagem original, inalterada, para o servidor SMTP local do Postfix ( para ser enviado diretamente de saída) ou para o outro relé na rede. Até agora, parece estar funcionando.

    Este é o código que uso para isso no lado do Python:

    #!/usr/bin/env python3
    
    # Libraries
    import smtplib
    import smtpd
    import asyncore
    import email
    import sys
    from datetime import datetime
    
    print('Starting custom mail handling server...')
    
    # CONFIGURATION VARIABLES - We are expecting to relay, so... let's relay.
    SMTP_RELAY = 'SMTP_RELAY_HOSTNAME_OR_IP'
    SMTP_DIRECT = 'localhost'
    
    #############
    #############
    # SMTP SERVER
    #############
    #############
    
    
    # noinspection PyMissingTypeHints,PyBroadException
    class AutoReplyHandlerSMTP(smtpd.SMTPServer):
    
        def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
            print('MESSAGE RECEIVED - [%s]' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
            print('Receiving message from:', peer)
            print('Message addressed from:', mailfrom)
            print('Message addressed to  :', rcpttos)
            print('Message length        :', len(data))
            print(data)
    
            # Flush the output buffered (handy with the nohup launch)
            sys.stdout.flush()
    
            # Analyze and extract data headers
            msg = email.message_from_string(data)
            subject = ''
            try:
                subject = msg['Subject']
                subject = subject.lower()
            except:
                print("Subject error:", sys.exc_info()[0])
            print('Message subject       :', msg['Subject'])
    
            # Determine whether we are directly sending outbound, or if we're relaying to another server.
            if "automatic reply" in subject:
                print("Automatic reply received, sending directly.")
                # Local postfix SMTPd is on tcp/6625.
                conn = smtplib.SMTP(host=SMTP_DIRECT, port=6625, timeout=60)
                conn.sendmail(mailfrom, rcpttos, msg.as_string())
                conn.quit()
            else:
                print("Standard message detected, sending to relay.")
                # Other relay server is on tcp/25 (standard smtp)
                conn = smtplib.SMTP(host=SMTP_RELAY, timeout=60)
                conn.sendmail(mailfrom, rcpttos, msg.as_string())
    
            # Flush the output buffered (handy with the nohup launch)
            print("\n\n")
            sys.stdout.flush()
            return
    
    
    # Listen to port 25 ( 0.0.0.0 can be replaced by the ip of your server but that will work with 0.0.0.0 )
    server = AutoReplyHandlerSMTP(('0.0.0.0', 25), None)
    
    # Wait for incoming emails
    asyncore.loop()
    

    Configurei o Postfix para escutar SMTP em uma porta diferente. Na verdade, isso é o que acabou sendo feito, no /etc/postfix/master.cfmeu servidor Ubuntu para isso, e são as duas linhas e como eu configurei o SMTPd no Postfix - observe que você pode usar qualquer porta numerada alta para qualquer outra porta para Postfix SMTPd, mas eu escolhi algo fácil:

    #smtp      inet  n       -       y       -       -       smtpd
    6625      inet  n       -       y       -       -       smtpd
    

    O script Python então encaminha os dados para port 6625, e o SMTPd do Postfix roda lá; com isso feito, deixamos especificamente o Python determinar qual servidor SMTP ou retransmissão é o "próximo salto". Isso meio que quebra os cabeçalhos padrão "Recebido por", mas supostamente funciona bem com mensagens.

    Não tive problemas com minha solução e parece estar funcionando. Testes adicionais são necessários, mas esta 'solução' parece resolver o problema de roteamento de como rotear mensagens (direcionar SMTP para fora, ou através do resto dos relés) sem realmente mexer na configuração do Postfix.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve