Enviando un mail de gmail desde la línea de comandos

Enviar mails desde la línea de comandos de Linux es bastante sencillo. Hay un comando llamado “mail” que hace esto sin problemas. Si nos instalamos un servidor de correo SMTP como postfix, ya lo tendremos.

El problema es que estaremos enviando mails desde un servidor de correo cuyo dominio (el que hayamos puesto nosotros, algo como “micasa.com”) o bien no existe o si lo hace no está a nuestro nombre. Si enviáis unos pocos e-mails al día puede que todo vaya bien pero, si enviáis más correos, esto puede ocasionar problemas (por ejemplo, vuestro proveedor de servicio a Internet os pegaría un toque por posible SPAM).

Lo mejor es hacer las cosas bien hechas para evitar problemas (*); en este caso, lo suyo es enviar correos legítimos, desde una cuenta “oficial”, de un dominio “oficial” (registrado, vamos). Vamos, que si enviamos un correo desde loquesea@gmail.com, ese correo debería partir del servidor gmail.com, es decir, el servidor de correo de Google.

Para hacer esto desde línea de comandos os recomiendo el comando “mailx”, que además nos permite enviar adjuntos.

Vamos a ver cómo usarlo para enviar un mail desde nuestra cuenta de gmail. Lo que vamos a ver es cómo usar mailx para enviar correos desde la línea de comandos usando nuestra cuenta de gmail (a través, por supuesto, de los servidores de Google).

Lo que tenemos que hacer es especificar los distintos parámetros (servidor, puerto, usuario, password…) con la opción -S. Nos quedaría algo así:

mailx -v -s "ASUNTO" -S smtp=smtp.gmail.com:587 -S smtp-auth-user=VUESTRO_USUARIO_DE_GOOGLE@gmail.com -S smtp-use-starttls -S smtp-auth-password=VUESTRO_PASSWORD -S from=VUESTRO_USUARIO_DE_GOOGLE@gmail.com MAIL_DESTINO

Al ejecutar esto os dejará escribir el cuerpo del mensaje. Para finalizar el mail, dar un par de veces a Intro, escribid un punto y darle de nuevo a Intro (es la forma de decirle a mailx que habéis terminado de redactar el mail).

Si queréis hacerlo menos interactivo podéis pasarle el cuerpo del mensaje así:

echo “CUERPO DEL MENSAJE…” | mailx -v -s “ASUNTO”…

Si queréis un cuerpo más completo, con intros y demás, podéis pasarle un archivo (tanto como cuerpo de mensaje como de asunto). También podéis registrar los logs de salida y error por si algo fallara poder estudiar cuál ha sido el problema. Un script que contemple ambas cosas podría quedar así:

DATE=`date +%Y-%m-%d--%H-%M`
if [ $# = '0' ]; then
     echo send_gmail FILE_SUBJECT FILE_BODY \[ FILE_ATTACH \]
elif [ $# > '1' ]; then
     SUBJECT=`cat $1`
     if [ $2 ]; then
        BODY=`cat $2`
     else
        BODY="."
     fi
     ATTACH=$3
     if [ $ATTACH ]; then
        echo $BODY | mailx -v -s $SUBJECT -a $ATTACH -S smtp=smtp.gmail.com:587 -S smtp-auth-user=VUESTRO_USUARIO_DE_GOOGLE@gmail.com -S smtp-use-starttls -S smtp-auth-password=VUESTRO_PASSWORD -S from=VUESTRO_USUARIO_DE_GOOGLE@gmail.com MAIL_DESTINO >/tmp/mail_$DATE.log 2>/tmp/mail_$DATE.err
     else
        echo $BODY | mailx -v -s $SUBJECT -S smtp=smtp.gmail.com:587 -S smtp-auth-user=VUESTRO_USUARIO_DE_GOOGLE@gmail.com -S smtp-use-starttls -S smtp-auth-password=VUESTRO_PASSWORD -S from=VUESTRO_USUARIO_DE_GOOGLE@gmail.com MAIL_DESTINO >/tmp/mail_$DATE.log 2>/tmp/mail_$DATE.err
     fi
fi

Lo he hecho rápidamente, así que se puede mejorar mucho a la hora de tratar los parámetros. De todas formas, así es perfectamente válido (doy fe ;-). A continuación explico cómo funciona.

Lo que hace el script es coger la fecha del sistema (en la variable DATE) para que nuestros archivos de log la tengan incorporada en el nombre de archivo (así es más fácil identificar de cuándo son).

Después, si el número de parámetros es 0 muestro un mensaje de uso correcto del script (cuyo nombre es “send_gmail” en este ejemplo), que básicamente es, el nombre del script, el fichero que lleva el subject del mensaje, el fichero que lleva el cuerpo del mensaje y, opcionalmente, el archivo que queremos adjuntar.

Si el número de parámetros es mayor que 1 (**) el asunto del mensaje (SUBJECT) es el contenido del primer argumento. Si existe un segundo parámetro sería el fichero que contendría el cuerpo del mensaje. Si no existe segundo parámetro se pone un “.” (podemos poner un espacio o una palabra por defecto) porque si no ponemos nada fallará el script.

Si hay un tercer argumento ejecutaremos el comando que hemos visto antes con la opción “-a $ATTACH”, que incluirá dicho archivo como adjunto.

Esto os puede venir de perlas para cosas como enviar mails al iniciar el equipo para indicar que está operativo (como vimos en el artículo anterior “Ejecutar scripts al inicio de Linux”), para enviar mails de notificación desde nagios o, como veremos en un artículo posterior, para hacer backups de archivos rápida y cómodamente.

(*) Esto se debería aplicar a todos los aspectos de la vida. Si todo el mundo lo hiciera… irían mejor las cosas, nor?
(**) como mínimo hemos introducido subject y body; si introducimos 3, el tercero es el fichero a adjuntar; a partir del tercer parámetro se ignoran si los hubiera.

4 pensamientos en “Enviando un mail de gmail desde la línea de comandos

  1. Angel Pablo

    Espléndido post. Realmente brillante.
    Mucho ánimo con la página; merece la pena.

  2. Cristian

    Hola Antonio,

    Primero felicitarte por tu pagina, muy buena. Una pregunta, me podrias decir de que manera puedo comprobar que mi usuario en concreto puede utilizar el comando mailx desde una maquina SunOS 5.10.

    Algun directorio que deba comprobar su eistencia? algun comando?…el caso es que si ejecuto la siguiente sentencia, por ejemplo: tail -5 /usr/local/log | mailx -s “Correo Prueba” xxxxx@xxxcompany.com

    Y no arroja ningun error pero tamcpo recibo correo alguno.

    Gracias de antemano.

    Un saludo.

    1. admin Autor

      Hola, Cristian.

      Cuando envías un e-mail desde comandos tienes dos opciones básicas: usar una mta local (postfix o sendmail, por ejemplo) o usar una mta remota. Si quieres enviar un email al exterior (a una cuenta tuya, por ejemplo), tienes que usar una mta remota a no ser que el equipo que me hablas sea el servidor de correo predefinido en el registro MX de tu DNS, que no creo. Por tanto, no debes enviar un e-mail de la forma que me indicas a no ser que quieras que metan tu IP pública en listas negras de SPAM.

      Por tanto, busca parámetros en el mailx similares a los que te indico en el artículo (para especificar el servidor smtp, user, password, etc.), ya que tienes que validarte contra ese servidor.

      Hace tiempo que no uso sistemas Sun y no sabría concretarte exatamente qué parametros debes usar, ya que la versión entre distintos sistemas puede variar, pero no debe ser muy distinto.

      Mucha suerte!

      Muchas gracias por el comentario.

      Salu2, Mario.

Los comentarios están cerrados.