Enviar emails desde script utilizando una cuenta de GMail


En varias ocasiones es necesario enviar emails desde un servidor, ya sea para alertar sobre algún evento o mandar algún tipo de informe, normalmente se hace instalando un postfix local y enviando el mail con el comando mail pero este método tiene algunos inconvenientes:

  • Si se envían muchos emails la ip del server terminará en alguna blacklist.
  • Tenemos un servicio adicional funcionando en nuestro server con lo que implica en cuanto a recursos consumidos y problemas de seguridad.

La solución pasa por emplear una cuenta de GMail externa.

Vamos a utilizar un pequeño script en Go:

emerge -av dev-lang/go

Instalamos la librería gomail:

mkdir go
export GOPATH=/root/go
go get gopkg.in/gomail.v2

Programamos el script:

vi smtp-gmail-send.go

package main

import (
    "os"
    "strings"
    "crypto/tls"
    "gopkg.in/gomail.v2"
)

func main() {
    from := os.Args[1]
    toRaw := os.Args[2]
    pass := os.Args[3]
    subject := os.Args[4]
    body := os.Args[5]

    d := gomail.NewDialer("smtp.gmail.com", 587, from, pass)
    d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

    m := gomail.NewMessage()
    m.SetHeader("From", from)
    m.SetHeader("Subject", subject)
    m.SetBody("text/html", body)

    toSplitted := strings.Split(toRaw, " ")
    for _,to := range toSplitted {
        m.SetHeader("To", to)
        if err := d.DialAndSend(m); err != nil {
            panic(err)
        }
    }
}

Lo ejecutamos primero para comprobar que no dé problemas:

go run smtp-gmail-send.go USERNAME@gmail.com "DEST1@gmail.com DEST2@gmail.com" PASSWORD "testSubject: SUBJECT:SUBJECT" "BODY:BODY"

Lo compilamos:

go build -o /bin/smtp-gmail-send smtp-gmail-send.go

No soy ningún experto en Go ni mucho menos, así que seguramente se pueda mejorar, por ejemplo el envío de mails a varios destinatarios se podría hacer en una sola línea sin tener que ejecutar el bucle.

Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Autor: kr0m -- 29/03/2018 19:33:56