Qual é a interface padrão usada pelos programas do sistema linux para enviar mensagens de notificação?

1

Minhas necessidades de e-mail são simples. Eu só quero enviar notificações do sistema através de um gancho não-SMTP. (O gancho envia para uma conta mailgun por https).

Eu imagino que todos os programas linux (por exemplo, cron) chamam algo como "conteúdo de (enviar) mail [opções]". Ou eles estão chamando o serviço SMTP diretamente?

Se eles estão chamando de "conteúdo de [opções] de e-mail", então deve ser fácil adaptar / escrever um script de shell ou programa para converter essa chamada para o meu gancho.

Eu encontrei esta referência :

Linux Standard Base PDA Specification 3.0RC1

Synopsis /usr/sbin/sendmail [options] [address...] Description

To deliver electronic mail (email), applications shall support the interface provided by sendmail (described here). This interface shall be the default delivery method for applications.

This program sends an email message to one or more recipients, routing the message as necessary. This program is not intended as a user interface routine.

With no options, sendmail reads its standard input up to an end-of-file or a line consisting only of a single dot and sends a copy of the message found there to all of the addresses listed. It determines the network(s) to use based on the syntax and contents of the addresses.

If an address is preceded by a backslash, '\', it is unspecified if the address is subject to local alias expansion.

The format of messages shall be as defined in RFC 2822:Internet Message Format.

Options

-bm
read mail from standard input and deliver it to the recipient addresses. This is the default mode of operation.

... (etc) ...

É isso que estou procurando? Em outras palavras, um programa chamado "sendmail" é invocado, e stdin será compatível com o conteúdo de correio eletrônico da RFC2882.

Nota: Eu sei que existe um programa chamado "nullmail", mas acredito que envia saída usando SMTP, o que eu não quero. Pode ser adaptado para o front end de análise do RFC2822.

Obrigado a @ivanivan por informar que sendmail é a interface de facto . Portanto, para enviar todas as notificações para um endereço de e-mail fixo através de uma conta gratuita Mailgun (e registrá-la também), o seguinte código será suficiente:

#!/bin/bash
Logfile=/var/log/sendmail-dummy.log
Tmpf=$(mktemp -t sendmail-dummy-XXXXXX.txt)
TmpCurlLog=$(mktemp -t sendmail-dummy-XXXXXX.txt)
trap 'rm -f ${Tmpf} ${TmpCurlLog}' 0

Date=$(date +%F-%T)
echo "[$Date] Caller: $(caller)" >>${Tmpf}
echo "[$Date] Caller: $0" >>${Tmpf}
echo "[$Date] Args: ${@}" >>${Tmpf}
echo "[$Date] Content:" >>${Tmpf}
while read line ; do
    echo $line  >>${Tmpf}
done
echo "" >>${Tmpf}

MailgunDomain="example.com"
# The key is assigned by Mailgun when signing up for free account 
Key="key-<some hex string>"
# not sure if the from-mail-addr has to belong to example.com
FromAddr="[email protected]"
# the to-mail-addr must be registered on Mailgun by showing you own it 
ToAddr="[email protected]"

curl -s --user "api:${Key}" "https://api.mailgun.net/v3/${MailgunDomain}/messages" \
     -F from=" <$FromAddr>" \
     -F to="${ToAddr}" \
     -F subject='Notification' \
     -F text="<${Tmpf}" > ${TmpCurlLog}
rc=$?

echo "----------------------------------------" >> ${Logfile}
echo "[$Date] curl result = $rc" >> ${Logfile}
cat ${Tmpf} >> ${Logfile}
echo "----------------------------------------" >> ${Logfile}
cat ${TmpCurlLog} >> ${Logfile}
echo "" >> ${Logfile}
echo "++++++++++++++++++++++++++++++++++++++++" >> ${Logfile}

Disponível como essência

Como pode ser visto, ele não tenta interpretar argumentos do sendmail ou extrair informações semânticas do corpo. Apenas envia todas as informações brutas como o preâmbulo do corpo do email.

A desvantagem depende do serviço de software livre e não aberto de um empreendimento comercial, que pode desaparecer um dia. Mas, nenhuma perda real, considerando a simplicidade.

Como informações de segundo plano, removi postfix (uma substituição de sendmail) porque estava causando falha de rede na reinicialização. Isso aconteceu possivelmente como um efeito colateral obscuro de ter executado uma máquina virtual com systemd-nspawn . ( systemd-nspawn funcionou perfeitamente pelo caminho). Considerando que a funcionalidade sendmail era um exagero pela simples necessidade de enviar notificações do sistema, fiquei feliz em despejar a funcionalidade sendmail em favor da solução acima e evitar a depuração.

    
por Craig Hicks 04.07.2018 / 03:36

1 resposta

3

Sim. O bom e velho sendmail foi um dos primeiros e-mails e o comportamento e as opções que ele forneceu tornaram-se enraizados nos vários sistemas * nix e * nix-like (caro Unix, BSDs, Linux, Hurd, etc) para ambos internos - mensagens do sistema (saída cron, usuário para usuário, raiz para usuário, etc) e para correio baseado em rede. Ele pode ser configurado para escutar em interfaces de rede e atuar como um servidor SMTP ou, no caso de material interno a sistema, ele pode ser chamado diretamente em /usr/bin/sendmail ou em um local semelhante.

Agora que temos muitos outros servidores de email para escolher - Postfix, Exim, etc - dois sistemas de email devem coexistir, OU o outro sistema de email precisa fornecer exatamente as mesmas opções / comportamentos que sendmail faz para evitar quebrar qualquer coisa que tenha a ver com mensagens internas ao sistema.

Então você tem algumas escolhas -

Instale e / ou configure algum mailer e configure-o para atuar como um smarthost ou relayhost. O que isso vai fazer é aceitar e-mail, e se não for para um destinatário local o smtpd irá atuar como um cliente de e-mail e se conectar ao seu servidor de e-mail ISPs (ou outro provedor) para enviar o e-mail. Um rápido google mostra que configurar o Postfix para usar mailgun é bem documentado e bastante direto no que diz respeito à configuração do servidor de email - eu não verifiquei outras opções de mailer simplesmente porque eu gosto de postfix. Observe que os destinatários locais podem ter um alias para outros endereços, ou um arquivo ~/.forward pode ser empregado ...

Encontre algum outro utilitário que ofereça uma substituição /usr/bin/sendmail que seja compatível e seja configurável para enviar e-mails por meio de uma chamada HTTPS (acredito que a API chamará um serviço semelhante ao RESTful?)

Se isso não funcionar, você terá mais uma opção: acione seu editor de texto favorito e verifique seu caminho de inclusão. Escreva sua própria implementação do comportamento sendmail especificado. A página man deve dar uma boa idéia dos comportamentos e opções que outros programas / sistemas (como cron ) esperariam estar lá, e você sempre pode examinar a fonte, se necessário.

    
por 04.07.2018 / 04:15