Cómo enviar correo a través de la tubería de línea de comando

9

Tengo un comando cron que ejecuta un archivo y estoy tratando de configurar la salida para que me envíe un correo electrónico. Lo uso con scripts de terceros que no quiero modificar los archivos directos, por lo que necesito canalizar la salida en lugar de modificar el PHP.

Estoy migrando de un servidor que usa maila un servidor que usa sendmail. Estoy luchando por descubrir cómo enviar correctamente un asunto a sendmail a través de una línea de comando.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" [email protected]
Webnet
fuente
sendmailes el binario que utiliza su sistema para enrutar el correo que le envía mail. Es parte de un conjunto de programas como sendmail , postfix , exim , etc. Por lo tanto, debe instalar el paquete apropiado para el correo . Entonces díganos la distribución de Linux que está utilizando.
adamo
Todas las formas de UNIX / Linux que cumplen con POSIX deben proporcionar un ejecutable llamado "sendmail" y tomar un conjunto específico de opciones que sean compatibles con un subconjunto de la funcionalidad de sendmail (incluida la opción -t, descrita en la respuesta del día a continuación). Exim, Postfix y qmail proporcionan estos --- a veces se instalarán en / usr / libexec / sendmail en lugar de / usr / bin o / usr / sbin, por ejemplo.
Jim Dennis

Respuestas:

3

/ usr / sbin / sendmail

Eso está mal.

Deberías tener un mailcomando en algún lugar. Se podría llamar mailx. Debería estar en el /bin/directorio. Como práctica estándar, los scripts php nunca deberían llamar a nada en /sbino /usr/sbin. Los programas sbin son típicamente para root.

Además, php tiene una función de correo incorporada .

ablackhat
fuente
Si no es mailo mailxpuede ser Mail. Pero incluso si no existen, puede instalar mutt y ejecutar mutt -xcuál emula mailx.
adamo
Esto es cierto ... para determinar mi camino, corrí which maily regresó /bin/mail.
Webnet
2
sendmail es el mejor enfoque (es un estándar de Posix) ... pero es mejor usar sendmail -t (tomar los encabezados de la secuencia de entrada). Esto evita muchas posibles vulnerabilidades de interpolación de variables de shell al permitir que el programa que envía correo interactúe solo con la utilidad sendmail sin invocar ningún shell). Consulte la respuesta de "timday" para obtener más detalles.
Jim Dennis
13

En mis sistemas Debian (que tienen Exim en lugar de sendmail "real", pero todavía tienen un binario de sendmail por compatibilidad), cuando quiero enviar correo desde un script hago algo equivalente a:

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

This is a test message
EOF

Tenga en cuenta que la línea en blanco es importante.

Timday
fuente
1
La línea en blanco se usa para separar la parte del encabezado de un mensaje del cuerpo del mensaje. ¿Por qué no sendmail -t <<EOFsin embargo?
adamo
@adamo: Porque estaba más cerca del patrón en la pregunta original para canalizar en sendmail con '|' (y, de hecho, en los lugares donde hago esto, generalmente es algo así como generate_test_message.sh | sendmail -t).
Timday
2
Este es el enfoque canónico para el envío seguro de correo programático bajo UNIX.
Jim Dennis
¡finalmente obtuve un ejemplo de trabajo para sendmail! ¡Gracias!
insidepower
si sendmailfallaran y escribieran en STDERR, ¿cómo podría capturar esto como una variable para usar más adelante en el script?
Calles
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 = El cuerpo del correo electrónico.
sed stuff = Aplica los encabezados del correo electrónico y una importante línea doble entre el cuerpo y los encabezados.
sendmail -t = lo canaliza directamente a través de sendmail.

Praveen R
fuente
-1
php -f file.php 2>&1 | sed 's/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t
bernstein
fuente
1
Hola y bienvenido a Server Fault. ¿Quizás podrías elaborar un poco tu respuesta?
slm