11 votes

Comment envoyer sendmail par piping en ligne de commande

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

Je suis en train de migrer depuis un serveur qui utilise mail à un serveur qui utilise sendmail . J'ai du mal à trouver 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" test@email.com

0 votes

sendmail est le binaire qui est 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 et ainsi de suite. Vous devez donc installer le paquetage approprié pour courrier électronique . Dites-nous donc quelle est la distribution linux que vous utilisez.

0 votes

Toutes les formes d'UNIX/Linux compatibles POSIX devraient fournir un exécutable nommé "sendmail" et prenant un ensemble spécifique d'options qui sont 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 cela --- parfois ils seront installés sous /usr/libexec/sendmail plutôt que /usr/bin ou /usr/sbin, par exemple.

15voto

timday Points 856

Sur mes systèmes Debian (qui ont Exim plutôt que le "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: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

Notez que la ligne blanche est importante.

1 votes

La ligne vierge est utilisée pour séparer la partie en-tête d'un message du corps du message. Pourquoi pas sendmail -t <<EOF cependant ?

0 votes

@adamo : Parce que c'était plus proche du modèle de la question originale de pipe 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 ).

2 votes

C'est l'approche canonique de l'envoi programmé de courrier sous UNIX.

4voto

jrg Points 159

/usr/sbin/sendmail

C'est faux.

Vous devriez avoir un mail un commandement quelque part. Elle pourrait s'appeler mailx . Devrait être dans le /bin/ répertoire. Comme pratique standard, les scripts php ne devraient jamais appeler quoi que ce soit dans le répertoire /sbin o /usr/sbin . Les programmes sbin sont généralement destinés à root.

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

1 votes

Si ce n'est pas le cas mail ou mailx il se peut que Mail . Mais même si ceux-ci n'existent pas, vous pouvez installer mutt et exécuter mutt -x qui émule mailx .

0 votes

C'est vrai... pour déterminer ma voie, j'ai couru which mail et il a retourné /bin/mail .

2 votes

Sendmail est la meilleure approche (c'est un standard Posix) ... mais il est préférable d'utiliser sendmail -t (prendre les en-têtes du flux d'entrée). Cela évite de nombreuses vulnérabilités possibles d'interpolation de variables Shell en permettant au programme envoyant le courrier d'interagir uniquement avec l'utilitaire sendmail sans invoquer aucun Shell du tout). Voir la réponse de "timday" pour plus de détails.

1voto

Praveen R Points 11
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 = Le corps de l'email.
sed stuff = Applique les en-têtes de l'email, et une double ligne importante entre le corps et les en-têtes.
sendmail -t = Transmet directement par sendmail.

-1voto

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

1 votes

Bonjour et bienvenue sur Server Fault. Peut-être pourriez-vous élaborer un peu plus votre réponse ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X