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 / unix / Perguntas / 453342
Accepted
Craig  Hicks
Craig Hicks
Asked: 2018-07-04 17:36:45 +0800 CST2018-07-04 17:36:45 +0800 CST 2018-07-04 17:36:45 +0800 CST

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

  • 772

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-nspawnfuncionou 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.

email sendmail
  • 1 1 respostas
  • 257 Views

1 respostas

  • Voted
  1. Best Answer
    ivanivan
    2018-07-04T18:15:46+08:002018-07-04T18:15:46+08:00

    Sim. O bom e velho sendmailfoi 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/sendmailum 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 sendmailnã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 ~/.forwardarquivo pode ser empregado...

    Encontre algum outro utilitário que forneça uma substituição /usr/bin/sendmailcompatí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 sendmailcomportamento especificado. A página man deve lhe 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.

    • 3

relate perguntas

  • Lidando com portas SMTP não padrão com sendmail -t

  • Enviar log específico com frase específica para meu e-mail

  • Como posso adicionar um anexo com o Sendmail (opções limitadas)?

  • Uma "exclusão segura" pode ser implementada para um servidor IMAP no modo Maildir?

  • Recebendo e-mail em um novo Debian fresco

Sidebar

Stats

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

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk 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