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 unbsd-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 llamas-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 compatibilidadmail
/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*
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 adjunto en los ejemplos de esa página.
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 SendEmail, que fue creado para este escenario. Está empaquetado para Ubuntu, así que asumo que está disponible.
sendemail -f [email protected] -t [email protected] -m "Here are your files!" -a file1.jpg file2.zip
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]