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

mysqldump 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 los empaqueta como un archivo comprimido .tar. El siguiente paso que quiero lograr es enviar ese archivo tar a través de correo electrónico a un servidor de correo electrónico remoto para su custodia. Pude enviar un script al script sin procesar del cuerpo adjuntando el archivo de texto de respaldo a mailx manera:

 $ cat mysqldbbackup.sql | mailx backup@email.com 

cat hace eco del texto del archivo de copia de seguridad que se canaliza al progtwig mailx con la dirección de correo electrónico del destinatario pasado como argumento.

Si bien esto logra lo que necesito, creo que podría ser un paso mejor. ¿Hay alguna manera, mediante scripts de shell o de otro tipo, de enviar el archivo comprimido .tar a un mensaje de correo electrónico saliente como archivo adjunto ? Esto evitaría 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.

Ninguno de los perros me funcionaba. Pensaba que la dirección de correo electrónico era parte del archivo adjunto. Tuve que hacer:

 echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com 

O, fallando mutt:

 gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com 

Al mirar man mailx , el progtwig mailx no tiene una opción para adjuntar un archivo. Puede usar otro progtwig como mutt.

 echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com 

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 backup@email.com < message.txt 

o también:

 cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com 

Yo uso mpack.

 mpack -s subject file user@example.com 

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

 mpack -s subject /dev/stdin loser@example.com < file 

Yo uso SendEmail, que fue creado para este escenario. Está empaquetado para Ubuntu, así que supongo que está disponible

sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip

http://caspian.dotconf.net/menu/Software/SendEmail/

  echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com 

Una vez escribí esta función para ksh en Solaris (usa Perl para la encoding 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=; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)" print -- "" fi print -- "--${boundary}--" } | /usr/lib/sendmail -oi -t } 

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

 mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt 

Envíe un correo electrónico de cuerpo plano con un adjunto de texto plano con mailx:

 ( /usr/bin/uuencode attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com 

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' youremail@gmail.com 

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

  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.  

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 cuerpo HTML con un archivo PDF adjunto con sendmail:

Asegúrate de tener instalado ksh: yum info ksh

Asegúrese de tener sendmail instalado y configurado.

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 principal: /home/el

Coloque el siguiente código en test.sh :

 #!/usr/bin/ksh export MAILFROM="el@defiant.com" export MAILTO="youremail@gmail.com" 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 nombre de archivo.

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

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

 this is some bold text 

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

Ejecute el script ./test.sh

Verifique la bandeja de entrada de su correo electrónico, el texto debe estar en formato HTML y el archivo pdf interpretado automáticamente como un archivo binario. Tenga cuidado de no utilizar esta función más de 15 veces al día, incluso si se envía los correos electrónicos a usted mismo, los filtros de correo no deseado en gmail pueden poner en la lista negra un dominio arrojando correos electrónicos sin darle la opción de dejarlos pasar. Y verá que esto ya no funciona, o solo deja pasar el archivo adjunto, o el correo electrónico no aparece. Si tiene que hacer muchas pruebas al respecto, difúndalas durante días o lo etiquetarán como spammer y esta función ya no funcionará.

Aquí hay varias respuestas que sugieren mail o mailx por lo que esto es más un fondo para ayudarlo a interpretarlas en contexto.

Notas históricas

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 entrar aquí en su genealogía completa. Baste decir que hay muchos progtwigs 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 única base de código que pueda identificarse inequívocamente como “el” mail .

Sin embargo, uno de los contendientes a esa posición es sin duda “Berkeley Mail”, que originalmente se llamaba Mail con mayúscula M en 2BSD (1978); pero en 3BSD (1979), también reemplazó el comando de mail minúsculas, lo que generó una nueva confusión. SVR3 (1986) incluyó un derivado que se llamó mailx . La x supuestamente se agregó para hacerlo único y distinto; pero esto también ha sido copiado, reaplicado y mutilado, de modo que no hay una única versión individual que sea definitiva.

En el pasado, el estándar de facto para enviar binarios a través del correo electrónico era uuencode . Todavía existe, pero tiene numerosos problemas de usabilidad; si es posible, debe enviar archivos adjuntos MIME en su lugar, a menos que específicamente se esfuerce por comunicarse con fines de la década de 1980.

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 que no sean texto sin formato en un juego de caracteres único que solo es adecuado para un subconjunto de inglés (y, según nos cuentan, Hawai’ian ) Esto introdujo soporte para mensajes de varias partes, internacionalización, tipos de contenido enriquecido, etc., y rápidamente ganó fuerza durante la década de 1990.

(Las notas de Heirloom mail / mailx history fueron de lo más útiles al componer esto, y sin duda vale la pena leerlas si te gusta este tipo de cosas).

Ofertas actuales

A partir de 2018, Debian tiene tres paquetes que incluyen un comando de mail o mailx . (Puede 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 señalando Debian como una recomendación, es lo que uso, por lo que estoy familiarizado con él, y proporciona un medio para distinguir inequívocamente las distintas alternativas al referirse a sus respectivos nombres de paquetes. Obviamente también es la distro de que Ubuntu obtiene estos paquetes.)

  • bsd-mailx es un bsd-mailx relativamente simple que no parece ser compatible con el envío de archivos adjuntos MIME. Consulte su página de manual y tenga en cuenta que esta es la que esperaría encontrar en un sistema * BSD, incluido MacOS, de forma predeterminada.
  • heirloom-mailx ahora se llama s-nail y admite enviar archivos adjuntos MIME con -a . Vea 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 pueda depender de un paquete algo complejo, la forma más sencilla de enviar de manera portable los archivos adjuntos MIME es usar mutt .

Otra alternativa: Swaks (Swiss Army Knife para 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 

metamail tiene la herramienta metasend

 metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b 

solía

 echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@bc" 

y esto funcionó bien para mí …

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

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 Recipient@myemail.com This is the content of my msg. . 

el camino más corto para mí es

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

entonces para su ejemplo, será

 file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com 

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

Desde la máquina fuente

 mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com 

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 

Solo para agregar mis 2 centavos, escribiría mi propio script PHP:

http://php.net/manual/en/function.mail.php

Hay muchas maneras de hacer el archivo adjunto en los ejemplos en esa página.

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 forma, puede usar los comandos de git push , y todas las versiones se almacenarán de forma comprimida y organizada.

Así es como lo estoy haciendo con un gran archivo de registro en CentOS:

 MAIL="`whereis mail | awk '{print $2}'`" WHOAMI="`whoami`" HOSTNAME="`hostname`" EMAIL"your@email.address" 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 

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

 sendmail recipient@example.com < message.txt 

usando el comando mailx

  echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com 

usando sendmail

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

Una cosa más sobre mutt : de forma predeterminada, usa su 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”

Use este archivo con la opción de línea de comando -F .

Si 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*