Come inviare sendmail tramite piping della riga di comando


9

Ho un comando cron che esegue un file e sto cercando di impostare l'output in modo che mi invii un'e-mail. Lo uso con script di terze parti che non voglio modificare i file diretti, quindi ho bisogno di reindirizzare l'output invece di modificare il PHP.

Sto migrando da un server che utilizza maila un server che utilizza sendmail. Sto lottando per scoprire come inviare correttamente un oggetto a sendmail tramite una riga di comando.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" test@email.com

sendmailè il file binario utilizzato dal sistema per instradare la posta che gli viene inviata mail. Fa parte di una suite di programmi come sendmail , postfix , exim e così via. Quindi è necessario installare il pacchetto appropriato per la posta . Quindi dicci la distribuzione di Linux che stai usando.
Adamo,

Tutte le forme compatibili con POSIX di UNIX / Linux dovrebbero fornire alcuni file eseguibili denominati "sendmail" e prendere un insieme specifico di opzioni compatibili con un sottoinsieme delle funzionalità di sendmail (inclusa l'opzione -t, descritta nella risposta di timday, di seguito). Exim, Postfix e qmail forniscono tutti questi --- a volte verranno installati sotto / usr / libexec / sendmail anziché / usr / bin o / usr / sbin, per esempio.
Jim Dennis,

Risposte:


3

/ Usr / sbin / sendmail

È sbagliato.

Dovresti avere un mailcomando da qualche parte. Potrebbe essere chiamato mailx. Dovrebbe essere nella /bin/directory. Come pratica standard, gli script php non dovrebbero mai chiamare nulla in /sbino /usr/sbin. I programmi sbin sono in genere per root.

Inoltre, php ha una funzione di posta integrata .


Se non lo è mailo mailxpotrebbe essere Mail. Ma anche se quelli non esistono, puoi installare mutt ed eseguire mutt -xquale emula mailx.
Adamo,

Questo è vero ... per determinare il mio percorso, ho corso which mailed è tornato /bin/mail.
Webnet

2
sendmail è l'approccio migliore (è uno standard Posix) ... ma è meglio usare sendmail -t (prendere le intestazioni dal flusso di input). Ciò evita molte possibili vulnerabilità di interpolazione delle variabili della shell consentendo al programma che invia posta di interagire solo con l'utilità sendmail senza invocare alcuna shell). Vedi la risposta di "timday" per maggiori dettagli.
Jim Dennis,

13

Sui miei sistemi Debian (che hanno Exim anziché sendmail "reale", ma hanno ancora un binario sendmail per la compatibilità), quando voglio inviare posta da uno script faccio qualcosa di equivalente a:

cat <<EOF | sendmail -t
To: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

Si noti che la riga vuota è importante.


1
La riga vuota viene utilizzata per separare la parte dell'intestazione di un messaggio dal corpo del messaggio. Perché non sendmail -t <<EOFperò?
Adamo,

@adamo: Perché era più vicino allo schema nella domanda originale per passare a sendmail con '|' (e in effetti i posti in cui lo faccio da solo sono generalmente qualcosa come generate_test_message.sh | sendmail -t).
martedì

2
Questo è l'approccio canonico all'invio sicuro di posta programmatica sotto UNIX.
Jim Dennis,

finalmente ottenuto un esempio funzionante per sendmail! Grazie!
insidepower

se sendmailfallissero e scrivessero su STDERR, come potrei catturarlo come variabile da usare in seguito nello script?
streetster il

1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = Il corpo dell'email.
sed stuff = Applica le intestazioni e-mail e un'importante doppia linea tra corpo e intestazioni.
sendmail -t = Lo invia direttamente tramite sendmail.


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
Ciao e benvenuto in Server Fault. Forse potresti elaborare un po 'la tua risposta?
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.