Comment envoyer un message via la tuyauterie de ligne de commande

9

J'ai une commande cron qui exécute un fichier et j'essaie de configurer la sortie pour qu'elle m'envoie un e-mail. J'utilise cela avec des scripts tiers que je ne veux pas modifier les fichiers directs, j'ai donc besoin de diriger la sortie au lieu de modifier le PHP.

Je migre d'un serveur qui utilise mailvers un serveur qui utilise sendmail. J'ai du mal à savoir comment envoyer correctement un sujet à sendmail via une ligne de commande.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" [email protected]
Webnet
la source
sendmailest le binaire utilisé par votre système pour acheminer le courrier qui lui est soumis par mail. Il fait partie d'une suite de programmes comme sendmail , postfix , exim , etc. Vous devez donc installer le package approprié pour le courrier . Dites-nous donc la distribution Linux que vous utilisez.
adamo
Toutes les formes UNIX / Linux conformes à POSIX devraient fournir un exécutable nommé "sendmail" et prendre un ensemble spécifique d'options compatibles avec un sous-ensemble des fonctionnalités de sendmail (y compris l'option -t, décrite dans la réponse de timday ci-dessous). Exim, Postfix et qmail fournissent tous ces éléments --- parfois ils seront installés sous / usr / libexec / sendmail plutôt que / usr / bin ou / usr / sbin, par exemple.
Jim Dennis

Réponses:

3

/ usr / sbin / sendmail

C'est faux.

Vous devriez avoir une mailcommande quelque part. Cela pourrait s'appeler mailx. Doit être dans le /bin/répertoire. En règle générale, les scripts php ne doivent jamais appeler quoi que ce soit dans /sbinou /usr/sbin. Les programmes sbin sont généralement destinés à root.

De plus, php a une fonction de messagerie intégrée .

ablackhat
la source
Si ce n'est pas le cas mailou mailxpeut-être Mail. Mais même si ceux-ci n'existent pas, vous pouvez installer mutt et exécuter mutt -xqui émule mailx.
adamo
C'est vrai ... pour déterminer mon chemin, j'ai couru which mailet il est revenu /bin/mail.
Webnet
2
sendmail est la meilleure approche (c'est un standard Posix) ... mais il vaut mieux utiliser sendmail -t (prendre les en-têtes du flux d'entrée). Cela évite de nombreuses vulnérabilités d'interpolation de variable shell en permettant au programme envoyant du courrier d'interagir uniquement avec l'utilitaire sendmail sans invoquer de shell du tout). Voir la réponse de "timday" pour plus de détails
Jim Dennis
13

Sur mes systèmes Debian (qui ont Exim plutôt que "vrai" sendmail, mais qui ont toujours un binaire sendmail pour la compatibilité), quand je veux envoyer du courrier à partir d'un script, je fais quelque chose d'équivalent à:

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

This is a test message
EOF

Notez que la ligne vierge est importante.

timday
la source
1
La ligne vierge est utilisée pour séparer la partie d'en-tête d'un message du corps du message. sendmail -t <<EOFMais pourquoi pas ?
adamo
@adamo: Parce qu'il était plus proche du modèle de la question d'origine à envoyer dans sendmail avec '|' (et en fait les endroits où je le fais moi-même, c'est généralement quelque chose comme generate_test_message.sh | sendmail -t).
mardi
2
Il s'agit de l'approche canonique de l'envoi sécurisé de messages programmatiques sous UNIX.
Jim Dennis
enfin obtenu un exemple de travail pour sendmail! Je vous remercie!
insidepower
si le sendmaildevait échouer et écrire dans STDERR, comment pourrais-je capturer cela comme une variable à utiliser plus tard dans le script?
streetster
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 = Le corps de l'e-mail.
sed stuff = Applique les en-têtes des e-mails et une double ligne importante entre le corps et les en-têtes.
sendmail -t = Pipes directement via sendmail.

Praveen R
la source
-1
php -f file.php 2>&1 | sed 's/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t
Bernstein
la source
1
Salut et bienvenue à Server Fault. Peut-être pourriez-vous élaborer un peu votre réponse?
slm