Bash Script usando mailx para enviar archivos adjuntos por correo
-
27-10-2019 - |
Pregunta
Tengo un script bash que ejecuta una consulta en postgres y la genera en csv.Quiero agregar a esa secuencia de comandos el uso de mailx para enviar por correo electrónico ese archivo .csv a un correo electrónico en particular.
El problema que tengo es que no envía el archivo por correo electrónico.Puedo recibir el correo electrónico para saber que mailx está configurado correctamente.Simplemente no puedo enviarlo por correo electrónico como archivo adjunto.También puede enviar el resultado por correo electrónico en el cuerpo del correo electrónico.
Así que aquí está el código.
#!/bin/bash
NOWDATE=`date +%m-%d-%Y`
PGPASSWORD=password psql -w -h host -p 5432 -d database -U user -o /tmp/folder/file-$NOWDATE.csv <<EOF
Query is here
# remove the first 2 lines of the report as they are headers
sed -i '2d' /tmp/folder/file-$NOWDATE.csv
uuencode /tmp/folder/file-$NOWDATE.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com
Probé la parte mailx con:
uuencode /tmp/folder/file-$NOWDATE.csv /tmp/folder/file-$NOWDATE.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com
y
uuencode /tmp/folder/file-$NOWDATE.csv file-$NOWDATE.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com
Entonces, el problema que tengo es que muestra este error cuando ejecuto el archivo .sh.
uuencode: fopen-ing /tmp/folder/file-01-11-2011.csv: Unknown system error
Solución
NOWDATE=`date +%m-%d-%Y`
Depende de usted, pero considere usar el formato ISO-8601, AAAA-MM-DD (%Y-%m-%d
). Entre otras ventajas, se clasifica muy bien.
# remove the first 2 lines of the report as they are headers
sed -i '2d' /tmp/folder/file-$NOWDATE.csv
Esto no elimina las dos primeras líneas, solo elimina la segunda línea. Cambie '2d'
a '1,2d'
(pero consulte a continuación).
Tenga en cuenta que esto modifica el archivo en su lugar.
uuencode /tmp/folder/file-$NOWDATE.csv | mailx [...]
Si uuencode
recibe solo un nombre de archivo, lee de la entrada estándar y pone el nombre en su salida. Su siguiente texto, "Probé la parte mailx con:" ..., indica que probablemente esté al tanto de esto, pero no nos ha mostrado el código que soluciona ese problema más que en fragmentos.
El mensaje de error que recibe:
uuencode: fopen-ing /tmp/folder/file-01-11-2011.csv: Unknown system error
no es lo que obtendría normalmente si el archivo no existe. No sé qué podría causar un "Error de sistema desconocido" como ese.
Pero aquí hay una alternativa que (a) es un poco más limpia en mi humilde opinión, y (b) no requiere uuencode
para intentar leer el archivo:
#!/bin/bash
NOWDATE=`date +%m-%d-%Y` # but %Y-%d-%m is better
DIR=/tmp/folder
FILE=file-$NOWDATE.csv
RECIPIENT=user@example.com
PGPASSWORD=password psql -w -h host -p 5432 -d database -U user -o $DIR/$FILE <<EOF
... Query is here
EOF
tail -n +3 $DIR/$FILE | uuencode $FILE | \
mailx -s "Accounts No Credit Card Report for '$NOWDATE'" $RECIPIENT
Otros consejos
Si el problema es con uuencode ... ¿por qué no puedes probar la opción mailx -a que también puede adjuntar los archivos al correo? Consulte este enlace para obtener más información.
Tuve el mismo problema.Un script bash que ejecuta la consulta, guarda el archivo csv y lo envía por correo.En mi caso me dio la uuencode: fopen-ing /tmp/folder/file-01-11-2011.csv: Unknown system error
Cuando ejecuté el script usando el shell ksh, funcionó perfectamente sin ningún problema.Como esto - ksh script.sh
Éste es sólo otro indicador.En caso de que uuencode dé un error, intente ejecutarlo usando ksh;podría funcionar para ti.