terminó script puede proceso postfix mensaje mail estado enviar diferente desde correo consola con comando cero archivos adjunto adjuntar linux email command-line

script - ¿Cómo envío un archivo como un archivo adjunto de correo electrónico utilizando la línea de comandos de Linux?



enviar mail desde bash (26)

Envíe un correo electrónico con texto simple con un archivo adjunto de texto simple con mailx:

( /usr/bin/uuencode attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s ''Subject'' [email protected]

A continuación se muestra el mismo comando que el anterior, sin las nuevas líneas.

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s ''Subject'' [email protected]

Asegúrese de tener un archivo /home/el/attachfile.txt definido con este contenido:

<html><body> Government discriminates against programmers with cruel/unusual 35 year prison sentences for making the world''s information free, while bankers that pilfer trillions in citizens assets through systematic inflation get the nod and walk free among us. </body></html>

Si no tiene uuencode, lea esto: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

En Linux, envíe un correo electrónico HTML con un archivo adjunto PDF con sendmail:

Asegúrate de tener instalado ksh: yum info ksh

Asegúrate de tener instalado y configurado sendmail.

Asegúrese de tener uuencode instalado y disponible: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

Cree un nuevo archivo llamado test.sh y póngalo en su directorio de inicio: /home/el

Ponga el siguiente código en test.sh :

#!/usr/bin/ksh export MAILFROM="[email protected]" export MAILTO="[email protected]" export SUBJECT="Test PDF for Email" export BODY="/home/el/email_body.htm" export ATTACH="/home/el/pdf-test.pdf" export MAILPART=`uuidgen` ## Generates Unique ID export MAILPART_BODY=`uuidgen` ## Generates Unique ID ( echo "From: $MAILFROM" echo "To: $MAILTO" echo "Subject: $SUBJECT" echo "MIME-Version: 1.0" echo "Content-Type: multipart/mixed; boundary=/"$MAILPART/"" echo "" echo "--$MAILPART" echo "Content-Type: multipart/alternative; boundary=/"$MAILPART_BODY/"" echo "" echo "--$MAILPART_BODY" echo "Content-Type: text/plain; charset=ISO-8859-1" echo "You need to enable HTML option for email" echo "--$MAILPART_BODY" echo "Content-Type: text/html; charset=ISO-8859-1" echo "Content-Disposition: inline" cat $BODY echo "--$MAILPART_BODY--" echo "--$MAILPART" echo ''Content-Type: application/pdf; name="''$(basename $ATTACH)''"'' echo "Content-Transfer-Encoding: uuencode" echo ''Content-Disposition: attachment; filename="''$(basename $ATTACH)''"'' echo "" uuencode $ATTACH $(basename $ATTACH) echo "--$MAILPART--" ) | /usr/sbin/sendmail $MAILTO

Cambie las variables de exportación en la parte superior de test.sh para reflejar su dirección y nombres de archivo.

Descargue un documento pdf de prueba y póngalo en /home/el llamado pdf-test.pdf

Cree un archivo llamado /home/el/email_body.htm y ponga esta línea en él:

<html><body><b>this is some bold text</b></body></html>

Asegúrese de que el archivo pdf tiene suficientes 755 permisos.

Ejecuta el script ./test.sh

Verifique su bandeja de entrada de correo electrónico, el texto debe estar en formato HTML y el archivo pdf se interpreta automáticamente como un archivo binario. Tenga cuidado de no usar esta función más de 15 veces en un día, incluso si se envía los correos electrónicos a sí mismo, los filtros de correo no deseado en gmail pueden incluir en la lista negra un dominio que arroja correos electrónicos sin darle una opción para dejarlos pasar. Y verás que esto ya no funciona, o solo deja pasar el archivo adjunto, o el correo electrónico no llega. Si tiene que hacer muchas pruebas al respecto, distribúyalos en días o será etiquetado como spammer y esta función no funcionará más.

He creado un script que se ejecuta todas las noches en mi servidor Linux que usa mysqldump para hacer una copia de seguridad de cada una de mis bases de datos MySQL en archivos .sql y empaquetarlos como un archivo comprimido .tar. El siguiente paso que quiero realizar es enviar ese archivo tar a través de correo electrónico a un servidor de correo electrónico remoto para su custodia. He podido enviar el script sin procesar en el cuerpo un correo electrónico al enviar el archivo de texto de la copia de seguridad a mailx así:

$ cat mysqldbbackup.sql | mailx [email protected]

cat repite el texto del archivo de copia de seguridad que se canaliza en el programa mailx con la dirección de correo electrónico del destinatario pasada como un argumento.

Si bien esto cumple con lo que necesito, creo que podría ser un paso mejor. ¿Hay alguna forma, usando scripts de shell o de otra manera, enviar el archivo .tar comprimido a un mensaje de correo electrónico saliente como un archivo adjunto ? Esto vencería el hecho de tener que lidiar con mensajes de correo electrónico muy largos que contienen datos de encabezado y, a menudo, tienen problemas de ajuste de palabras, etc.


''mutt'' funcionó para mí en Ubuntu 16.04:

echo "message body" | sudo mutt -a "/home/ubuntu/file.html" -s "subject" -- [email protected]

Razonamiento:

  • Al intentar usar mail o mailx con -AI recibió un mensaje de error "opción no válida - ''A''".
  • Al intentar usar mail o mailx con -a, recibí un correo electrónico con la ruta al archivo pero no el archivo en el contenido.

De mirar man mailx , el programa mailx no tiene una opción para adjuntar un archivo. Podrías usar otro programa como mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" [email protected]

Las opciones de línea de comando para mutt se pueden mostrar con mutt -h .


Dependiendo de su versión de linux puede llamarse correo. Para citar a @David arriba:

mail -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt

o también:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql [email protected]


Esto es lo que estoy haciendo con un archivo de registro grande en CentOS:

MAIL="`whereis mail | awk ''{print $2}''`" WHOAMI="`whoami`" HOSTNAME="`hostname`" EMAIL"[email protected]" LOGDIR="/var/log/aide" LOGNAME="`basename "$0"`_`date "+%Y%m%d_%H%M"`" # Arhiveerime ning kui hästi, saadame edasi: /bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1 if [ $? -eq 0 ]; then cd ${LOGDIR} # This works too. The message content will be taken from text file below # echo ''Hello!'' >/root/scripts/audit_check.sh.txt # echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL} echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL} /bin/rm "${LOGDIR}/${LOGNAME}.log" fi


Hay varias respuestas aquí que sugieren mail o mailx por lo que este es más un fondo para ayudarlo a interpretar esto en contexto.

Notas historicas

Los orígenes del mail de Unix se remontan a las brumas de la historia temprana de Bell Labs Unix ™ (¿1969?), Y probablemente no podamos esperar entrar en su genealogía completa aquí. Basta con decir que hay muchos programas que heredan el código de o reimplementan (o heredan el código de una reimplementación de) el mail y que no existe una base de código única que pueda identificarse inequívocamente como "el" mail .

Sin embargo, uno de los contendientes a esa posición es ciertamente el "Correo de Berkeley" que originalmente se llamó Mail con una M mayúscula en 2BSD (1978); pero en 3BSD (1979), también reemplazó el comando de mail minúsculas, lo que llevó a una nueva confusión. SVR3 (1986) incluyó un derivado que se llamó mailx . El x fue probablemente agregado para hacerlo único y distinto; pero esto, también, ahora se ha copiado, reimplementado y mutilado para que no haya una única versión individual que sea definitiva.

En el pasado, el estándar de facto para enviar archivos binarios a través del correo electrónico era uuencode . Todavía existe, pero tiene numerosos problemas de usabilidad; si es posible, debería enviar archivos adjuntos MIME, a menos que se esfuerce específicamente por poder comunicarse con el final de los años ochenta.

MIME se introdujo a principios de la década de 1990 para resolver varios problemas con el correo electrónico, incluido el soporte para varios tipos de contenido además del texto sin formato en un solo conjunto de caracteres que solo es realmente adecuado para un subconjunto de inglés (y, según nos dicen, Hawai''ian ). Esto introdujo la compatibilidad con los mensajes de varias partes, la internacionalización, los tipos de contenido enriquecido, etc., y se ganó rápidamente a lo largo de los años noventa.

(Las notas históricas de Heirloom mail / mailx fueron de gran ayuda a la hora de redactar esto, y ciertamente vale la pena leerlas si te gusta ese tipo de cosas).

Ofertas actuales

A partir de 2018, Debian tiene tres paquetes que incluyen un comando mail o mailx . (Puedes buscar Provides: mailx .)

debian$ aptitude search ~Pmailx i bsd-mailx - simple mail user agent p heirloom-mailx - feature-rich BSD mail(1) p mailutils - GNU mailutils utilities for handling mail

(No estoy destacando a Debian como una recomendación; es lo que uso, por lo que estoy familiarizado con él; y proporciona un medio para distinguir las distintas alternativas de forma inequívoca al referirse a sus respectivos nombres de paquetes. Obviamente, también es la distribución). que Ubuntu obtiene estos paquetes.)

  • bsd-mailx es un bsd-mailx relativamente simple que no parece admitir el envío de archivos adjuntos MIME. Consulte la página del manual y tenga en cuenta que este es el que esperaría encontrar en un sistema * BSD, incluido MacOS, de forma predeterminada.
  • heirloom-mailx ahora se llama s-nail y admite el envío de archivos adjuntos MIME con -a . Ver su página de manual y más generalmente el proyecto Heirloom.
  • mailutils aka GNU Mailutils incluye un contenedor de compatibilidad mail / mailx que admite el envío de archivos adjuntos MIME con -A

Con estas preocupaciones, si necesita que su código sea portátil y puede depender de un paquete algo complejo, la forma más sencilla de enviar archivos adjuntos MIME es usar mutt .


Ninguno de los mutt trabajó para mí. Estaba pensando que la dirección de correo electrónico era parte del adjunto. Tuve que hacer:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]


No es un método para enviar correos electrónicos, pero puede usar un servidor Git en línea (por ejemplo, Bitbucket o un servicio similar) para eso.

De esta manera, puede usar los comandos git push , y todas las versiones se almacenarán de forma comprimida y organizada.


O, fallido mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" [email protected]


Otra alternativa - Swaks (Swiss Army Knife for SMTP).

swaks -tls / --to ${MAIL_TO} / --from ${MAIL_FROM} / --server ${MAIL_SERVER} / --auth LOGIN / --auth-user ${MAIL_USER} / --auth-password ${MAIL_PASSWORD} / --header "Subject: $MAIL_SUBJECT" / --header "Content-Type: text/html; charset=UTF-8" / --body "$MESSAGE" / --attach mysqldbbackup.sql


Puede utilizar mutt para enviar el correo electrónico con archivo adjunto

mutt -s "Backup" -a mysqldbbackup.sql [email protected] < message.txt


Si el archivo es texto, puede enviarlo más fácilmente en el cuerpo como:

sendmail [email protected] < message.txt


Si el mutt no funciona o no está instalado, intente esto-

*#!/bin/sh FilePath=$1 FileName=$2 Message=$3 MailList=$4 cd $FilePath Rec_count=$(wc -l < $FileName) if [ $Rec_count -gt 0 ] then (echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList fi*



Una cosa más acerca de mutt : por defecto usa tu dirección y nombre en el campo "De:". Si no es lo que necesita, puede crear un archivo muttrc alternativo que contenga una cadena como esta: set from = "My mail daemon"

Utilice este archivo con la opción de línea de comandos -F .


Una vez escribí esta función para ksh en Solaris (usa Perl para la codificación base64):

# usage: email_attachment to cc subject body attachment_filename email_attachment() { to="$1" cc="$2" subject="$3" body="$4" filename="${5:-''''}" boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_" { print -- "To: $to" print -- "Cc: $cc" print -- "Subject: $subject" print -- "Content-Type: multipart/mixed; boundary=/"$boundary/"" print -- "Mime-Version: 1.0" print -- "" print -- "This is a multi-part message in MIME format." print -- "" print -- "--$boundary" print -- "Content-Type: text/plain; charset=ISO-8859-1" print -- "" print -- "$body" print -- "" if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then print -- "--$boundary" print -- "Content-Transfer-Encoding: base64" print -- "Content-Type: application/octet-stream; name=$filename" print -- "Content-Disposition: attachment; filename=$filename" print -- "" print -- "$(perl -MMIME::Base64 -e ''open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))'' $filename)" print -- "" fi print -- "--${boundary}--" } | /usr/lib/sendmail -oi -t }


Usualmente solo uso el comando de correo en RHEL. He intentado mailx y es bastante eficiente.

mailx -s "Sending Files" -a First_LocalConfig.conf -a Second_LocalConfig.conf [email protected] This is the content of my msg. .



Yo uso mpack.

mpack -s subject file [email protected]

Desafortunadamente, mpack no reconoce ''-'' como un alias para stdin. Pero el siguiente trabajo, y se puede envolver fácilmente en un alias (shell) o un script:

mpack -s subject /dev/stdin [email protected] < file


el camino mas corto para mi es

file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address

así que para tu ejemplo será

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" [email protected]

Lo bueno es que puedo recordarlo con Ctrl+r para enviar otro archivo ...


metamail tiene la herramienta metasend

metasend -f mysqlbackup.sql.gz -t [email protected] -s Backup -m application/x-gzip -b


solía

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "[email protected]"

y esto me funcionó bien ...


mailx tiene una opción -a ahora para adjuntos.


De la máquina fuente

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail [email protected]

En la máquina de destino. Guarde el cuerpo del correo recibido como db.sql.gz.b64 ; entonces..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf


usando el comando mailx

echo "Message Body Here" | mailx -s "Subject Here" -a file_name [email protected]

usando sendmail

#!/bin/ksh fileToAttach=data.txt `(echo "To: [email protected]" echo "Cc: [email protected]" echo "From: Application" echo "Subject: your subject" echo your body uuencode $fileToAttach $fileToAttach )| eval /usr/sbin/sendmail -t `;


echo ''These are contents of my mail'' | mailx -s ''This is my email subject'' -a /path/to/attachment_file.log [email protected]