Como enviar email via canal de linha de comando

9

Eu tenho um comando cron que executa um arquivo e estou tentando configurar a saída para que ele envie um email para mim. Eu uso isso com scripts de terceiros que não quero modificar os arquivos diretos, portanto, preciso canalizar a saída em vez de modificar o PHP.

Estou migrando de um servidor que usa mailpara um servidor que usa sendmail. Estou lutando para descobrir como enviar corretamente um assunto para o sendmail por meio de uma linha de comando.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" [email protected]
Webnet
fonte
sendmailé o binário usado pelo seu sistema para rotear o correio enviado a ele por mail. Faz parte de um conjunto de programas como sendmail , postfix , exim e assim por diante. Portanto, você precisa instalar o pacote apropriado para o correio . Diga-nos a distribuição linux que você está usando.
Adamo
Todas as formas compatíveis com POSIX do UNIX / Linux devem fornecer algum executável chamado "sendmail" e aceitar um conjunto específico de opções compatíveis com um subconjunto da funcionalidade do sendmail (incluindo a opção -t, descrita na resposta do dia seguinte, abaixo). O Exim, o Postfix e o qmail fornecem isso --- às vezes eles são instalados em / usr / libexec / sendmail em vez de / usr / bin ou / usr / sbin, por exemplo.
Jim Dennis

Respostas:

3

/ usr / sbin / sendmail

Isto é errado.

Você deve ter um mailcomando em algum lugar. Poderia ser chamado mailx. Deve estar no /bin/diretório Como prática padrão, os scripts php nunca devem chamar nada em /sbinou /usr/sbin. Os programas sbin são tipicamente para raiz.

Além disso, o php possui uma função de correio embutida .

ablackhat
fonte
Se não é mailou mailxpode ser Mail. Mas, mesmo que eles não existam, você pode instalar o mutt e executar o mutt -xque emula mailx.
Adamo
Isso é verdade ... para determinar meu caminho, eu corri which maile ele retornou /bin/mail.
Webnet 19/03/12
2
O sendmail é a melhor abordagem (é um padrão Posix) ... mas é melhor usar o sendmail -t (pegue os cabeçalhos do fluxo de entrada). Isso evita muitas possíveis vulnerabilidades de interpolação de variáveis ​​de shell, permitindo que o programa que envia o correio interaja apenas com o utilitário sendmail sem invocar nenhum shell). Veja a resposta "timday's" para obter mais detalhes.
Dennis.
13

Nos meus sistemas Debian (que possuem o Exim em vez do sendmail "real", mas ainda têm um binário sendmail para compatibilidade), quando quero enviar email de um script, faço algo equivalente a:

cat <<EOF | sendmail -t
To: [email protected]
Subject: Testing
From: [email protected]

This is a test message
EOF

Observe que a linha em branco é importante.

timday
fonte
1
A linha em branco é usada para separar a parte do cabeçalho de uma mensagem do corpo da mensagem. Por que não sendmail -t <<EOF?
Adamo
@adamo: porque estava mais próximo do padrão na pergunta original para canalizar para o sendmail com '|' (e, de fato, os locais em que faço isso geralmente são algo como generate_test_message.sh | sendmail -t).
timday 19/03/12
2
Essa é a abordagem canônica para o envio programático seguro de mensagens no UNIX.
Jim Dennis
finalmente consegui um exemplo de trabalho para o sendmail! Obrigado!
Insidepower
se sendmailfalharem e gravarem no STDERR, como eu poderia capturar isso como uma variável para usar posteriormente no script?
Streetster 31/12/19
1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = O corpo do email.
sed stuff = Aplica os cabeçalhos de email e as linhas duplas importantes entre corpo e cabeçalhos.
sendmail -t = Canaliza diretamente através do sendmail.

Praveen R
fonte
-1
php -f file.php 2>&1 | sed 's/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t
Bernstein
fonte
1
Olá e bem-vindo à falha do servidor. Talvez você possa elaborar um pouco sua resposta?
Slm