Enviar un correo desde un script de shell de Linux


120

Quiero enviar un correo electrónico desde un script de Shell de Linux. ¿Cuál es el comando estándar para hacer esto? ¿Necesito configurar nombres de servidor especiales?


8
Intente preguntar en Superusuario [ superuser.com ] o, mejor aún, Unix y Linux SE [ unix.stackexchange.com ].
Dan Moulding

Respuestas:


119

Si el servidor está bien configurado, por ejemplo, tiene un MTA en funcionamiento, puede usar el comando mail.

Por ejemplo, para enviar el contenido de un archivo, puede hacer esto:

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail para más detalles.


7
¿Qué significa 'mta' aquí, hay un nombre completo o un enlace? Como principiante, eso es lo que quiero saber. Como carezco de experiencia para hacer eso.
Zen

5
@Zen MTA significa agente de transporte de correo. postfix, sendmail, qmail, etc.
Francesco Laurita

@Zen en su mayor parte, puede considerar que MTA significa servidor SMTP o IMAP.
user151841

1
Si no está seguro de cómo instalar / configurar y está en Ubuntu: sudo apt-get install mailutilsy seleccione el sitio de Internet: El correo se envía y se recibe directamente usando SMTP. .
user1717828

86

Si desea que un enfoque sencillo y limpio en bash, y usted no desea utilizar cat, echoetc., la manera más simple sería:

mail -s "subject here" email@address.com <<< "message"

<<<se utiliza para redirigir la entrada estándar. Ha sido parte de bash durante mucho tiempo.


6
echo -e "Algunos \ nMultiline y tab \ t msg" | mail -s "asunto" your@email.com
Pipo

cat << END...END | mail -s "subject" test@example.com
ulidtko

¡Oye, esto funcionó muy bien para mí, gracias! ¿Cómo puedo especificar varias direcciones a las que enviar?
E.Owen

1
@ E.Owen Puede usar la opción -t para enviar a varias direcciones separadas por espacios
Jon

25

Si tanto exim como ssmtp se están ejecutando, puede tener problemas. Entonces, si solo desea ejecutar un MTA simple, solo para tener un cliente smtp simple para enviar notificaciones por correo electrónico para solicitar asistencia, primero debe purgar el MTA eventualmente preinstalado como exim o postfix y reinstalar ssmtp.

Entonces es bastante sencillo, configurar solo 2 archivos (revaliases y ssmtp.conf) - Ver ssmtp doc -, y el uso en su script bash o bourne es como:

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

Obviamente, no olvide abrir la salida de su firewall al puerto smtp (25).


¿Dónde puedo cambiar el número de puerto en este script? En mi servidor, el puerto smtp funciona sobre 8181.
manix

No haría esto en este caparazón, de lo contrario, tarde o temprano te quedarás atrapado. Puede hacerlo en el archivo de configuración: consulte unix.stackexchange.com/a/132731
hornetbzz

1
¿Por qué se ingresan nuevas líneas si hago un eco simple $ MAIL_TXT?
KernelPanic

1
@Marko: Por favor, vea man echo con la opción -e: habilite la interpretación de los escapes de barra invertida
hornetbzz

Lo siento, se
perdió el

10

Otra opción para en un script bash:

mailbody="Testmail via bash script"
echo "From: info@myserver.test" > /tmp/mailtest
echo "To: john@mywebsite.test" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • El archivo /tmp/mailtestse sobrescribe cada vez que se utiliza este script.
  • La ubicación de sendmail puede variar según el sistema.
  • Al usar esto en un script cron, debe usar la ruta absoluta para el comando sendmail.

1
votó en contra porque más de un proceso podría llamar al script al mismo tiempo. Esto podría causar un archivo tmp dañado / incorrecto. Además, el archivo / tmp no se sobrescribe cada vez que se usa; en realidad, crece con cada correo electrónico que contiene todos los correos electrónicos anteriores. No está bien.
Taterhead

1
La primera escritura en / tmp / mailtest es una sobrescritura, por lo que eliminará lo que estaba allí anteriormente. Aún así, este método no es ideal por las otras razones que ha descrito.
Simon

8

Generalmente, querrá usar el mailcomando para enviar su mensaje usando el MTA local (que lo entregará usando SMTP al destino o simplemente lo reenviará a algún servidor SMTP más poderoso, por ejemplo, en su ISP). Si no tiene un MTA local (aunque es un poco inusual que un sistema tipo UNIX omita uno), puede usar algún MTA minimalista como ssmtp .

ssmtpes bastante fácil de configurar. Básicamente, solo necesitará especificar dónde está el servidor SMTP de su proveedor:

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

Otra opción es usar uno de los innumerables scripts que simplemente se conectan al servidor SMTP directamente e intentan publicar un mensaje allí, como Smtp-Auth-Email-Script , smtp-cli , SendEmail , etc.


"ssmtp" estaba instalado en la máquina, así que no pude probarlo, pero gracias de todos modos
appshare.co

5

Admitiendo que desea utilizar algún servidor smtp, puede hacer:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

Cambie somehost, someporty someaccount@somedomaina los valores reales que usaría. En este ejemplo no se realiza encriptación ni autenticación.


¿Y qué hacer si mailxno está instalado?
finalmente,

2

El mailcomando hace eso (quién lo hubiera adivinado ;-). Abra su shell e ingrese man mailpara obtener la página del manual del mailcomando para todas las opciones disponibles.


2
Hice eso, pero no hay opción para especificar un servidor para usar
appshare.co

1
Eso es parte de la configuración de su agente de transferencia de correo local, por ejemplo, Sendmail o Postfix.
DarkDust

2

Ni siquiera necesitas un MTA. El protocolo SMTP es lo suficientemente simple como para escribirlo directamente en su servidor SMTP. Incluso puede comunicarse a través de SSL / TLS si tiene instalado el paquete OpenSSL. Consulte esta publicación: https://33hops.com/send-email-from-bash-shell.html

Lo anterior es un ejemplo de cómo enviar correos electrónicos de texto / html que funcionarán desde el primer momento. Si desea agregar archivos adjuntos, la cosa puede volverse un poco más complicada, deberá codificar en base64 los archivos binarios e incrustarlos entre los límites. Este es un buen lugar para comenzar a investigar: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

En Linux, la utilidad de correo se puede utilizar para enviar archivos adjuntos con la opción "-a". Revise las páginas de manual para leer sobre la opción. Por ejemplo, el siguiente código enviará un archivo adjunto:

mail -s "ESTE ES SUJETO" -a archivo adjunto.txt nombre@dominio.com <<< "Hola amigo, busca informes de fallas".


Bienvenido a SO. Gracias por publicar una respuesta. Lea la información sobre cómo escribir una buena respuesta y modifíquela en consecuencia. Enjoy SO ;-)
ZF007

2

ENVIAR CORREO DE LINUX A GMAIL

USANDO POSTFIX

1: instalar software

Debian y Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

Fedora:

dnf update && dnf install postfix mailx

CentOS:

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

Arch Linux:

pacman -Sy postfix mailutils

FreeBSD:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

en configuración, seleccione el soporte SASL

make install clean

pkg install mailx

2. Configurar Gmail

/ etc / postfix. Cree o edite el archivo de contraseña:

vim /etc/postfix/sasl_passwd

Estoy usando vim, puedes usar cualquier editor de archivos como nano, cat .....

> Ubuntu, Fedora, CentOS, Debian, OpenSUSE, Arch Linux:

Agrega esto

donde el usuario reemplaza con su nombre de correo y contraseña es su contraseña de gmail

[smtp.gmail.com]:587    user@gmail.com:password

Guarde y cierre el archivo y hágalo accesible solo por root: porque es un contenido sensible que contiene su contraseña

chmod 600 /usr/local/etc/postfix/sasl_passwd

> FreeBSD:

directorio / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Agrega la línea:

[smtp.gmail.com]:587    user@gmail.com:password

Guárdelo y hágalo accesible solo por root:

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Configuración de postfix

archivo de configuración main.cf

6 parámetros que debemos establecer en el Postfix

Ubuntu, Arch Linux, Debian:

editar

 vim /etc/postfix/main.cf

modificar los siguientes valores:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_options que en la configuración se establecerán en vacío , para garantizar que no se utilicen opciones de seguridad incompatibles con Gmail .

guardar y cerrar

como para

OpenSUSE:

vim /etc/postfix/main.cf

modificar

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

también requiere la configuración del archivo master.cf

modificar:

vim /etc/postfix/master.cf

como al descomentar esta línea (eliminar #)

#tlsmgr unix - - n 1000? 1 tlsmg

guardar y cerrar

Fedora, CentOS:

vim /etc/postfix/main.cf

modificar

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD:

vim /usr/local/etc/postfix/main.cf

modificar:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

guardar y cerrar esto

4. Procesar archivo de contraseña:

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

postmap /etc/postfix/sasl_passwd

para FreeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Reiniciar postfix

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

systemctl restart postfix.service

para FreeBSD:

service postfix onestart
nano /etc/rc.conf

añadir

postfix_enable=YES

guardar y luego ejecutar para comenzar

service postfix start

5. Habilite "Aplicaciones menos seguras" en Gmail con la ayuda del vínculo siguiente

https://support.google.com/accounts/answer/6010255

6. Envíe un correo electrónico de prueba

mail -s "subject" recever@domain.com

presione enter

agregue el cuerpo del correo como desee, presione enter y luego presione ctrl + d para la terminación adecuada

si no funciona, vuelva a comprobar todos los pasos y compruebe si habilita la " aplicación menos segura" en su gmail

luego reinicie postfix si modifica algo en eso

para el script de shell, cree el archivo .sh y agregue el comando de 6 pasos como requisito

por ejemplo solo para una muestra

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

La secuencia de comandos envía un correo electrónico cuando el uso del disco supera el porcentaje especificado por la variable UMBRAL (80% aquí).


¿No debería el nombre de esta respuesta ser "ENVIAR CORREO DESDE LINUX A recever@domain.com A TRAVÉS DE GMAIL"?
Cameron Hudson

1

puede utilizar el comando 'email' o 'emailx'.

(1) $ vim /etc/mail.rc # o # vim /etc/nail.rc

set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

Porque si no se envía desde una cuenta autorizada, el correo electrónico llegará a la lista de correo basura.

(2) $ echo "¡Por favor recuerde eliminar los temas ons no utilizados!" | mail -s "temas de desperdicio" -a a.txt developer@xxx.com #send to group user 'developer@xxxx.com'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.