Minhas necessidades de correio são simples. Eu só quero enviar notificações do sistema por meio de um gancho não SMTP. (O gancho envia para uma conta mailgun por https).
Imagino todos os programas linux (por exemplo, cron) chamando algo como "(enviar) e-mail [opções] conteúdo". Ou eles estão chamando o serviço SMTP diretamente?
Se eles estiverem chamando "(enviar) e-mail [opções] conteúdo", deve ser fácil adaptar/escrever um script de shell ou programa para converter essa chamada para o meu gancho.
Encontrei esta referência :
Especificação de PDA Base Padrão Linux 3.0RC1
Sinopse /usr/sbin/sendmail [opções] [endereço...] Descrição
Para entrega de correio eletrônico (email), os aplicativos devem suportar a interface fornecida pelo sendmail (descrito aqui). Essa interface deve ser o método de entrega padrão para aplicativos.
Este programa envia uma mensagem de e-mail para um ou mais destinatários, roteando a mensagem conforme necessário. Este programa não se destina a ser uma rotina de interface do usuário.
Sem opções, o sendmail lê sua entrada padrão até um final de arquivo ou uma linha composta apenas por um único ponto e envia uma cópia da mensagem encontrada para todos os endereços listados. Ele determina as redes a serem usadas com base na sintaxe e no conteúdo dos endereços.
Se um endereço for precedido por uma barra invertida, '\', não será especificado se o endereço estiver sujeito à expansão de alias local.
O formato das mensagens deve ser conforme definido na RFC 2822: Formato de Mensagem da Internet.
Opções
-bm
lê o correio da entrada padrão e o entrega aos endereços dos destinatários. Este é o modo de operação padrão.... (etc) ...
É isso que estou procurando? Em outras palavras, um programa chamado "sendmail" é invocado, e stdin será o conteúdo do correio compatível com RFC2882.
Obs: Eu sei que existe um programa chamado "nullmail" mas acredito que envia outbound usando SMTP, o que não quero. Pode ser adaptado para o front-end de análise RFC2822.
Obrigado a @ivanivan por informar que o sendmail é a interface de fato . Portanto, para enviar todas as notificações para um endereço de e-mail fixo por meio de uma conta gratuita do 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 uma 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 essas informações brutas como o preâmbulo do corpo do e-mail.
A desvantagem é depender do serviço de software livre e não aberto de um empreendimento comercial, que pode desaparecer algum dia. Mas, nenhuma perda real considerando a simplicidade.
Como informação de fundo, removi o postfix (uma substituição do sendmail) porque estava causando falha de rede na reinicialização. Isso aconteceu possivelmente como algum efeito colateral obscuro de ter executado uma máquina virtual com systemd-nspawn
. ( systemd-nspawn
funcionou perfeitamente por sinal). Considerando que a funcionalidade do sendmail era um exagero pela simples necessidade de enviar notificações do sistema, fiquei feliz em descartar a funcionalidade do sendmail em favor da solução acima e evitar a depuração.
Sim. O bom e velho
sendmail
foi um dos primeiros mailers e o comportamento e as opções que ele forneceu se tornaram arraigados nos vários sistemas *nix e *nix-like (Unix caro, os BSDs, Linux, o Hurd, etc.) (saída cron, usuário para usuário, root para usuário, etc) e para correio baseado em rede. Ele pode ser configurado para escutar interfaces de rede e atuar como um servidor SMTP ou, no caso de coisas internas ao sistema, pode ser chamado diretamente em/usr/bin/sendmail
um local semelhante.Agora que temos muitos outros servidores de e-mail para escolher - Postfix, Exim, etc - ou dois sistemas de e-mail precisam coexistir, OU o outro sistema de e-mail precisa fornecer exatamente as mesmas opções/comportamento que
sendmail
não quebram apenas sobre qualquer coisa que tenha a ver com mensagens internas ao sistema.Então você tem algumas opções -
Instale e/ou configure algum mailer e configure-o para atuar como smarthost ou relayhost. O que isso fará é aceitar e-mail e, se não for para um destinatário local, o smtpd atuará como um cliente de e-mail e se conectará ao servidor de e-mail de seu ISP (ou outro provedor) para enviar o e-mail. Um google rápido mostra que a configuração do Postfix para usar o mailgun está bem documentada e bastante direta no que diz respeito à configuração do servidor de e-mail - eu não verifiquei outras opções de mailer simplesmente porque gosto do postfix. Observe que os destinatários locais podem ser alias para outros endereços ou um
~/.forward
arquivo pode ser empregado...Encontre algum outro utilitário que forneça uma substituição
/usr/bin/sendmail
compatível e configurável para enviar e-mails por meio de uma chamada HTTPS (suponho que uma chamada de API para um serviço semelhante ao RESTful?)Se isso não funcionar, você tem mais uma opção - inicie seu editor de texto favorito e verifique seu caminho de inclusão. Escreva sua própria implementação do
sendmail
comportamento especificado. A página man deve lhe dar uma boa idéia dos comportamentos e opções que outros programas/sistemas (comocron
) esperariam estar lá, e você sempre pode examinar a fonte, se necessário.